Skip to content

Commit 8a7fb12

Browse files
committed
wip terminating
1 parent 5aca3ad commit 8a7fb12

File tree

9 files changed

+175
-128
lines changed

9 files changed

+175
-128
lines changed

packages/kernel/src/Kernel.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ export class Kernel {
181181
*/
182182
async #run(): Promise<void> {
183183
for await (const item of this.#runQueueItems()) {
184+
console.log('run loop item', item);
184185
this.#kernelStore.nextTerminatedVatCleanup();
185186
await this.#deliver(item);
186187
this.#kernelStore.collectGarbage();
@@ -287,7 +288,7 @@ export class Kernel {
287288
} else {
288289
kref = this.#kernelStore.initKernelObject(vatId);
289290
}
290-
this.#kernelStore.addClistEntry(vatId, kref, vref);
291+
this.#kernelStore.addCListEntry(vatId, kref, vref);
291292
return kref;
292293
}
293294

@@ -833,6 +834,7 @@ export class Kernel {
833834
async terminateVat(vatId: VatId): Promise<void> {
834835
await this.#stopVat(vatId, true);
835836
this.#kernelStore.deleteVatConfig(vatId);
837+
// Mark for deletion (which will happen later, in vat-cleanup events)
836838
this.#kernelStore.markVatAsTerminated(vatId);
837839
}
838840

@@ -855,9 +857,11 @@ export class Kernel {
855857
if (!this.#mostRecentSubcluster) {
856858
throw Error('no subcluster to reload');
857859
}
858-
859860
await this.terminateAllVats();
860-
861+
while (this.#kernelStore.nextTerminatedVatCleanup()) {
862+
// wait for all vats to be cleaned up
863+
console.log('waiting for vats to be cleaned up');
864+
}
861865
await this.launchSubcluster(this.#mostRecentSubcluster);
862866
}
863867

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ describe('garbage-collection', () => {
1616
it('processes dropExport actions', () => {
1717
// Setup: Create object and add GC action
1818
const ko1 = kernelStore.initKernelObject('v1');
19-
kernelStore.addClistEntry('v1', ko1, 'o+1'); // Export reference
19+
kernelStore.addCListEntry('v1', ko1, 'o+1'); // Export reference
2020

2121
// Set reachable count to 0 but keep recognizable count
2222
kernelStore.setObjectRefCount(ko1, { reachable: 0, recognizable: 1 });
@@ -47,7 +47,7 @@ describe('garbage-collection', () => {
4747
it('processes retireExport actions', () => {
4848
// Setup: Create object with zero refcounts
4949
const ko1 = kernelStore.initKernelObject('v1');
50-
kernelStore.addClistEntry('v1', ko1, 'o+1');
50+
kernelStore.addCListEntry('v1', ko1, 'o+1');
5151
kernelStore.setObjectRefCount(ko1, { reachable: 0, recognizable: 0 });
5252
kernelStore.addGCActions([`v1 retireExport ${ko1}`]);
5353

@@ -68,7 +68,7 @@ describe('garbage-collection', () => {
6868
it('processes retireImport actions', () => {
6969
// Setup: Create object and add GC action
7070
const ko1 = kernelStore.initKernelObject('v1');
71-
kernelStore.addClistEntry('v2', ko1, 'o-1'); // Import reference
71+
kernelStore.addCListEntry('v2', ko1, 'o-1'); // Import reference
7272
kernelStore.addGCActions([`v2 retireImport ${ko1}`]);
7373

7474
// Process GC actions
@@ -90,8 +90,8 @@ describe('garbage-collection', () => {
9090
const ko1 = kernelStore.initKernelObject('v1');
9191
const ko2 = kernelStore.initKernelObject('v1');
9292

93-
kernelStore.addClistEntry('v1', ko1, 'o+1');
94-
kernelStore.addClistEntry('v1', ko2, 'o+2');
93+
kernelStore.addCListEntry('v1', ko1, 'o+1');
94+
kernelStore.addCListEntry('v1', ko2, 'o+2');
9595

9696
// Set up conditions for dropExport and retireExport
9797
kernelStore.setObjectRefCount(ko1, { reachable: 0, recognizable: 1 });
@@ -125,8 +125,8 @@ describe('garbage-collection', () => {
125125
const ko1 = kernelStore.initKernelObject('v2');
126126
const ko2 = kernelStore.initKernelObject('v1');
127127

128-
kernelStore.addClistEntry('v2', ko1, 'o+1');
129-
kernelStore.addClistEntry('v1', ko2, 'o+1');
128+
kernelStore.addCListEntry('v2', ko1, 'o+1');
129+
kernelStore.addCListEntry('v1', ko2, 'o+1');
130130

131131
// Set up conditions for dropExport
132132
kernelStore.setObjectRefCount(ko1, { reachable: 0, recognizable: 1 });
@@ -157,7 +157,7 @@ describe('garbage-collection', () => {
157157

158158
it('skips actions that should not be processed', () => {
159159
const ko1 = kernelStore.initKernelObject('v1');
160-
kernelStore.addClistEntry('v1', ko1, 'o+1');
160+
kernelStore.addCListEntry('v1', ko1, 'o+1');
161161

162162
// Add dropExport action but set reachable to false (should skip)
163163
kernelStore.clearReachableFlag('v1', ko1);
@@ -178,7 +178,7 @@ describe('garbage-collection', () => {
178178

179179
it('skips dropExport when object does not exist', () => {
180180
const ko1 = kernelStore.initKernelObject('v1');
181-
kernelStore.addClistEntry('v1', ko1, 'o+1');
181+
kernelStore.addCListEntry('v1', ko1, 'o+1');
182182

183183
// Delete the object to simulate non-existence
184184
kernelStore.deleteKernelObject(ko1);
@@ -192,7 +192,7 @@ describe('garbage-collection', () => {
192192

193193
it('skips retireExport when object has non-zero refcounts', () => {
194194
const ko1 = kernelStore.initKernelObject('v1');
195-
kernelStore.addClistEntry('v1', ko1, 'o+1');
195+
kernelStore.addCListEntry('v1', ko1, 'o+1');
196196

197197
// Set non-zero refcounts
198198
kernelStore.setObjectRefCount(ko1, { reachable: 1, recognizable: 1 });
@@ -206,7 +206,7 @@ describe('garbage-collection', () => {
206206

207207
it('skips retireExport when object does not exist', () => {
208208
const ko1 = kernelStore.initKernelObject('v1');
209-
kernelStore.addClistEntry('v1', ko1, 'o+1');
209+
kernelStore.addCListEntry('v1', ko1, 'o+1');
210210

211211
// Delete the object
212212
kernelStore.deleteKernelObject(ko1);
@@ -241,7 +241,7 @@ describe('garbage-collection', () => {
241241

242242
it('skips retireExport when object is recognizable', () => {
243243
const ko1 = kernelStore.initKernelObject('v1');
244-
kernelStore.addClistEntry('v1', ko1, 'o+1');
244+
kernelStore.addCListEntry('v1', ko1, 'o+1');
245245

246246
// Set only recognizable count to non-zero
247247
kernelStore.setObjectRefCount(ko1, { reachable: 0, recognizable: 1 });

packages/kernel/src/store/index.test.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,17 @@ describe('kernel store', () => {
5353
it('has all the expected parts', () => {
5454
const ks = makeKernelStore(mockKernelDatabase);
5555
expect(Object.keys(ks).sort()).toStrictEqual([
56-
'addClistEntry',
56+
'addCListEntry',
5757
'addGCActions',
5858
'addPromiseSubscriber',
5959
'allocateErefForKref',
60+
'cleanupTerminatedVat',
6061
'clear',
6162
'clearReachableFlag',
6263
'collectGarbage',
6364
'decRefCount',
6465
'decrementRefCount',
65-
'deleteClistEntry',
66+
'deleteCListEntry',
6667
'deleteEndpoint',
6768
'deleteKernelObject',
6869
'deleteKernelPromise',
@@ -74,6 +75,7 @@ describe('kernel store', () => {
7475
'erefToKref',
7576
'forgetEref',
7677
'forgetKref',
78+
'forgetTerminatedVat',
7779
'getAllVatRecords',
7880
'getGCActions',
7981
'getImporters',
@@ -90,6 +92,7 @@ describe('kernel store', () => {
9092
'getReachableAndVatSlot',
9193
'getReachableFlag',
9294
'getRefCount',
95+
'getTerminatedVats',
9396
'getVatConfig',
9497
'getVatIDs',
9598
'hasCListEntry',
@@ -99,12 +102,15 @@ describe('kernel store', () => {
99102
'initEndpoint',
100103
'initKernelObject',
101104
'initKernelPromise',
105+
'isTerminatedVat',
102106
'kernelRefExists',
103107
'krefToEref',
104108
'krefsToExistingErefs',
105109
'kv',
106110
'makeVatStore',
111+
'markVatAsTerminated',
107112
'nextReapAction',
113+
'nextTerminatedVatCleanup',
108114
'refCountKey',
109115
'reset',
110116
'resolveKernelPromise',
@@ -234,11 +240,11 @@ describe('kernel store', () => {
234240
const [kp61] = ks.initKernelPromise();
235241

236242
// Add C-list entries
237-
ks.addClistEntry('v2', ko42, 'o-63');
238-
ks.addClistEntry('v2', ko51, 'o-74');
239-
ks.addClistEntry('v2', kp60, 'p+85');
240-
ks.addClistEntry('r7', ko42, 'ro+11');
241-
ks.addClistEntry('r7', kp61, 'rp-99');
243+
ks.addCListEntry('v2', ko42, 'o-63');
244+
ks.addCListEntry('v2', ko51, 'o-74');
245+
ks.addCListEntry('v2', kp60, 'p+85');
246+
ks.addCListEntry('r7', ko42, 'ro+11');
247+
ks.addCListEntry('r7', kp61, 'rp-99');
242248

243249
// Verify mappings
244250
expect(ks.krefToEref('v2', ko42)).toBe('o-63');
@@ -275,7 +281,7 @@ describe('kernel store', () => {
275281
ks.getNextRemoteId();
276282
const koId = ks.initKernelObject('v1');
277283
const [kpId] = ks.initKernelPromise();
278-
ks.addClistEntry('v1', koId, 'o-1');
284+
ks.addCListEntry('v1', koId, 'o-1');
279285
ks.enqueueRun(tm('test message'));
280286
ks.reset();
281287
expect(ks.getNextVatId()).toBe('v1');

packages/kernel/src/store/methods/clist.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ describe('clist-methods', () => {
4444
} as StoreContext);
4545
});
4646

47-
describe('addClistEntry', () => {
47+
describe('addCListEntry', () => {
4848
it('adds a bidirectional mapping between KRef and ERef', () => {
4949
const endpointId: EndpointId = 'v1';
5050
const kref: KRef = 'ko1';
5151
const eref: ERef = 'o-1';
5252

53-
clistMethods.addClistEntry(endpointId, kref, eref);
53+
clistMethods.addCListEntry(endpointId, kref, eref);
5454

5555
// Check that both mappings are stored
5656
expect(kv.get(`${endpointId}.c.${kref}`)).toBe(`R ${eref}`);
@@ -62,7 +62,7 @@ describe('clist-methods', () => {
6262
const kref: KRef = 'kp1';
6363
const eref: ERef = 'p+2';
6464

65-
clistMethods.addClistEntry(endpointId, kref, eref);
65+
clistMethods.addCListEntry(endpointId, kref, eref);
6666

6767
expect(kv.get(`${endpointId}.c.${kref}`)).toBe(`R ${eref}`);
6868
expect(kv.get(`${endpointId}.c.${eref}`)).toBe(kref);
@@ -73,7 +73,7 @@ describe('clist-methods', () => {
7373
const kref: KRef = 'ko2';
7474
const eref: ERef = 'ro+3';
7575

76-
clistMethods.addClistEntry(endpointId, kref, eref);
76+
clistMethods.addCListEntry(endpointId, kref, eref);
7777

7878
expect(kv.get(`${endpointId}.c.${kref}`)).toBe(`R ${eref}`);
7979
expect(kv.get(`${endpointId}.c.${eref}`)).toBe(kref);
@@ -86,7 +86,7 @@ describe('clist-methods', () => {
8686
const kref: KRef = 'ko1';
8787
const eref: ERef = 'o-1';
8888

89-
clistMethods.addClistEntry(endpointId, kref, eref);
89+
clistMethods.addCListEntry(endpointId, kref, eref);
9090

9191
expect(clistMethods.hasCListEntry(endpointId, kref)).toBe(true);
9292
expect(clistMethods.hasCListEntry(endpointId, eref)).toBe(true);
@@ -155,7 +155,7 @@ describe('clist-methods', () => {
155155
const kref: KRef = 'ko1';
156156
const eref: ERef = 'o-1';
157157

158-
clistMethods.addClistEntry(endpointId, kref, eref);
158+
clistMethods.addCListEntry(endpointId, kref, eref);
159159

160160
expect(clistMethods.erefToKref(endpointId, eref)).toBe(kref);
161161
expect(clistMethods.krefToEref(endpointId, kref)).toBe(eref);
@@ -177,8 +177,8 @@ describe('clist-methods', () => {
177177
const eref1: ERef = 'o-1';
178178
const eref2: ERef = 'o-2';
179179

180-
clistMethods.addClistEntry(endpointId, kref1, eref1);
181-
clistMethods.addClistEntry(endpointId, kref2, eref2);
180+
clistMethods.addCListEntry(endpointId, kref1, eref1);
181+
clistMethods.addCListEntry(endpointId, kref2, eref2);
182182

183183
expect(
184184
clistMethods.krefsToExistingErefs(endpointId, [kref1, kref2]),

0 commit comments

Comments
 (0)