From 86fb71f563eb8b44cf97e9957fdfe1d5fd2a829a Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 17 Nov 2016 01:23:53 +0100 Subject: rate-limit concurrent processPreCoin --- src/wallet.ts | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/wallet.ts b/src/wallet.ts index 9e96bffd3..354072130 100644 --- a/src/wallet.ts +++ b/src/wallet.ts @@ -379,6 +379,8 @@ export class Wallet { private notifier: Notifier; public cryptoApi: CryptoApi; + private processPreCoinConcurrent = 0; + /** * Set of identifiers for running operations. */ @@ -725,22 +727,29 @@ export class Wallet { private async processPreCoin(preCoin: PreCoinRecord, - retryDelayMs = 100): Promise { - - const exchange = await this.q().get(Stores.exchanges, - preCoin.exchangeBaseUrl); - if (!exchange) { - console.error("db inconsistend: exchange for precoin not found"); - return; - } - const denom = await this.q().get(Stores.denominations, - [preCoin.exchangeBaseUrl, preCoin.denomPub]); - if (!denom) { - console.error("db inconsistent: denom for precoin not found"); + retryDelayMs = 200): Promise { + if (this.processPreCoinConcurrent >= 1) { + console.log("delaying processPreCoin"); + setTimeout(() => this.processPreCoin(preCoin, retryDelayMs * 2), + retryDelayMs); return; } - + console.log("executing processPreCoin"); + this.processPreCoinConcurrent++; try { + const exchange = await this.q().get(Stores.exchanges, + preCoin.exchangeBaseUrl); + if (!exchange) { + console.error("db inconsistend: exchange for precoin not found"); + return; + } + const denom = await this.q().get(Stores.denominations, + [preCoin.exchangeBaseUrl, preCoin.denomPub]); + if (!denom) { + console.error("db inconsistent: denom for precoin not found"); + return; + } + const coin = await this.withdrawExecute(preCoin); const mutateReserve = (r: ReserveRecord) => { @@ -784,6 +793,8 @@ export class Wallet { let nextRetryDelayMs = Math.min(retryDelayMs * 2, 1000 * 60); setTimeout(() => this.processPreCoin(preCoin, nextRetryDelayMs), retryDelayMs); + } finally { + this.processPreCoinConcurrent--; } } -- cgit v1.2.3