don't unnecessarily repeat reserve processing after recoup
This commit is contained in:
parent
9754109004
commit
c7a2abedba
@ -40,7 +40,7 @@ import {
|
|||||||
|
|
||||||
import { codecForRecoupConfirmation } from "../types/talerTypes";
|
import { codecForRecoupConfirmation } from "../types/talerTypes";
|
||||||
import { NotificationType } from "../types/notifications";
|
import { NotificationType } from "../types/notifications";
|
||||||
import { forceQueryReserve, getReserveRequestTimeout } from "./reserves";
|
import { forceQueryReserve, getReserveRequestTimeout, processReserve } from "./reserves";
|
||||||
|
|
||||||
import { Amounts } from "../util/amounts";
|
import { Amounts } from "../util/amounts";
|
||||||
import { createRefreshGroup, processRefreshGroup } from "./refresh";
|
import { createRefreshGroup, processRefreshGroup } from "./refresh";
|
||||||
@ -200,8 +200,13 @@ async function recoupWithdrawCoin(
|
|||||||
updatedCoin.status = CoinStatus.Dormant;
|
updatedCoin.status = CoinStatus.Dormant;
|
||||||
const currency = updatedCoin.currentAmount.currency;
|
const currency = updatedCoin.currentAmount.currency;
|
||||||
updatedCoin.currentAmount = Amounts.getZero(currency);
|
updatedCoin.currentAmount = Amounts.getZero(currency);
|
||||||
|
if (updatedReserve.reserveStatus === ReserveRecordStatus.DORMANT) {
|
||||||
updatedReserve.reserveStatus = ReserveRecordStatus.QUERYING_STATUS;
|
updatedReserve.reserveStatus = ReserveRecordStatus.QUERYING_STATUS;
|
||||||
updatedReserve.retryInfo = initRetryInfo();
|
updatedReserve.retryInfo = initRetryInfo();
|
||||||
|
} else {
|
||||||
|
updatedReserve.requestedQuery = true;
|
||||||
|
updatedReserve.retryInfo = initRetryInfo();
|
||||||
|
}
|
||||||
await tx.put(Stores.coins, updatedCoin);
|
await tx.put(Stores.coins, updatedCoin);
|
||||||
await tx.put(Stores.reserves, updatedReserve);
|
await tx.put(Stores.reserves, updatedReserve);
|
||||||
await putGroupAsFinished(ws, tx, recoupGroup, coinIdx);
|
await putGroupAsFinished(ws, tx, recoupGroup, coinIdx);
|
||||||
@ -211,10 +216,6 @@ async function recoupWithdrawCoin(
|
|||||||
ws.notify({
|
ws.notify({
|
||||||
type: NotificationType.RecoupFinished,
|
type: NotificationType.RecoupFinished,
|
||||||
});
|
});
|
||||||
|
|
||||||
forceQueryReserve(ws, reserve.reservePub).catch((e) => {
|
|
||||||
logger.error("re-querying reserve after recoup failed:", e);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function recoupRefreshCoin(
|
async function recoupRefreshCoin(
|
||||||
@ -341,6 +342,24 @@ async function processRecoupGroupImpl(
|
|||||||
processRecoup(ws, recoupGroupId, i),
|
processRecoup(ws, recoupGroupId, i),
|
||||||
);
|
);
|
||||||
await Promise.all(ps);
|
await Promise.all(ps);
|
||||||
|
|
||||||
|
const reserveSet = new Set<string>();
|
||||||
|
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(
|
export async function createRecoupGroup(
|
||||||
|
@ -291,7 +291,7 @@ export async function forceQueryReserve(
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
reserve.requestedQuery = true;
|
reserve.requestedQuery = true;
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
reserve.retryInfo = initRetryInfo();
|
reserve.retryInfo = initRetryInfo();
|
||||||
await tx.put(Stores.reserves, reserve);
|
await tx.put(Stores.reserves, reserve);
|
||||||
@ -601,13 +601,17 @@ async function updateReserve(
|
|||||||
logger.trace("setting reserve status to 'withdrawing' after query");
|
logger.trace("setting reserve status to 'withdrawing' after query");
|
||||||
r.reserveStatus = ReserveRecordStatus.WITHDRAWING;
|
r.reserveStatus = ReserveRecordStatus.WITHDRAWING;
|
||||||
r.retryInfo = initRetryInfo();
|
r.retryInfo = initRetryInfo();
|
||||||
|
r.requestedQuery = false;
|
||||||
} else {
|
} else {
|
||||||
logger.trace("setting reserve status to 'dormant' after query");
|
|
||||||
if (r.requestedQuery) {
|
if (r.requestedQuery) {
|
||||||
|
logger.trace(
|
||||||
|
"setting reserve status to 'querying-status' (requested query) after query",
|
||||||
|
);
|
||||||
r.reserveStatus = ReserveRecordStatus.QUERYING_STATUS;
|
r.reserveStatus = ReserveRecordStatus.QUERYING_STATUS;
|
||||||
r.requestedQuery = false;
|
r.requestedQuery = false;
|
||||||
r.retryInfo = initRetryInfo();
|
r.retryInfo = initRetryInfo();
|
||||||
} else {
|
} else {
|
||||||
|
logger.trace("setting reserve status to 'dormant' after query");
|
||||||
r.reserveStatus = ReserveRecordStatus.DORMANT;
|
r.reserveStatus = ReserveRecordStatus.DORMANT;
|
||||||
r.retryInfo = initRetryInfo(false);
|
r.retryInfo = initRetryInfo(false);
|
||||||
}
|
}
|
||||||
@ -622,7 +626,9 @@ async function updateReserve(
|
|||||||
ws.notify({ type: NotificationType.ReserveUpdated, updateSummary });
|
ws.notify({ type: NotificationType.ReserveUpdated, updateSummary });
|
||||||
const reserve2 = await ws.db.get(Stores.reserves, reservePub);
|
const reserve2 = await ws.db.get(Stores.reserves, reservePub);
|
||||||
if (reserve2) {
|
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 };
|
return { ready: true };
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user