From a3290d96a1d9d968451c208926e04457802a8572 Mon Sep 17 00:00:00 2001 From: Kris Kowal Date: Tue, 7 Jun 2022 17:41:29 -0700 Subject: [PATCH] fix(cosmic-swingset): Publish installation success and failure topic --- packages/cosmic-swingset/src/block-manager.js | 69 ++++++++++++++++++- packages/cosmic-swingset/src/chain-main.js | 16 +++++ packages/cosmic-swingset/src/launch-chain.js | 2 +- 3 files changed, 85 insertions(+), 2 deletions(-) diff --git a/packages/cosmic-swingset/src/block-manager.js b/packages/cosmic-swingset/src/block-manager.js index 8236e109fcc8..a824f6aa0c88 100644 --- a/packages/cosmic-swingset/src/block-manager.js +++ b/packages/cosmic-swingset/src/block-manager.js @@ -9,6 +9,14 @@ import * as BRIDGE_ID from '@agoric/vats/src/bridge-ids.js'; import * as ActionType from './action-types.js'; import { parseParams } from './params.js'; +import { + makeStoredSubscription, + makeSubscriptionKit, + observeIteration, +} from '@agoric/notifier'; + +import '@agoric/notifier/exported.js'; + const console = anylogger('block-manager'); // Artificially create load if set. @@ -16,6 +24,39 @@ const END_BLOCK_SPIN_MS = process.env.END_BLOCK_SPIN_MS ? parseInt(process.env.END_BLOCK_SPIN_MS, 10) : 0; +/** @typedef {Record} InstallationNotification */ + +/** + * @template T + * @param {T} initialValue + * @param {StorageNode} [storageNode] + */ +const makeStoredPublisher = (initialValue, storageNode) => { + let providedPublication; + + const provide = () => { + if (providedPublication) { + return providedPublication; + } + /** @type {SubscriptionRecord} */ + const { publication, subscription } = makeSubscriptionKit(initialValue); + providedPublication = publication; + // const storeSubscription = DISCARDED + makeStoredSubscription(subscription, storageNode); + return providedPublication; + }; + + /** @param {T} value */ + const publish = value => { + if (!storageNode) { + return; + } + provide().updateState(value); + }; + + return { provide, publish }; +}; + export default function makeBlockManager({ actionQueue, deliverInbound, @@ -28,6 +69,7 @@ export default function makeBlockManager({ saveOutsideState, savedHeight, validateAndInstallBundle, + installationStorageNode = undefined, verboseBlocks = false, }) { let computedHeight = savedHeight; @@ -36,6 +78,11 @@ export default function makeBlockManager({ let latestParams; let beginBlockAction; + const { + publish: publishInstallation, + provide: provideInstallationPublisher, + } = makeStoredPublisher(harden({}), installationStorageNode); + async function processAction(action) { const start = Date.now(); const finish = res => { @@ -48,6 +95,8 @@ export default function makeBlockManager({ let p; switch (action.type) { case ActionType.BEGIN_BLOCK: { + provideInstallationPublisher(); + latestParams = parseParams(action.params); p = beginBlock(action.blockHeight, action.blockTime, latestParams); break; @@ -84,7 +133,25 @@ export default function makeBlockManager({ p = (async () => { const bundle = JSON.parse(action.bundle); harden(bundle); - return validateAndInstallBundle(bundle); + + const error = await validateAndInstallBundle(bundle).then( + () => { + return null; + }, + error => { + return error; + }, + ); + + const { endoZipBase64Sha512 } = bundle; + + publishInstallation( + harden({ + installed: error === null, + endoZipBase64Sha512, + error, + }), + ); })().catch(error => { console.error(error); }); diff --git a/packages/cosmic-swingset/src/chain-main.js b/packages/cosmic-swingset/src/chain-main.js index e32f89c9d8aa..4d81ae671061 100644 --- a/packages/cosmic-swingset/src/chain-main.js +++ b/packages/cosmic-swingset/src/chain-main.js @@ -9,7 +9,10 @@ import { makeBufferedStorage } from '@agoric/swingset-vat/src/lib/storageAPI.js' import { assert, details as X } from '@agoric/assert'; import { makeSlogSenderFromModule } from '@agoric/telemetry'; +import { makeChainStorageRoot } from '@agoric/vats/src/lib-chainStorage.js'; + import * as STORAGE_PATH from '@agoric/vats/src/chain-storage-paths.js'; +import * as BRIDGE_ID from '@agoric/vats/src/bridge-ids.js'; import stringify from './json-stable-stringify.js'; import { launch } from './launch-chain.js'; import makeBlockManager from './block-manager.js'; @@ -444,11 +447,24 @@ export default async function main(progname, args, { env, homedir, agcc }) { if (!blockingSend) { const { savedChainSends: scs, ...fns } = await launchAndInitializeSwingSet(action); + + const toStorage = message => { + return fns.bridgeOutbound(BRIDGE_ID.STORAGE, message); + }; + const rootStorageNode = makeChainStorageRoot( + toStorage, + 'swingset', + 'published', + ); + const installationStorageNode = + rootStorageNode.getChildNode('installation'); + savedChainSends = scs; blockingSend = makeBlockManager({ ...fns, flushChainSends, verboseBlocks: true, + installationStorageNode, }); } diff --git a/packages/cosmic-swingset/src/launch-chain.js b/packages/cosmic-swingset/src/launch-chain.js index dc4fb4b7ea6b..39904e1450eb 100644 --- a/packages/cosmic-swingset/src/launch-chain.js +++ b/packages/cosmic-swingset/src/launch-chain.js @@ -327,7 +327,7 @@ export async function launch({ actionQueue, deliverInbound, doBridgeInbound, - // bridgeOutbound, + bridgeOutbound, bootstrapBlock, beginBlock, endBlock,