Skip to content

Commit

Permalink
fix(cosmic-swingset): Publish installation success and failure topic
Browse files Browse the repository at this point in the history
  • Loading branch information
kriskowal committed Jun 13, 2022
1 parent 24506ab commit a3290d9
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 2 deletions.
69 changes: 68 additions & 1 deletion packages/cosmic-swingset/src/block-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,54 @@ 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.
const END_BLOCK_SPIN_MS = process.env.END_BLOCK_SPIN_MS
? parseInt(process.env.END_BLOCK_SPIN_MS, 10)
: 0;

/** @typedef {Record<string, unknown>} InstallationNotification */

/**
* @template T
* @param {T} initialValue
* @param {StorageNode} [storageNode]
*/
const makeStoredPublisher = (initialValue, storageNode) => {
let providedPublication;

const provide = () => {
if (providedPublication) {
return providedPublication;
}
/** @type {SubscriptionRecord<T>} */
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,
Expand All @@ -28,6 +69,7 @@ export default function makeBlockManager({
saveOutsideState,
savedHeight,
validateAndInstallBundle,
installationStorageNode = undefined,
verboseBlocks = false,
}) {
let computedHeight = savedHeight;
Expand All @@ -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 => {
Expand All @@ -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;
Expand Down Expand Up @@ -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);
});
Expand Down
16 changes: 16 additions & 0 deletions packages/cosmic-swingset/src/chain-main.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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,
});
}

Expand Down
2 changes: 1 addition & 1 deletion packages/cosmic-swingset/src/launch-chain.js
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ export async function launch({
actionQueue,
deliverInbound,
doBridgeInbound,
// bridgeOutbound,
bridgeOutbound,
bootstrapBlock,
beginBlock,
endBlock,
Expand Down

0 comments on commit a3290d9

Please sign in to comment.