From ec3ae6f5e3f89c13664449bbcbfd2be9a1a6edcc Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 23 Aug 2023 17:04:17 +0200 Subject: harness: parallelize service startup --- packages/taler-harness/src/harness/harness.ts | 49 +++++++++++++++++---------- 1 file changed, 32 insertions(+), 17 deletions(-) (limited to 'packages/taler-harness/src/harness/harness.ts') diff --git a/packages/taler-harness/src/harness/harness.ts b/packages/taler-harness/src/harness/harness.ts index 3a12024dc..8f1f3f452 100644 --- a/packages/taler-harness/src/harness/harness.ts +++ b/packages/taler-harness/src/harness/harness.ts @@ -540,7 +540,7 @@ function backoffStart(): number { } function backoffIncrement(n: number): number { - return Math.max(n * 2, 1000); + return Math.min(Math.floor(n * 1.5), 1000); } /** @@ -563,7 +563,7 @@ export async function pingProc( return; } catch (e: any) { logger.warn(`service ${serviceName} not ready:`, e.toString()); - //console.log(e); + logger.info(`waiting ${nextDelay}ms`); await delayMs(nextDelay); nextDelay = backoffIncrement(nextDelay); } @@ -1535,15 +1535,20 @@ export class ExchangeService implements ExchangeServiceInterface { ); } - async start(): Promise { + async start(opts: { skipSetup?: boolean } = {}): Promise { if (this.isRunning()) { throw Error("exchange is already running"); } - await sh( - this.globalState, - "exchange-dbinit", - `taler-exchange-dbinit -c "${this.configFilename}"`, - ); + + const skipSetup = opts.skipSetup ?? false; + + if (!skipSetup) { + await sh( + this.globalState, + "exchange-dbinit", + `taler-exchange-dbinit -c "${this.configFilename}"`, + ); + } this.helperCryptoEddsaProc = this.globalState.spawnService( "taler-exchange-secmod-eddsa", @@ -1574,7 +1579,11 @@ export class ExchangeService implements ExchangeServiceInterface { ); await this.pingUntilAvailable(); - await this.keyup(); + if (!skipSetup) { + await this.keyup(); + } else { + logger.info("skipping keyup"); + } } async pingUntilAvailable(): Promise { @@ -1912,13 +1921,17 @@ export class MerchantService implements MerchantServiceInterface { } } - async start(): Promise { - await runCommand( - this.globalState, - "merchant-dbinit", - "taler-merchant-dbinit", - ["-c", this.configFilename], - ); + async start(opts: { skipSetup?: boolean } = {}): Promise { + const skipSetup = opts.skipSetup ?? false; + + if (!skipSetup) { + await runCommand( + this.globalState, + "merchant-dbinit", + "taler-merchant-dbinit", + ["-c", this.configFilename], + ); + } this.proc = this.globalState.spawnService( "taler-merchant-httpd", @@ -2285,12 +2298,14 @@ export class WalletService { } async pingUntilAvailable(): Promise { + let nextDelay = backoffStart(); while (1) { try { await tryUnixConnect(this.socketPath); } catch (e) { logger.info(`connection attempt failed: ${e}`); - await delayMs(200); + await delayMs(nextDelay); + nextDelay = backoffIncrement(nextDelay); continue; } logger.info("connection to wallet-core succeeded"); -- cgit v1.2.3