Skip to content

Commit 7dd602d

Browse files
authored
fix: Remove redundant kernel promise ref count increment (#565)
While doing preliminary research to begin expanding our integration test suite in `packages/kernel-test`, we discovered that the refcounts for an object in `garbage-collection.test.ts` seemed too high by a count of 1 or 2. As it turned out, they were definitely at least off by one, because we were redundantly incrementing the refcounts of kernel promise data slots in `KernelStore.resolveKernelPromise()`. These are already incremented in `KernelQueue.resolvePromise()`, which calls `resolveKernelPromise()`. With this change, we keep the former and abolish the latter. We also include some changes that were made in the course of debugging, that may prove generally helpful. This includes: - A handful of `console.debug()` calls that help when debugging refcounts. - Logging an error if `Kernel.reset()` fails. Finally, we remove some incidental tooling cruft from `kernel-test`.
1 parent 9dbfe55 commit 7dd602d

25 files changed

Lines changed: 71 additions & 113 deletions

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"build:clean": "yarn clean && yarn build",
1717
"build:docs": "yarn workspaces foreach --all --exclude @ocap/monorepo --exclude @ocap/extension --parallel --interlaced --verbose run build:docs",
1818
"build:source": "ts-bridge --project tsconfig.build.json --verbose",
19-
"build:special": "yarn workspace @ocap/vite-plugins run build && yarn workspace @metamask/kernel-shims run build && yarn workspace @metamask/kernel-browser-runtime run build:vite && yarn workspace @metamask/kernel-ui run build && yarn workspace @ocap/extension run build && yarn workspace @ocap/kernel-test run build:vats",
19+
"build:special": "yarn workspace @ocap/vite-plugins run build && yarn workspace @metamask/kernel-shims run build && yarn workspace @metamask/kernel-browser-runtime run build:vite && yarn workspace @metamask/kernel-ui run build && yarn workspace @ocap/extension run build && yarn workspace @ocap/kernel-test run build",
2020
"bundle": "node ./scripts/bundle-vat.js",
2121
"changelog:update": "yarn workspaces foreach --all --no-private --parallel --interlaced --verbose run changelog:update",
2222
"changelog:validate": "yarn workspaces foreach --all --no-private --parallel --interlaced --verbose run changelog:validate",

packages/create-package/src/utils.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,6 @@ describe('create-package/utils', () => {
190190
(execa as Mock)
191191
.mockResolvedValueOnce(undefined)
192192
.mockImplementationOnce(() => {
193-
console.log('FOOBAR');
194193
throw new Error('foo');
195194
});
196195

packages/kernel-test/CHANGELOG.md

Lines changed: 0 additions & 10 deletions
This file was deleted.

packages/kernel-test/README.md

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,6 @@
22

33
Run tests on the kernel that involve interaction with vats
44

5-
## Installation
6-
7-
`yarn add @ocap/kernel-test`
8-
9-
or
10-
11-
`npm install @ocap/kernel-test`
12-
135
## Contributing
146

157
This package is part of a monorepo. Instructions for contributing can be found in the [monorepo README](https://github.com/MetaMask/ocap-kernel#readme).

packages/kernel-test/package.json

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@
2929
"dist/"
3030
],
3131
"scripts": {
32-
"build": "ts-bridge --project tsconfig.build.json --clean && yarn build:vats",
33-
"build:vats": "ocap bundle src/vats",
34-
"build:docs": "typedoc",
35-
"changelog:validate": "../../scripts/validate-changelog.sh @ocap/kernel-test",
32+
"build": "ocap bundle src/vats",
3633
"clean": "rimraf --glob './*.tsbuildinfo' ./.eslintcache ./coverage ./dist './src/**/*.bundle'",
3734
"lint": "yarn lint:eslint && yarn lint:misc --check && yarn constraints && yarn lint:dependencies",
3835
"lint:dependencies": "depcheck",
@@ -64,13 +61,10 @@
6461
},
6562
"devDependencies": {
6663
"@arethetypeswrong/cli": "^0.17.4",
67-
"@metamask/auto-changelog": "^5.0.1",
6864
"@metamask/eslint-config": "^14.0.0",
6965
"@metamask/eslint-config-nodejs": "^14.0.0",
7066
"@metamask/eslint-config-typescript": "^14.0.0",
7167
"@ocap/cli": "workspace:^",
72-
"@ts-bridge/cli": "^0.6.3",
73-
"@ts-bridge/shims": "^0.1.1",
7468
"@typescript-eslint/eslint-plugin": "^8.29.0",
7569
"@typescript-eslint/parser": "^8.29.0",
7670
"@typescript-eslint/utils": "^8.29.0",
@@ -87,7 +81,6 @@
8781
"jsdom": "^26.0.0",
8882
"prettier": "^3.5.3",
8983
"rimraf": "^6.0.1",
90-
"typedoc": "^0.28.1",
9184
"typescript": "~5.8.2",
9285
"typescript-eslint": "^8.29.0",
9386
"vite": "^6.3.5",

packages/kernel-test/src/garbage-collection.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ describe('Garbage Collection', () => {
8383
const createObjectRef = createObjectData.slots[0] as KRef;
8484
// Verify initial reference counts from database
8585
const initialRefCounts = kernelStore.getObjectRefCount(createObjectRef);
86-
expect(initialRefCounts.reachable).toBe(3);
87-
expect(initialRefCounts.recognizable).toBe(3);
86+
expect(initialRefCounts.reachable).toBe(2);
87+
expect(initialRefCounts.recognizable).toBe(2);
8888
// Send the object to the importer vat
8989
const objectRef = kunser(createObjectData);
9090
await kernel.queueMessage(importerKRef, 'storeImport', [objectRef]);
@@ -117,8 +117,8 @@ describe('Garbage Collection', () => {
117117

118118
// Store initial reference count information
119119
const initialRefCounts = kernelStore.getObjectRefCount(createObjectRef);
120-
expect(initialRefCounts.reachable).toBe(3);
121-
expect(initialRefCounts.recognizable).toBe(3);
120+
expect(initialRefCounts.reachable).toBe(2);
121+
expect(initialRefCounts.recognizable).toBe(2);
122122

123123
// Store the reference in the importer vat
124124
const objectRef = kunser(createObjectData);
@@ -159,8 +159,8 @@ describe('Garbage Collection', () => {
159159

160160
// Check reference counts after dropImports
161161
const afterWeakRefCounts = kernelStore.getObjectRefCount(createObjectRef);
162-
expect(afterWeakRefCounts.reachable).toBe(2);
163-
expect(afterWeakRefCounts.recognizable).toBe(3);
162+
expect(afterWeakRefCounts.reachable).toBe(1);
163+
expect(afterWeakRefCounts.recognizable).toBe(2);
164164

165165
// Now completely forget the import in the importer vat
166166
// This should trigger retireImports when GC runs
@@ -177,8 +177,8 @@ describe('Garbage Collection', () => {
177177

178178
// Check reference counts after retireImports
179179
const afterForgetRefCounts = kernelStore.getObjectRefCount(createObjectRef);
180-
expect(afterForgetRefCounts.reachable).toBe(2);
181-
expect(afterForgetRefCounts.recognizable).toBe(2);
180+
expect(afterForgetRefCounts.reachable).toBe(1);
181+
expect(afterForgetRefCounts.recognizable).toBe(1);
182182

183183
// Now forget the object in the exporter vat
184184
// This should trigger retireExports when GC runs

packages/kernel-test/src/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
/// <reference types="vite/client" />
33

44
import type { KernelDatabase } from '@metamask/kernel-store';
5-
import { waitUntilQuiescent } from '@metamask/kernel-utils';
5+
import { stringify, waitUntilQuiescent } from '@metamask/kernel-utils';
66
import { Logger, makeArrayTransport } from '@metamask/logger';
77
import type { LogEntry } from '@metamask/logger';
88
import { Kernel, kunser } from '@metamask/ocap-kernel';
@@ -170,7 +170,7 @@ export function logDatabase(
170170
logger: Logger = console as unknown as Logger,
171171
): void {
172172
const result = kernelDatabase.executeQuery('SELECT * FROM kv');
173-
logger.log('kv result', result);
173+
logger.log('kv result', stringify(result));
174174
}
175175

176176
/**

packages/kernel-test/tsconfig.build.json

Lines changed: 0 additions & 20 deletions
This file was deleted.

packages/kernel-test/tsconfig.json

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"allowJs": true,
55
"baseUrl": "./",
66
"lib": ["ES2022"],
7+
"noEmit": true,
78
"types": ["vitest"]
89
},
910
"references": [
@@ -14,10 +15,5 @@
1415
{ "path": "../ocap-kernel" },
1516
{ "path": "../kernel-store" }
1617
],
17-
"include": [
18-
"../../vitest.config.ts",
19-
"./src",
20-
"./vite.config.ts",
21-
"./vitest.config.ts"
22-
]
18+
"include": ["../../vitest.config.ts", "./src", "./vitest.config.ts"]
2319
}

packages/kernel-test/typedoc.json

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)