From c7a2abedbabe9142ce9a15902f90a5d1f4b36f05 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Fri, 4 Sep 2020 03:10:36 +0530 Subject: don't unnecessarily repeat reserve processing after recoup --- .../taler-wallet-core/src/operations/recoup.ts | 33 +++++++++++++++++----- .../taler-wallet-core/src/operations/reserves.ts | 12 ++++++-- 2 files changed, 35 insertions(+), 10 deletions(-) (limited to 'packages/taler-wallet-core/src') diff --git a/packages/taler-wallet-core/src/operations/recoup.ts b/packages/taler-wallet-core/src/operations/recoup.ts index 91579f602..eb268f18b 100644 --- a/packages/taler-wallet-core/src/operations/recoup.ts +++ b/packages/taler-wallet-core/src/operations/recoup.ts @@ -40,7 +40,7 @@ import { import { codecForRecoupConfirmation } from "../types/talerTypes"; import { NotificationType } from "../types/notifications"; -import { forceQueryReserve, getReserveRequestTimeout } from "./reserves"; +import { forceQueryReserve, getReserveRequestTimeout, processReserve } from "./reserves"; import { Amounts } from "../util/amounts"; import { createRefreshGroup, processRefreshGroup } from "./refresh"; @@ -200,8 +200,13 @@ async function recoupWithdrawCoin( updatedCoin.status = CoinStatus.Dormant; const currency = updatedCoin.currentAmount.currency; updatedCoin.currentAmount = Amounts.getZero(currency); - updatedReserve.reserveStatus = ReserveRecordStatus.QUERYING_STATUS; - updatedReserve.retryInfo = initRetryInfo(); + if (updatedReserve.reserveStatus === ReserveRecordStatus.DORMANT) { + updatedReserve.reserveStatus = ReserveRecordStatus.QUERYING_STATUS; + updatedReserve.retryInfo = initRetryInfo(); + } else { + updatedReserve.requestedQuery = true; + updatedReserve.retryInfo = initRetryInfo(); + } await tx.put(Stores.coins, updatedCoin); await tx.put(Stores.reserves, updatedReserve); await putGroupAsFinished(ws, tx, recoupGroup, coinIdx); @@ -211,10 +216,6 @@ async function recoupWithdrawCoin( ws.notify({ type: NotificationType.RecoupFinished, }); - - forceQueryReserve(ws, reserve.reservePub).catch((e) => { - logger.error("re-querying reserve after recoup failed:", e); - }); } async function recoupRefreshCoin( @@ -341,6 +342,24 @@ async function processRecoupGroupImpl( processRecoup(ws, recoupGroupId, i), ); await Promise.all(ps); + + const reserveSet = new Set(); + for (let i = 0; i < recoupGroup.coinPubs.length; i++) { + const coinPub = recoupGroup.coinPubs[i]; + const coin = await ws.db.get(Stores.coins, coinPub); + if (!coin) { + throw Error(`Coin ${coinPub} not found, can't request payback`); + } + if (coin.coinSource.type === CoinSourceType.Withdraw) { + reserveSet.add(coin.coinSource.reservePub); + } + } + + for (const r of reserveSet.values()) { + processReserve(ws, r).catch((e) => { + logger.error(`processing reserve ${r} after recoup failed`); + }); + } } export async function createRecoupGroup( diff --git a/packages/taler-wallet-core/src/operations/reserves.ts b/packages/taler-wallet-core/src/operations/reserves.ts index a28c2e0cf..69942fe94 100644 --- a/packages/taler-wallet-core/src/operations/reserves.ts +++ b/packages/taler-wallet-core/src/operations/reserves.ts @@ -291,7 +291,7 @@ export async function forceQueryReserve( break; default: reserve.requestedQuery = true; - return; + break; } reserve.retryInfo = initRetryInfo(); await tx.put(Stores.reserves, reserve); @@ -601,13 +601,17 @@ async function updateReserve( logger.trace("setting reserve status to 'withdrawing' after query"); r.reserveStatus = ReserveRecordStatus.WITHDRAWING; r.retryInfo = initRetryInfo(); + r.requestedQuery = false; } else { - logger.trace("setting reserve status to 'dormant' after query"); if (r.requestedQuery) { + logger.trace( + "setting reserve status to 'querying-status' (requested query) after query", + ); r.reserveStatus = ReserveRecordStatus.QUERYING_STATUS; r.requestedQuery = false; r.retryInfo = initRetryInfo(); } else { + logger.trace("setting reserve status to 'dormant' after query"); r.reserveStatus = ReserveRecordStatus.DORMANT; r.retryInfo = initRetryInfo(false); } @@ -622,7 +626,9 @@ async function updateReserve( ws.notify({ type: NotificationType.ReserveUpdated, updateSummary }); const reserve2 = await ws.db.get(Stores.reserves, reservePub); if (reserve2) { - logger.trace(`after db transaction, reserve status is ${reserve2.reserveStatus}`); + logger.trace( + `after db transaction, reserve status is ${reserve2.reserveStatus}`, + ); } return { ready: true }; } -- cgit v1.2.3