commit 92674b3c9747648e050784554c294434e874b684
parent 8afb4942915e80569e18bd179f5e7e27f133d4c1
Author: Florian Dold <florian@dold.me>
Date: Thu, 9 Jul 2026 22:03:37 +0200
limit timeouts in task shepherd
Diffstat:
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/packages/taler-wallet-core/src/shepherd.ts b/packages/taler-wallet-core/src/shepherd.ts
@@ -413,6 +413,10 @@ export class TaskSchedulerImpl implements TaskScheduler {
info: ShepherdInfo,
delay: Duration,
): Promise<void> {
+ // Limit how long we wait.
+ // The NodeJS runtime doesn't like very long timeouts.
+ delay = Duration.min(delay, Duration.fromSpec({ hours: 1 }));
+ logger.trace(`Waiting on ${taskId} (scheduled later)`);
try {
const op = openPromise<void>();
info.interruptWait = () => op.resolve();
@@ -498,9 +502,7 @@ export class TaskSchedulerImpl implements TaskScheduler {
);
const t = timestampAbsoluteFromDb(retryRecord.retryInfo.nextRetry);
const delay = AbsoluteTime.remaining(t);
- logger.trace(
- `Stored error for ${taskId}, waiting for ${delay.d_ms} ms`,
- );
+ logger.trace(`Stored error for ${taskId},`);
info.taskState = TaskState.WaitingBackoff;
await this.wait(taskId, info, delay);
break;
@@ -509,7 +511,7 @@ export class TaskSchedulerImpl implements TaskScheduler {
const retryRecord = await storePendingTaskPending(this.ws, taskId);
const t = timestampAbsoluteFromDb(retryRecord.retryInfo.nextRetry);
const delay = AbsoluteTime.remaining(t);
- logger.trace(`Waiting for ${delay.d_ms} ms`);
+ logger.trace(`Waiting on ${taskId} (backoff)`);
info.taskState = TaskState.WaitingBackoff;
await this.wait(taskId, info, delay);
break;
@@ -526,7 +528,7 @@ export class TaskSchedulerImpl implements TaskScheduler {
);
const t = timestampAbsoluteFromDb(retryRecord.retryInfo.nextRetry);
const delay = AbsoluteTime.remaining(t);
- logger.trace(`Waiting for ${delay.d_ms} ms`);
+ logger.trace(`Waiting on ${taskId} (scheduled later)`);
info.taskState = TaskState.WaitingScheduled;
await this.wait(taskId, info, delay);
break;