Skip to content

Commit 1e3f5f4

Browse files
authored
Added retry policy to activity info (#1788)
1 parent f54aa81 commit 1e3f5f4

File tree

4 files changed

+45
-1
lines changed

4 files changed

+45
-1
lines changed

packages/activity/src/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ import {
7979
Priority,
8080
ActivityCancellationDetails,
8181
IllegalStateError,
82+
RetryPolicy,
8283
} from '@temporalio/common';
8384
import { msToNumber } from '@temporalio/common/lib/time';
8485
import { SymbolBasedInstanceOfError } from '@temporalio/common/lib/type-helpers';
@@ -213,6 +214,14 @@ export interface Info {
213214
* Priority of this activity
214215
*/
215216
readonly priority?: Priority;
217+
/**
218+
* The retry policy of this activity.
219+
*
220+
* Note that the server may have set a different policy than the one provided when scheduling the activity.
221+
* If the value is undefined, it means the server didn't send information about retry policy (e.g. due to old server
222+
* version), but it may still be defined server-side.
223+
*/
224+
readonly retryPolicy?: RetryPolicy;
216225
}
217226

218227
/**

packages/test/src/test-local-activities.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
WorkflowHandle,
1010
WorkflowStartOptions,
1111
} from '@temporalio/client';
12-
import { LocalActivityOptions } from '@temporalio/common';
12+
import { LocalActivityOptions, RetryPolicy } from '@temporalio/common';
1313
import { msToNumber } from '@temporalio/common/lib/time';
1414
import { temporal } from '@temporalio/proto';
1515
import { workflowInterceptorModules } from '@temporalio/testing';
@@ -624,3 +624,36 @@ export const interceptors: workflow.WorkflowInterceptorsFactory = () => {
624624
],
625625
};
626626
};
627+
628+
export async function getRetryPolicyFromActivityInfo(
629+
retryPolicy: RetryPolicy,
630+
fromInsideLocal: boolean
631+
): Promise<object | undefined> {
632+
return await (fromInsideLocal
633+
? workflow.proxyLocalActivities({ startToCloseTimeout: '1m', retry: retryPolicy }).retryPolicy()
634+
: workflow.proxyActivities({ startToCloseTimeout: '1m', retry: retryPolicy }).retryPolicy());
635+
}
636+
637+
test.serial('retryPolicy is set correctly', async (t) => {
638+
const { executeWorkflow, createWorker } = helpers(t);
639+
const worker = await createWorker({
640+
activities: {
641+
async retryPolicy(): Promise<object | undefined> {
642+
return ActivityContext.current().info.retryPolicy;
643+
},
644+
},
645+
});
646+
647+
const retryPolicy: RetryPolicy = {
648+
backoffCoefficient: 1.5,
649+
initialInterval: 2.0,
650+
maximumAttempts: 3,
651+
maximumInterval: 10.0,
652+
nonRetryableErrorTypes: ['nonRetryableError'],
653+
};
654+
655+
await worker.runUntil(async () => {
656+
t.deepEqual(await executeWorkflow(getRetryPolicyFromActivityInfo, { args: [retryPolicy, true] }), retryPolicy);
657+
t.deepEqual(await executeWorkflow(getRetryPolicyFromActivityInfo, { args: [retryPolicy, false] }), retryPolicy);
658+
});
659+
});

packages/testing/src/mocking-activity-environment.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,5 @@ export const defaultActivityInfo: activity.Info = {
9696
scheduleToCloseTimeoutMs: 1000,
9797
currentAttemptScheduledTimestampMs: 1,
9898
priority: undefined,
99+
retryPolicy: undefined,
99100
};

packages/worker/src/worker.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2132,6 +2132,7 @@ async function extractActivityInfo(
21322132
'currentAttemptScheduledTime'
21332133
),
21342134
priority: decodePriority(start.priority),
2135+
retryPolicy: decompileRetryPolicy(start.retryPolicy),
21352136
};
21362137
}
21372138

0 commit comments

Comments
 (0)