commit e79cb11dc9890ca4b061d1de5118381ec843d186
parent 4b5367e23483965f83d9ea58528f654a583ba41a
Author: Florian Dold <florian@dold.me>
Date: Sat, 30 May 2026 00:06:21 +0200
fix excessive logging, make payment-share-idempotency test more robust
Diffstat:
5 files changed, 13 insertions(+), 34 deletions(-)
diff --git a/packages/taler-harness/src/harness/harness.ts b/packages/taler-harness/src/harness/harness.ts
@@ -1754,6 +1754,7 @@ export class ExchangeService implements ExchangeServiceInterface {
}
const cryptoEddsa = this.helperCryptoEddsaProc;
if (cryptoEddsa) {
+ logger.info(`stopping eddsa helper`);
cryptoEddsa.proc.kill("SIGTERM");
await cryptoEddsa.wait();
this.helperCryptoRsaProc = undefined;
diff --git a/packages/taler-harness/src/integrationtests/test-payment-share-idempotency.ts b/packages/taler-harness/src/integrationtests/test-payment-share-idempotency.ts
@@ -171,16 +171,25 @@ export async function runPaymentShareIdempotencyTest(t: GlobalTestState) {
claimSecondWalletAgain.status === PreparePayResultType.PaymentPossible,
);
+ // Preparing the payment must return the same transaction ID here.
+ t.assertTrue(
+ claimSecondWallet.transactionId === claimSecondWalletAgain.transactionId,
+ );
+
t.logStep("w2-claimed-again");
+ console.log(`confirming ${claimSecondWalletAgain.transactionId}`);
+
// pay from the second wallet
const r2 = await secondWallet.call(WalletApiOperation.ConfirmPay, {
transactionId: claimSecondWalletAgain.transactionId,
});
+ t.logStep("w2-confirmed");
+
t.assertTrue(r2.type === ConfirmPayResultType.Done);
- t.logStep("w2-confirmed");
+ t.logStep("w2-confirmed-checked");
// Wait for refresh to settle before we do checks
await secondWallet.call(
diff --git a/packages/taler-wallet-core/src/coinSelection.ts b/packages/taler-wallet-core/src/coinSelection.ts
@@ -225,14 +225,6 @@ async function internalSelectPayCoins(
const wireFeesPerExchange = candidateRes.currentWireFeePerExchange;
const candidateDenoms = candidateRes.coinAvailability;
- if (logger.shouldLogTrace()) {
- logger.trace(
- `instructed amount: ${Amounts.stringify(req.contractTermsAmount)}`,
- );
- logger.trace(`wire fees per exchange: ${j2s(wireFeesPerExchange)}`);
- logger.trace(`candidates: ${j2s(candidateDenoms)}`);
- }
-
const coinRes: SelectedCoin[] = [];
const currency = contractTermsAmount.currency;
@@ -363,10 +355,6 @@ export async function selectPayCoinsInTx(
materialAvSel.tally,
);
- if (logger.shouldLogTrace()) {
- logger.trace(`coin selection: ${j2s(coinSel)}`);
- }
-
return {
type: "success",
coinSel,
@@ -453,7 +441,6 @@ async function assembleSelectPayCoinsSuccessResult(
selInfo.maxAge,
CoinStatus.Fresh,
];
- logger.trace(`query: ${j2s(query)}`);
const coins =
await tx.coins.indexes.byExchangeDenomPubHashAndAgeAndStatus.getAll(
query,
@@ -1296,12 +1283,6 @@ async function internalSelectPeerCoins(
wireFeesPerExchange: {},
});
- if (logger.shouldLogTrace()) {
- logger.trace(`candidates: ${j2s(candidates)}`);
- logger.trace(`instructedAmount: ${j2s(req.instructedAmount)}`);
- logger.trace(`tally: ${j2s(tally)}`);
- }
-
const selRes = selectGreedy(
{
wireFeesPerExchange: {},
diff --git a/packages/taler-wallet-core/src/pay-merchant.ts b/packages/taler-wallet-core/src/pay-merchant.ts
@@ -2993,7 +2993,7 @@ export async function confirmPay(
}
// In case we're sharing the payment and we're long-polling
- wex.taskScheduler.stopShepherdTask(ctx.taskId);
+ await wex.taskScheduler.resetTask(ctx.taskId);
// This will become the default behavior on the future.
if (wex.ws.devExperimentState.flagConfirmPayNoWait) {
diff --git a/packages/taler-wallet-core/src/withdraw.ts b/packages/taler-wallet-core/src/withdraw.ts
@@ -1267,7 +1267,7 @@ export async function getWithdrawableDenomsTx(
if (logger.shouldLogTrace()) {
const maxStr = maxAmount ? Amounts.stringify(maxAmount) : "<unknown>";
logger.trace(
- `getting withdrawable denoms for ${currency} / ${maxStr} at ${exchangeBaseUrl}`,
+ `getting withdrawable denoms for ${currency} / max=${maxStr} at ${exchangeBaseUrl}`,
);
logger.trace(`have ${allFamilies.length} families`);
}
@@ -1287,9 +1287,6 @@ export async function getWithdrawableDenomsTx(
// Denom value too high, no point in selecting.
continue;
}
- if (logger.shouldLogTrace()) {
- logger.trace(`finding representative for denom family: ${j2s(fam)}`);
- }
const fpSerial = fam.denominationFamilySerial;
checkDbInvariant(typeof fpSerial === "number", "denominationFamilySerial");
// Now we need to find a representative denom for the family.
@@ -1306,28 +1303,22 @@ export async function getWithdrawableDenomsTx(
(dr0.value.denominationFamilySerial === fpSerial &&
dr0.value.stampExpireWithdraw < dbNow)
) {
- logger.trace(`continuing cursor past ${j2s([fpSerial, dbNow])}`);
denomCursor.continue([fpSerial, dbNow]);
}
while (1) {
const dr = await denomCursor.current();
if (!dr.hasValue) {
- logger.trace(`cursor exhausted`);
break;
}
if (dr.value.denominationFamilySerial != fpSerial) {
// Cursor went to next serial already, we need to stop.
- logger.trace(`cursor past target`);
break;
}
- logger.trace(`considering ${j2s(dr.value)}`);
if (isCandidateWithdrawableDenomRec(dr.value)) {
denom = dr.value;
break;
}
- logger.trace(`continuing cursor to next record`);
-
denomCursor.continue();
}
if (denom) {
@@ -1338,9 +1329,6 @@ export async function getWithdrawableDenomsTx(
}
}
relevantDenoms.sort((d1, d2) => Amounts.cmp(d2.value, d1.value));
- if (logger.shouldLogTrace()) {
- logger.trace(`relevant denoms: ${j2s(relevantDenoms)}`);
- }
for (const denom of relevantDenoms) {
if (denom.exchangeBaseUrl != exchangeBaseUrl) {
throw Error(