Skip to content

Commit e830077

Browse files
committedApr 26, 2021
Add noise retry option
Fixes #1690
1 parent 1435985 commit e830077

File tree

3 files changed

+59
-2
lines changed

3 files changed

+59
-2
lines changed
 

‎source/core/calculate-retry-delay.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const calculateRetryDelay: Returns<RetryFunction, number> = ({
3939
}
4040
}
4141

42-
const noise = Math.random() * 100;
42+
const noise = Math.random() * retryOptions.noise;
4343
return Math.min(((2 ** (attemptCount - 1)) * 1000), retryOptions.backoffLimit) + noise;
4444
};
4545

‎source/core/options.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ export interface RetryOptions {
295295
errorCodes: string[];
296296
calculateDelay: RetryFunction;
297297
backoffLimit: number;
298+
noise: number;
298299
maxRetryAfter?: number;
299300
}
300301

@@ -618,7 +619,8 @@ const defaultInternals: Options['_internals'] = {
618619
],
619620
maxRetryAfter: undefined,
620621
calculateDelay: ({computedValue}) => computedValue,
621-
backoffLimit: Number.POSITIVE_INFINITY
622+
backoffLimit: Number.POSITIVE_INFINITY,
623+
noise: 100
622624
},
623625
localAddress: undefined,
624626
method: 'GET',
@@ -1785,6 +1787,11 @@ export default class Options {
17851787
assert.any([is.array, is.undefined], value.methods);
17861788
assert.any([is.array, is.undefined], value.statusCodes);
17871789
assert.any([is.array, is.undefined], value.errorCodes);
1790+
assert.any([is.number, is.undefined], value.noise);
1791+
1792+
if (value.noise && Math.abs(value.noise) > 100) {
1793+
throw new Error(`The maximum acceptable retry noise is +/- 100ms, got ${value.noise}`);
1794+
}
17881795

17891796
for (const key in value) {
17901797
if (!(key in this._internals.retry)) {

‎test/arguments.ts

+50
Original file line numberDiff line numberDiff line change
@@ -557,3 +557,53 @@ test('prefixUrl is properly replaced when extending', withServer, async (t, serv
557557

558558
t.is(await child.get('').text(), '/other/path/');
559559
});
560+
561+
test('throws on too large noise', t => {
562+
t.throws(() => {
563+
new Options({
564+
retry: {
565+
noise: 101
566+
}
567+
});
568+
}, {
569+
message: 'The maximum acceptable retry noise is +/- 100ms, got 101'
570+
});
571+
572+
t.throws(() => {
573+
new Options({
574+
retry: {
575+
noise: -101
576+
}
577+
});
578+
}, {
579+
message: 'The maximum acceptable retry noise is +/- 100ms, got -101'
580+
});
581+
582+
t.throws(() => {
583+
new Options({
584+
retry: {
585+
noise: Number.POSITIVE_INFINITY
586+
}
587+
});
588+
}, {
589+
message: 'The maximum acceptable retry noise is +/- 100ms, got Infinity'
590+
});
591+
592+
t.throws(() => {
593+
new Options({
594+
retry: {
595+
noise: Number.NEGATIVE_INFINITY
596+
}
597+
});
598+
}, {
599+
message: 'The maximum acceptable retry noise is +/- 100ms, got -Infinity'
600+
});
601+
602+
t.notThrows(() => {
603+
new Options({
604+
retry: {
605+
noise: 0
606+
}
607+
});
608+
});
609+
});

0 commit comments

Comments
 (0)
Please sign in to comment.