@@ -127,13 +127,30 @@ func (d *WorkflowRunner) updateVersionSummary(summary *deploymentspb.WorkerDeplo
127127}
128128
129129func (d * WorkflowRunner ) run (ctx workflow.Context ) error {
130- if d .GetState ().GetCreateTime () == nil {
130+ // TODO(carlydf): remove verbose logging
131+ d .logger .Info ("Raw workflow state at start" ,
132+ "state_nil" , d .State == nil ,
133+ "create_time_nil" , d .GetState ().GetCreateTime () == nil ,
134+ "routing_config_nil" , d .GetState ().GetRoutingConfig () == nil ,
135+ "raw_state" , d .State ,
136+ "workflow_id" , workflow .GetInfo (ctx ).WorkflowExecution .ID ,
137+ "run_id" , workflow .GetInfo (ctx ).WorkflowExecution .RunID )
138+
139+ if d .GetState ().GetCreateTime () == nil ||
140+ d .GetState ().GetRoutingConfig () == nil ||
141+ d .GetState ().GetConflictToken () == nil {
131142 if d .State == nil {
132143 d .State = & deploymentspb.WorkerDeploymentLocalState {}
133144 }
134- d .State .CreateTime = timestamppb .New (workflow .Now (ctx ))
135- d .State .RoutingConfig = & deploymentpb.RoutingConfig {CurrentVersion : worker_versioning .UnversionedVersionId }
136- d .State .ConflictToken , _ = workflow .Now (ctx ).MarshalBinary ()
145+ if d .State .CreateTime == nil {
146+ d .State .CreateTime = timestamppb .New (workflow .Now (ctx ))
147+ }
148+ if d .State .RoutingConfig == nil {
149+ d .State .RoutingConfig = & deploymentpb.RoutingConfig {CurrentVersion : worker_versioning .UnversionedVersionId }
150+ }
151+ if d .State .ConflictToken == nil {
152+ d .State .ConflictToken , _ = workflow .Now (ctx ).MarshalBinary ()
153+ }
137154
138155 // updating the memo since the RoutingConfig is updated
139156 if err := d .updateMemo (ctx ); err != nil {
@@ -144,6 +161,15 @@ func (d *WorkflowRunner) run(ctx workflow.Context) error {
144161 d .State .Versions = make (map [string ]* deploymentspb.WorkerDeploymentVersionSummary )
145162 }
146163
164+ // TODO(carlydf): remove verbose logging
165+ d .logger .Info ("Starting workflow run" ,
166+ "create_time" , d .State .GetCreateTime (),
167+ "routing_config" , d .State .GetRoutingConfig (),
168+ //nolint:staticcheck // SA1019: worker versioning v0.31
169+ "current_version" , d .State .GetRoutingConfig ().GetCurrentVersion (),
170+ //nolint:staticcheck // SA1019: worker versioning v0.31
171+ "ramping_version" , d .State .GetRoutingConfig ().GetRampingVersion ())
172+
147173 err := workflow .SetQueryHandler (ctx , QueryDescribeDeployment , func () (* deploymentspb.QueryDescribeWorkerDeploymentResponse , error ) {
148174 return & deploymentspb.QueryDescribeWorkerDeploymentResponse {
149175 State : d .State ,
@@ -224,10 +250,25 @@ func (d *WorkflowRunner) run(ctx workflow.Context) error {
224250 // Wait until we can continue as new or are cancelled. The workflow will continue-as-new iff
225251 // there are no pending updates/signals and the state has changed.
226252 err = workflow .Await (ctx , func () bool {
227- return d .deleteDeployment || // deployment is deleted -> it's ok to drop all signals and updates.
253+ canContinue := d .deleteDeployment || // deployment is deleted -> it's ok to drop all signals and updates.
228254 // There is no pending signal or update, but the state is dirty or forceCaN is requested:
229255 (! d .signalHandler .signalSelector .HasPending () && d .signalHandler .processingSignals == 0 && workflow .AllHandlersFinished (ctx ) &&
230256 (d .forceCAN || d .stateChanged ))
257+
258+ // TODO(carlydf): remove verbose logging
259+ if canContinue {
260+ d .logger .Info ("Workflow can continue as new" ,
261+ "workflow_id" , workflow .GetInfo (ctx ).WorkflowExecution .ID ,
262+ "run_id" , workflow .GetInfo (ctx ).WorkflowExecution .RunID ,
263+ "delete_deployment" , d .deleteDeployment ,
264+ "has_pending_signals" , d .signalHandler .signalSelector .HasPending (),
265+ "processing_signals" , d .signalHandler .processingSignals ,
266+ "all_handlers_finished" , workflow .AllHandlersFinished (ctx ),
267+ "force_can" , d .forceCAN ,
268+ "state_changed" , d .stateChanged ,
269+ "routing_config" , d .State .GetRoutingConfig ())
270+ }
271+ return canContinue
231272 })
232273 if err != nil {
233274 return err
@@ -237,6 +278,19 @@ func (d *WorkflowRunner) run(ctx workflow.Context) error {
237278 return nil
238279 }
239280
281+ // TODO(carlydf): remove verbose logging
282+ d .logger .Info ("Continuing workflow as new" ,
283+ "create_time" , d .State .GetCreateTime (),
284+ "routing_config" , d .State .GetRoutingConfig (),
285+ //nolint:staticcheck // SA1019: worker versioning v0.31
286+ "current_version" , d .State .GetRoutingConfig ().GetCurrentVersion (),
287+ //nolint:staticcheck // SA1019: worker versioning v0.31
288+ "ramping_version" , d .State .GetRoutingConfig ().GetRampingVersion (),
289+ "state_changed" , d .stateChanged ,
290+ "force_can" , d .forceCAN ,
291+ "workflow_id" , workflow .GetInfo (ctx ).WorkflowExecution .ID ,
292+ "run_id" , workflow .GetInfo (ctx ).WorkflowExecution .RunID )
293+
240294 // We perform a continue-as-new after each update and signal is handled to ensure compatibility
241295 // even if the server rolls back to a previous minor version. By continuing-as-new,
242296 // we pass the current state as input to the next workflow execution, resulting in a new
@@ -338,19 +392,23 @@ func (d *WorkflowRunner) handleDeleteDeployment(ctx workflow.Context) error {
338392}
339393
340394func (d * WorkflowRunner ) validateStateBeforeAcceptingRampingUpdate (args * deploymentspb.SetRampingVersionArgs ) error {
341- if args .Version == d .State .RoutingConfig .RampingVersion && args .Percentage == d .State .RoutingConfig .RampingVersionPercentage && args .Identity == d .State .LastModifierIdentity {
342- return temporal .NewApplicationError ("version already ramping, no change" , errNoChangeType , d .State .ConflictToken )
395+ //nolint:staticcheck // SA1019: worker versioning v0.31
396+ if args .Version == d .State .GetRoutingConfig ().GetRampingVersion () &&
397+ args .Percentage == d .State .GetRoutingConfig ().GetRampingVersionPercentage () &&
398+ args .Identity == d .State .GetLastModifierIdentity () {
399+ return temporal .NewApplicationError ("version already ramping, no change" , errNoChangeType , d .State .GetConflictToken ())
343400 }
344401
345- if args .ConflictToken != nil && ! bytes .Equal (args .ConflictToken , d .State .ConflictToken ) {
402+ if args .ConflictToken != nil && ! bytes .Equal (args .ConflictToken , d .State .GetConflictToken () ) {
346403 return temporal .NewApplicationError ("conflict token mismatch" , errFailedPrecondition )
347404 }
348- if args .Version == d .State .RoutingConfig .CurrentVersion {
405+ //nolint:staticcheck // SA1019: worker versioning v0.31
406+ if args .Version == d .State .GetRoutingConfig ().GetCurrentVersion () {
349407 d .logger .Info ("version can't be set to ramping since it is already current" )
350408 return temporal .NewApplicationError (fmt .Sprintf ("requested ramping version %s is already current" , args .Version ), errFailedPrecondition )
351409 }
352410
353- if _ , ok := d .State .Versions [args .Version ]; ! ok && args .Version != "" && args .Version != worker_versioning .UnversionedVersionId {
411+ if _ , ok := d .State .GetVersions () [args .Version ]; ! ok && args .Version != "" && args .Version != worker_versioning .UnversionedVersionId {
354412 d .logger .Info ("version not found in deployment" )
355413 return temporal .NewApplicationError (fmt .Sprintf ("requested ramping version %s not found in deployment" , args .Version ), errFailedPrecondition )
356414 }
@@ -579,7 +637,8 @@ func (d *WorkflowRunner) handleDeleteVersion(ctx workflow.Context, args *deploym
579637}
580638
581639func (d * WorkflowRunner ) validateStateBeforeAcceptingSetCurrent (args * deploymentspb.SetCurrentVersionArgs ) error {
582- if d .State .RoutingConfig .CurrentVersion == args .Version && d .State .LastModifierIdentity == args .Identity {
640+ //nolint:staticcheck // SA1019: worker versioning v0.31
641+ if d .State .GetRoutingConfig ().GetCurrentVersion () == args .Version && d .State .GetLastModifierIdentity () == args .Identity {
583642 return temporal .NewApplicationError ("no change" , errNoChangeType , d .State .ConflictToken )
584643 }
585644 if args .ConflictToken != nil && ! bytes .Equal (args .ConflictToken , d .State .ConflictToken ) {
@@ -609,6 +668,14 @@ func (d *WorkflowRunner) handleSetCurrent(ctx workflow.Context, args *deployment
609668 d .lock .Unlock ()
610669 }()
611670
671+ // Log state before update
672+ // TODO(carlydf): remove verbose logging
673+ d .logger .Info ("Starting SetCurrent update" ,
674+ //nolint:staticcheck // SA1019: worker versioning v0.31
675+ "current_version" , d .State .GetRoutingConfig ().GetCurrentVersion (),
676+ "new_version" , args .Version ,
677+ "routing_config" , d .State .GetRoutingConfig ())
678+
612679 // Validating the state before starting the SetCurrent operation. This is required due to the following reason:
613680 // The validator accepts/rejects updates based on the state of the deployment workflow. Theoretically, two concurrent update requests
614681 // might be accepted by the validator since the state of the workflow, at that point in time, is valid for the updates to take place. Since this update handler
@@ -955,6 +1022,14 @@ func (d *WorkflowRunner) newUUID(ctx workflow.Context) string {
9551022}
9561023
9571024func (d * WorkflowRunner ) updateMemo (ctx workflow.Context ) error {
1025+ // TODO(carlydf): remove verbose logging
1026+ d .logger .Info ("Updating workflow memo" ,
1027+ "routing_config" , d .State .GetRoutingConfig (),
1028+ //nolint:staticcheck // SA1019: worker versioning v0.31
1029+ "current_version" , d .State .GetRoutingConfig ().GetCurrentVersion (),
1030+ //nolint:staticcheck // SA1019: worker versioning v0.31
1031+ "ramping_version" , d .State .GetRoutingConfig ().GetRampingVersion ())
1032+
9581033 return workflow .UpsertMemo (ctx , map [string ]any {
9591034 WorkerDeploymentMemoField : & deploymentspb.WorkerDeploymentWorkflowMemo {
9601035 DeploymentName : d .DeploymentName ,
0 commit comments