From 1628fb634d9f32bc0247b8a3e4d66d7a668a2c3c Mon Sep 17 00:00:00 2001 From: Siarhei Liakh Date: Tue, 4 Feb 2025 10:35:57 -0500 Subject: [PATCH 1/7] feat(SwingSet): Report vat sntapshot size delta on save Two changes: 1. move slog 'heap-snapshot-save' from vatKeeper.js to manager-subprocess-xsnap.js 2. track uncompressedSizeLoaded in a local variable inside createFromBundle() and report delta from makeSnapshot() --- .../SwingSet/src/kernel/state/vatKeeper.js | 20 +-------- .../vat-loader/manager-subprocess-xsnap.js | 45 ++++++++++++++++++- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/packages/SwingSet/src/kernel/state/vatKeeper.js b/packages/SwingSet/src/kernel/state/vatKeeper.js index d307bc77e7b..91a05ce8757 100644 --- a/packages/SwingSet/src/kernel/state/vatKeeper.js +++ b/packages/SwingSet/src/kernel/state/vatKeeper.js @@ -677,13 +677,7 @@ export function makeVatKeeper( restartWorker, ); - const { - hash: snapshotID, - uncompressedSize, - dbSaveSeconds, - compressedSize, - compressSeconds, - } = info; + const { hash: snapshotID } = info; // push a save-snapshot transcript entry addToTranscript(makeSaveSnapshotItem(snapshotID)); @@ -695,18 +689,6 @@ export function makeVatKeeper( // always starts with an initialize-worker or load-snapshot // pseudo-delivery addToTranscript(makeLoadSnapshotItem(snapshotID)); - - kernelSlog.write({ - type: 'heap-snapshot-save', - vatID, - snapshotID, - uncompressedSize, - dbSaveSeconds, - compressedSize, - compressSeconds, - endPosition, - restartWorker, - }); } /** diff --git a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js index ff9a4bb1d50..05eac817adf 100644 --- a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js +++ b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js @@ -128,8 +128,10 @@ export function makeXsSubprocessFactory({ const vatKeeper = kernelKeeper.provideVatKeeper(vatID); const snapshotInfo = vatKeeper.getSnapshotInfo(); + let uncompressedSizeLoaded = null; if (snapshotInfo) { kernelSlog.write({ type: 'heap-snapshot-load', vatID, ...snapshotInfo }); + uncompressedSizeLoaded = snapshotInfo.uncompressedSize; } // `startXSnap` adds `nameDisplayArg` as a dummy argument so that 'ps' @@ -238,11 +240,49 @@ export function makeXsSubprocessFactory({ * @returns {Promise} */ async function makeSnapshot(snapPos, snapStore, restartWorker) { + async function saveSnapshot(vatID_, snapPos_, snapshotStream_) { + const saveResultP = snapStore.saveSnapshot( + vatID_, + snapPos_, + snapshotStream_, + ); + saveResultP + .then( + ({ + hash: snapshotID, + uncompressedSize, + dbSaveSeconds, + compressedSize, + compressSeconds, + }) => { + const uncompressedSizeDelta = + uncompressedSizeLoaded && + uncompressedSize - uncompressedSizeLoaded; + kernelSlog.write({ + type: 'heap-snapshot-save', + vatID: vatID_, + snapshotID, + uncompressedSize, + dbSaveSeconds, + compressedSize, + compressSeconds, + endPosition: snapPos_, + restartWorker, + uncompressedSizeDelta, + }); + }, + ) + .catch(err => { + throw err; + }); + + return saveResultP; + } const snapshotDescription = `${vatID}-${snapPos}`; const snapshotStream = worker.makeSnapshotStream(snapshotDescription); if (!restartWorker) { - return snapStore.saveSnapshot(vatID, snapPos, snapshotStream); + return saveSnapshot(vatID, snapPos, snapshotStream); } /** @type {AsyncGenerator[]} */ @@ -268,9 +308,10 @@ export function makeXsSubprocessFactory({ snapshotDescription, }, }), - snapStore.saveSnapshot(vatID, snapPos, snapStoreSaveStream), + saveSnapshot(vatID, snapPos, snapStoreSaveStream), ]); await closeP; + uncompressedSizeLoaded = snapshotResults.uncompressedSize; /** @type {Partial} */ const reloadSnapshotInfo = { From e1950a3edc77cc01c8e2e45126c2992558395dc0 Mon Sep 17 00:00:00 2001 From: siarhei-agoric Date: Thu, 6 Feb 2025 14:12:42 -0500 Subject: [PATCH 2/7] fixup: Apply suggestions from code review Co-authored-by: Richard Gibson --- .../vat-loader/manager-subprocess-xsnap.js | 60 +++++++------------ 1 file changed, 21 insertions(+), 39 deletions(-) diff --git a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js index 05eac817adf..47283711ed7 100644 --- a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js +++ b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js @@ -240,46 +240,28 @@ export function makeXsSubprocessFactory({ * @returns {Promise} */ async function makeSnapshot(snapPos, snapStore, restartWorker) { - async function saveSnapshot(vatID_, snapPos_, snapshotStream_) { - const saveResultP = snapStore.saveSnapshot( - vatID_, - snapPos_, - snapshotStream_, - ); - saveResultP - .then( - ({ - hash: snapshotID, - uncompressedSize, - dbSaveSeconds, - compressedSize, - compressSeconds, - }) => { - const uncompressedSizeDelta = - uncompressedSizeLoaded && - uncompressedSize - uncompressedSizeLoaded; - kernelSlog.write({ - type: 'heap-snapshot-save', - vatID: vatID_, - snapshotID, - uncompressedSize, - dbSaveSeconds, - compressedSize, - compressSeconds, - endPosition: snapPos_, - restartWorker, - uncompressedSizeDelta, - }); - }, - ) - .catch(err => { - throw err; - }); - - return saveResultP; - } const snapshotDescription = `${vatID}-${snapPos}`; const snapshotStream = worker.makeSnapshotStream(snapshotDescription); + const saveSnapshot = async () => { + const results = await snapStore.saveSnapshot( + vatID, + snapPos, + snapshotStream, + ); + const { hash: snapshotID, ...metrics } = results; + const uncompressedSizeDelta = + uncompressedSizeLoaded && + metrics.uncompressedSize - uncompressedSizeLoaded; + kernelSlog.write({ + type: 'heap-snapshot-save', + vatID, + snapshotID, + endPosition: snapPos, + ...metrics, + restartWorker, + }); + return results; + }; if (!restartWorker) { return saveSnapshot(vatID, snapPos, snapshotStream); @@ -310,8 +292,8 @@ export function makeXsSubprocessFactory({ }), saveSnapshot(vatID, snapPos, snapStoreSaveStream), ]); - await closeP; uncompressedSizeLoaded = snapshotResults.uncompressedSize; + await closeP; /** @type {Partial} */ const reloadSnapshotInfo = { From 8ba937adcf6cc306c37e5feff368e242cd94cf7c Mon Sep 17 00:00:00 2001 From: siarhei-agoric Date: Fri, 7 Feb 2025 14:21:34 -0500 Subject: [PATCH 3/7] fixup: Apply suggestions from code review Co-authored-by: Mathieu Hofman <86499+mhofman@users.noreply.github.com> --- .../SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js index 47283711ed7..53e0f0660fd 100644 --- a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js +++ b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js @@ -258,6 +258,7 @@ export function makeXsSubprocessFactory({ snapshotID, endPosition: snapPos, ...metrics, + uncompressedSizeDelta, restartWorker, }); return results; From 816cde7a0bd761ef92cc17045897a77760a965cd Mon Sep 17 00:00:00 2001 From: Siarhei Liakh Date: Fri, 7 Feb 2025 14:33:34 -0500 Subject: [PATCH 4/7] fixup(SwingSet): fix saveSnapshot() arguments move uncompressedSizeLoaded into saveSnapshot(). --- .../src/kernel/vat-loader/manager-subprocess-xsnap.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js index 53e0f0660fd..aec26383cce 100644 --- a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js +++ b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js @@ -252,6 +252,7 @@ export function makeXsSubprocessFactory({ const uncompressedSizeDelta = uncompressedSizeLoaded && metrics.uncompressedSize - uncompressedSizeLoaded; + uncompressedSizeLoaded = snapshotResults.uncompressedSize; kernelSlog.write({ type: 'heap-snapshot-save', vatID, @@ -265,7 +266,7 @@ export function makeXsSubprocessFactory({ }; if (!restartWorker) { - return saveSnapshot(vatID, snapPos, snapshotStream); + return saveSnapshot(); } /** @type {AsyncGenerator[]} */ @@ -291,9 +292,8 @@ export function makeXsSubprocessFactory({ snapshotDescription, }, }), - saveSnapshot(vatID, snapPos, snapStoreSaveStream), + saveSnapshot(), ]); - uncompressedSizeLoaded = snapshotResults.uncompressedSize; await closeP; /** @type {Partial} */ From 923a8c9018ef2d832361ff49463fc816afd1c5ae Mon Sep 17 00:00:00 2001 From: Siarhei Liakh Date: Fri, 7 Feb 2025 14:37:32 -0500 Subject: [PATCH 5/7] fixup(SwingSet): another small fix in saveSnapshot() --- .../SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js index aec26383cce..95e108af0d4 100644 --- a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js +++ b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js @@ -252,7 +252,7 @@ export function makeXsSubprocessFactory({ const uncompressedSizeDelta = uncompressedSizeLoaded && metrics.uncompressedSize - uncompressedSizeLoaded; - uncompressedSizeLoaded = snapshotResults.uncompressedSize; + uncompressedSizeLoaded = results.uncompressedSize; kernelSlog.write({ type: 'heap-snapshot-save', vatID, From 35b5b67f66a6ce7f9d174f3b49d5d93fb0974999 Mon Sep 17 00:00:00 2001 From: Siarhei Liakh Date: Mon, 10 Feb 2025 13:50:56 -0500 Subject: [PATCH 6/7] fixup(SwingSet): use correct stream in saveSnapshot() --- .../src/kernel/vat-loader/manager-subprocess-xsnap.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js index 95e108af0d4..4b0d6c68fe2 100644 --- a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js +++ b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js @@ -242,11 +242,11 @@ export function makeXsSubprocessFactory({ async function makeSnapshot(snapPos, snapStore, restartWorker) { const snapshotDescription = `${vatID}-${snapPos}`; const snapshotStream = worker.makeSnapshotStream(snapshotDescription); - const saveSnapshot = async () => { + const saveSnapshot = async (saveStream) => { const results = await snapStore.saveSnapshot( vatID, snapPos, - snapshotStream, + saveStream, ); const { hash: snapshotID, ...metrics } = results; const uncompressedSizeDelta = @@ -266,7 +266,7 @@ export function makeXsSubprocessFactory({ }; if (!restartWorker) { - return saveSnapshot(); + return saveSnapshot(snapshotStream); } /** @type {AsyncGenerator[]} */ @@ -292,7 +292,7 @@ export function makeXsSubprocessFactory({ snapshotDescription, }, }), - saveSnapshot(), + saveSnapshot(snapStoreSaveStream), ]); await closeP; From cc52ab3b70aed4b6e1c2d63bbddae091bbb9fa9d Mon Sep 17 00:00:00 2001 From: Siarhei Liakh Date: Mon, 10 Feb 2025 14:14:51 -0500 Subject: [PATCH 7/7] chore(SwingSet): lint-fix --- .../SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js index 4b0d6c68fe2..aeb66fd19dd 100644 --- a/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js +++ b/packages/SwingSet/src/kernel/vat-loader/manager-subprocess-xsnap.js @@ -242,7 +242,7 @@ export function makeXsSubprocessFactory({ async function makeSnapshot(snapPos, snapStore, restartWorker) { const snapshotDescription = `${vatID}-${snapPos}`; const snapshotStream = worker.makeSnapshotStream(snapshotDescription); - const saveSnapshot = async (saveStream) => { + const saveSnapshot = async saveStream => { const results = await snapStore.saveSnapshot( vatID, snapPos,