Skip to content

Commit

Permalink
refactor(launch-local-docker): P-273 Detect block height more reliably
Browse files Browse the repository at this point in the history
  • Loading branch information
jonalvarezz committed Jan 22, 2024
1 parent ff22b32 commit a31c3cb
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 49 deletions.
67 changes: 18 additions & 49 deletions scripts/launch-local-docker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,6 @@ function usage() {

CHAIN=$1

# interval and rounds to wait to check the block production and finalization of parachain
WAIT_INTERVAL_SECONDS=10
WAIT_ROUNDS=30

# if the parachain has produced the first block
BLOCK_PRODUCED=false

function print_divider() {
echo "------------------------------------------------------------"
}
Expand All @@ -31,53 +24,29 @@ cd "$ROOTDIR/docker/generated-$CHAIN/"

docker compose up -d --build

# sleep for a while to make sure `docker compose` is ready
# otherwise `docker compose logs` could print empty output
sleep 10
print_divider

# Install Node.js dependencies in the middle.
# It also buys `docker compose` some time.
cd "$ROOTDIR/ts-tests"
if [[ -z "${NODE_ENV}" ]]; then
echo "NODE_ENV=ci" > .env
else
echo "NODE_ENV=${NODE_ENV}" > .env
fi

parachain_service=$(docker compose ps --services --filter 'status=running' | grep -F 'parachain-')
pnpm install

print_divider

echo "waiting for parachain to produce blocks ..."
echo "Waiting for parachain to produce block #1..."
pnpm run wait-finalized-block 2>&1

for _ in $(seq 1 $WAIT_ROUNDS); do
sleep $WAIT_INTERVAL_SECONDS
if docker compose logs "$parachain_service" 2>&1 | grep -F '0 peers' 2>/dev/null | grep -Fq "best: #1" 2>/dev/null; then
echo "parachain produced #1"
BLOCK_PRODUCED=true
break
fi
done
print_divider

if [ "$BLOCK_PRODUCED" = "false" ]; then
echo "no block production detected, you might want to check it manually. Quit now"
exit 1
fi
echo "Extending leasing period..."
pnpm run upgrade-parathread 2>&1

print_divider

echo "waiting for parachain to finalize blocks ..."

for _ in $(seq 1 $WAIT_ROUNDS); do
sleep $WAIT_INTERVAL_SECONDS
if docker compose logs "$parachain_service" 2>&1 | grep -F '0 peers' 2>/dev/null | grep -Fq "finalized #1" 2>/dev/null; then
echo "parachain finalized #1, all good."
print_divider
echo "extend leasing period now ..."
cd "$ROOTDIR/ts-tests"
if [[ -z "${NODE_ENV}" ]]; then
echo "NODE_ENV=ci" > .env
else
echo "NODE_ENV=${NODE_ENV}" > .env
fi
pnpm install
pnpm run upgrade-parathread 2>&1
print_divider
echo "Done."
exit 0
fi
done

echo "no block finalization detected, you might want to check it manually. Quit now"
exit 1
echo "Done."
exit 0
59 changes: 59 additions & 0 deletions ts-tests/common/setup/wait-finalized-block.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import '@polkadot/api-augment';
import { ApiPromise, Keyring, WsProvider } from '@polkadot/api';
import type { VoidFn } from '@polkadot/api/types';
import type { ISubmittableResult } from '@polkadot/types/types';
import { loadConfig } from '../utils';

const FINALIZED_BLOCKS_COUNT = 1;
const TIMEOUT_MIN = 1000 * 60 * 3; // 1min

/**
* Connects to the parachain via the config file
* and waits for `FINALIZED_BLOCKS_COUNT` blocks to
* get finalized.
*
* It times out after `TIMEOUT_MIN` min.
*/
(async () => {
const config = loadConfig();
let timeout: NodeJS.Timeout;
let count = 0;
let unsub: VoidFn;
let api: ApiPromise;

const provider = new WsProvider(config.parachain_ws);

console.log(`Connecting to parachain ${config.parachain_ws}`);

timeout = global.setTimeout(async () => {

if (typeof unsub === 'function') unsub();

if (api) api.disconnect();
provider.on('disconnected', () => {
console.log(`\nno block production detected after ${TIMEOUT_MIN}min, you might want to check it manually. Quit now`);
process.exit(1);
});
}, TIMEOUT_MIN);

api = await ApiPromise.create({
provider: provider,
});

unsub = await api.rpc.chain.subscribeFinalizedHeads(async (head) => {
const blockNumber = head.number.toNumber();
console.log(`Parachain finalized block #${blockNumber} with hash ${head.hash}`);
count += 1;

if (blockNumber >= 1 && count >= FINALIZED_BLOCKS_COUNT) {
unsub();
if (timeout) global.clearTimeout(timeout)

await api.disconnect();
provider.on('disconnected', () => {
console.log('Done.');
process.exit(0);
});
}
})
})();
1 change: 1 addition & 0 deletions ts-tests/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"scripts": {
"register-parathread": "pnpm exec ts-node common/setup/register-parathread.ts",
"upgrade-parathread": "pnpm exec ts-node common/setup/upgrade-parathread.ts",
"wait-finalized-block": "pnpm exec ts-node common/setup/wait-finalized-block.ts",
"setup-enclave": "pnpm exec ts-node common/setup/setup-enclave.ts",
"test-filter": "pnpm exec mocha --exit --sort -r ts-node/register 'integration-tests/base-filter.test.ts'",
"test-bridge": "pnpm exec mocha --exit --sort -r ts-node/register 'integration-tests/bridge.test.ts'",
Expand Down

0 comments on commit a31c3cb

Please sign in to comment.