Skip to content

Commit e93879c

Browse files
committed
feat: add attemptDeadlineSeconds support to scheduled functions
1 parent 363d3f8 commit e93879c

File tree

6 files changed

+47
-0
lines changed

6 files changed

+47
-0
lines changed

src/deploy/functions/backend.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export interface ScheduleTrigger {
2323
schedule?: string;
2424
timeZone?: string | null;
2525
retryConfig?: ScheduleRetryConfig | null;
26+
attemptDeadlineSeconds?: number | null;
2627
}
2728

2829
/** Something that has a ScheduleTrigger */

src/deploy/functions/build.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ export interface ScheduleTrigger {
147147
schedule: string | Expression<string>;
148148
timeZone?: Field<string>;
149149
retryConfig?: ScheduleRetryConfig | null;
150+
attemptDeadlineSeconds?: Field<number>;
150151
}
151152

152153
export type HttpsTriggered = { httpsTrigger: HttpsTrigger };
@@ -603,6 +604,11 @@ function discoverTrigger(endpoint: Endpoint, region: string, r: Resolver): backe
603604
} else if (endpoint.scheduleTrigger.retryConfig === null) {
604605
bkSchedule.retryConfig = null;
605606
}
607+
if (endpoint.scheduleTrigger.attemptDeadlineSeconds) {
608+
bkSchedule.attemptDeadlineSeconds = r.resolveInt(
609+
endpoint.scheduleTrigger.attemptDeadlineSeconds,
610+
);
611+
}
606612
return { scheduleTrigger: bkSchedule };
607613
} else if ("taskQueueTrigger" in endpoint) {
608614
const taskQueueTrigger: backend.TaskQueueTrigger = {};

src/deploy/functions/runtimes/discovery/v1alpha1.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,7 @@ describe("buildFromV1Alpha", () => {
716716
maxRetrySeconds: 120,
717717
maxDoublings: 10,
718718
},
719+
attemptDeadlineSeconds: 300,
719720
};
720721

721722
const yaml: v1alpha1.WireManifest = {
@@ -744,6 +745,7 @@ describe("buildFromV1Alpha", () => {
744745
maxRetrySeconds: "{{ params.RETRY_DURATION }}",
745746
maxDoublings: "{{ params.DOUBLINGS }}",
746747
},
748+
attemptDeadlineSeconds: "{{ params.ATTEMPT_DEADLINE }}",
747749
};
748750

749751
const yaml: v1alpha1.WireManifest = {

src/deploy/functions/runtimes/discovery/v1alpha1.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ function assertBuildEndpoint(ep: WireEndpoint, id: string): void {
222222
schedule: "Field<string>",
223223
timeZone: "Field<string>?",
224224
retryConfig: "object?",
225+
attemptDeadlineSeconds: "Field<number>?",
225226
});
226227
if (ep.scheduleTrigger.retryConfig) {
227228
assertKeyTypes(prefix + ".scheduleTrigger.retryConfig", ep.scheduleTrigger.retryConfig, {
@@ -377,6 +378,7 @@ function parseEndpointForBuild(
377378
} else if (ep.scheduleTrigger.retryConfig === null) {
378379
st.retryConfig = null;
379380
}
381+
copyIfPresent(st, ep.scheduleTrigger, "attemptDeadlineSeconds");
380382
triggered = { scheduleTrigger: st };
381383
} else if (build.isTaskQueueTriggered(ep)) {
382384
const tq: build.TaskQueueTrigger = {};

src/gcp/cloudscheduler.spec.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,5 +283,32 @@ describe("cloudscheduler", () => {
283283
},
284284
});
285285
});
286+
287+
it("should copy attemptDeadlineSeconds for v1 endpoints", async () => {
288+
expect(
289+
await cloudscheduler.jobFromEndpoint(
290+
{
291+
...V1_ENDPOINT,
292+
scheduleTrigger: {
293+
schedule: "every 1 minutes",
294+
attemptDeadlineSeconds: 300,
295+
},
296+
},
297+
"appEngineLocation",
298+
"1234567",
299+
),
300+
).to.deep.equal({
301+
name: "projects/project/locations/appEngineLocation/jobs/firebase-schedule-id-region",
302+
schedule: "every 1 minutes",
303+
timeZone: "America/Los_Angeles",
304+
attemptDeadline: "300s",
305+
pubsubTarget: {
306+
topicName: "projects/project/topics/firebase-schedule-id-region",
307+
attributes: {
308+
scheduled: "true",
309+
},
310+
},
311+
});
312+
});
286313
});
287314
});

src/gcp/cloudscheduler.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export interface Job {
5555
schedule: string;
5656
description?: string;
5757
timeZone?: string | null;
58+
attemptDeadline?: string | null;
5859

5960
// oneof target
6061
httpTarget?: HttpTarget;
@@ -195,6 +196,9 @@ function needUpdate(existingJob: Job, newJob: Job): boolean {
195196
if (existingJob.timeZone !== newJob.timeZone) {
196197
return true;
197198
}
199+
if (existingJob.attemptDeadline !== newJob.attemptDeadline) {
200+
return true;
201+
}
198202
if (newJob.retryConfig) {
199203
if (!existingJob.retryConfig) {
200204
return true;
@@ -258,6 +262,11 @@ export async function jobFromEndpoint(
258262
);
259263
}
260264
job.schedule = endpoint.scheduleTrigger.schedule;
265+
if (endpoint.scheduleTrigger.attemptDeadlineSeconds) {
266+
job.attemptDeadline = proto.durationFromSeconds(
267+
endpoint.scheduleTrigger.attemptDeadlineSeconds,
268+
);
269+
}
261270
if (endpoint.scheduleTrigger.retryConfig) {
262271
job.retryConfig = {};
263272
proto.copyIfPresent(

0 commit comments

Comments
 (0)