273
ctx chasm.MutableContext,
274
req *schedulerpb.CreateFromMigrationStateRequest,
276
>
state := req.GetState()
277
>
278
>
// Default to a non-nil empty result, matching NewScheduler. Migrated state
279
>
// may carry no completion result (e.g. a schedule migrated before its first
280
>
// action), and startWorkflow dereferences LastCompletionResult unconditionally.
281
>
lastCompletion := state.GetLastCompletionResult()
282
>
if lastCompletion == nil {
283
lastCompletion = &schedulerpb.LastCompletionResult{}
284
}
285
287
>
SchedulerState: state.GetSchedulerState(),
288
>
cacheConflictToken: state.GetSchedulerState().GetConflictToken(),
289
>
Backfillers: make(chasm.Map[string, *Backfiller]),
290
>
LastCompletionResult: chasm.NewDataField(ctx, lastCompletion),
291
>
EventLog: chasm.NewComponentField(ctx, NewEventLog(ctx)),
292
>
}
293
>
sched.setNullableFields()
294
>
295
>
// These components won't start with any tasks, as stale running workflow entries
296
>
// can cause immediate computation after migration to drop actions due to overlap
297
>
// policy. Instead, SchedulerCallbacksTask fires both tasks after ensuring cached
298
>
// running workflow state is up-to-date.
299
>
sched.Invoker = chasm.NewComponentField(ctx, newInvokerWithState(ctx, state.GetInvokerState()))
300
>
sched.Generator = chasm.NewComponentField(ctx, newGeneratorWithState(ctx, state.GetGeneratorState()))
301
>
302
>
for backfillID, backfillerState := range state.GetBackfillers() {
303
sched.Backfillers[backfillID] = chasm.NewComponentField(ctx, newBackfillerWithState(ctx, backfillerState))
304
}
305
307
>
sched.Visibility = chasm.NewComponentField(ctx, visibility)
308
>
visibility.MergeCustomSearchAttributes(ctx, state.GetSearchAttributes())
309
>
visibility.MergeCustomMemo(ctx, state.GetMemo())
310
>
311
>
// Defer generation until SchedulerCallbacksTask resolves stale running-workflow
312
>
// state; if there are none, generate directly.
313
>
if slices.ContainsFunc(state.GetInvokerState().GetBufferedStarts(), needsCallback) {
314
ctx.AddTask(sched, chasm.TaskAttributes{}, &schedulerpb.SchedulerCallbacksTask{})
316
>
sched.Generator.Get(ctx).Generate(ctx)
317
>
}
318
320
}
321