@@ -11,6 +11,7 @@ import (
1111 enumsspb "go.temporal.io/server/api/enums/v1"
1212 "go.temporal.io/server/chasm"
1313 "go.temporal.io/server/common"
14+ "go.temporal.io/server/common/contextutil"
1415 "go.temporal.io/server/common/convert"
1516 "go.temporal.io/server/common/definition"
1617 "go.temporal.io/server/common/headers"
@@ -108,6 +109,69 @@ func (e *ChasmEngine) NotifyExecution(key chasm.ExecutionKey) {
108109 e .notifier .Notify (key )
109110}
110111
112+ func (e * ChasmEngine ) setContextMetadata (
113+ ctx context.Context ,
114+ chasmTree * chasm.Node ,
115+ ) chasm.Context {
116+ chasmContext := chasm .NewContext (ctx , chasmTree )
117+
118+ rootComponent , err := chasmTree .Component (chasmContext , chasm.ComponentRef {})
119+ if err != nil {
120+ executionKey := chasmContext .ExecutionKey ()
121+ e .logger .Error (
122+ "Failed to resolve CHASM root component for context metadata" ,
123+ tag .WorkflowNamespaceID (executionKey .NamespaceID ),
124+ tag .WorkflowID (executionKey .BusinessID ),
125+ tag .WorkflowRunID (executionKey .RunID ),
126+ tag .Error (err ),
127+ )
128+ return chasmContext
129+ }
130+
131+ root , ok := rootComponent .(chasm.RootComponent )
132+ if ! ok {
133+ softassert .Fail (
134+ e .logger ,
135+ "root node must implement RootComponent interface" ,
136+ tag .NewStringTag ("component_type" , fmt .Sprintf ("%T" , rootComponent )),
137+ )
138+ return chasmContext
139+ }
140+
141+ for key , value := range root .ContextMetadata (chasmContext ) {
142+ contextutil .ContextMetadataSet (ctx , key , value )
143+ }
144+
145+ return chasmContext
146+ }
147+
148+ func chasmTreeFromMutableState (
149+ logger log.Logger ,
150+ mutableState historyi.MutableState ,
151+ ) (* chasm.Node , error ) {
152+ chasmTree , ok := mutableState .ChasmTree ().(* chasm.Node )
153+ if ! ok {
154+ return nil , softassert .UnexpectedInternalErr (
155+ logger ,
156+ "CHASM tree implementation not properly wired up" ,
157+ fmt .Errorf ("encountered type: %T, expected type: %T" , mutableState .ChasmTree (), & chasm.Node {}),
158+ )
159+ }
160+ return chasmTree , nil
161+ }
162+
163+ func (e * ChasmEngine ) setContextMetadataFromMutableState (
164+ ctx context.Context ,
165+ mutableState historyi.MutableState ,
166+ ) {
167+ chasmTree , err := chasmTreeFromMutableState (e .logger , mutableState )
168+ if err != nil {
169+ e .logger .Error ("Failed to resolve CHASM tree for context metadata" , tag .Error (err ))
170+ return
171+ }
172+ e .setContextMetadata (ctx , chasmTree )
173+ }
174+
111175func (e * ChasmEngine ) StartExecution (
112176 ctx context.Context ,
113177 executionRef chasm.ComponentRef ,
@@ -177,6 +241,7 @@ func (e *ChasmEngine) startExecution(
177241 return chasm.StartExecutionResult {}, err
178242 }
179243 if ! hasCurrentRun {
244+ e .setContextMetadataFromMutableState (ctx , newExecutionParams .mutableState )
180245 serializedRef , err := newExecutionParams .executionRef .Serialize (e .registry )
181246 if err != nil {
182247 // Created is true here because persistAsBrandNew succeeded, but we failed to serialize the ref.
@@ -354,13 +419,9 @@ func (e *ChasmEngine) applyUpdateWithLease(
354419 updateFn func (chasm.MutableContext , chasm.Component ) error ,
355420) ([]byte , error ) {
356421 mutableState := executionLease .GetMutableState ()
357- chasmTree , ok := mutableState .ChasmTree ().(* chasm.Node )
358- if ! ok {
359- return nil , serviceerror .NewInternalf (
360- "CHASM tree implementation not properly wired up, encountered type: %T, expected type: %T" ,
361- mutableState .ChasmTree (),
362- & chasm.Node {},
363- )
422+ chasmTree , err := chasmTreeFromMutableState (shardContext .GetLogger (), mutableState )
423+ if err != nil {
424+ return nil , err
364425 }
365426
366427 mutableContext := chasm .NewMutableContext (ctx , chasmTree )
@@ -375,6 +436,8 @@ func (e *ChasmEngine) applyUpdateWithLease(
375436
376437 // TODO: Support WithSpeculative() TransitionOption.
377438
439+ e .setContextMetadata (ctx , chasmTree )
440+
378441 if err := executionLease .GetContext ().UpdateWorkflowExecutionAsActive (
379442 ctx ,
380443 shardContext ,
@@ -438,6 +501,8 @@ func (e *ChasmEngine) startAndUpdateExecution(
438501 return chasm.ExecutionKey {}, nil , false , currentRunInfo .CurrentWorkflowConditionFailedError
439502 }
440503
504+ e .setContextMetadataFromMutableState (ctx , newExecutionParams .mutableState )
505+
441506 serializedRef , err := newExecutionParams .executionRef .Serialize (e .registry )
442507
443508 return newExecutionParams .executionRef .ExecutionKey , serializedRef , true , err
@@ -502,6 +567,8 @@ func (e *ChasmEngine) deleteExecution(
502567 mutableState := executionLease .GetMutableState ()
503568 we := mutableState .GetWorkflowKey ()
504569
570+ e .setContextMetadataFromMutableState (ctx , mutableState )
571+
505572 log .With (shardContext .GetLogger (),
506573 tag .WorkflowNamespaceID (ref .NamespaceID ),
507574 tag .WorkflowID (we .WorkflowID ),
@@ -580,16 +647,12 @@ func (e *ChasmEngine) readComponent(
580647 executionLease .GetReleaseFn ()(nil )
581648 }()
582649
583- chasmTree , ok := executionLease .GetMutableState ().ChasmTree ().(* chasm.Node )
584- if ! ok {
585- return serviceerror .NewInternalf (
586- "CHASM tree implementation not properly wired up, encountered type: %T, expected type: %T" ,
587- executionLease .GetMutableState ().ChasmTree (),
588- & chasm.Node {},
589- )
650+ chasmTree , err := chasmTreeFromMutableState (e .logger , executionLease .GetMutableState ())
651+ if err != nil {
652+ return err
590653 }
591654
592- chasmContext := chasm . NewContext (ctx , chasmTree )
655+ chasmContext := e . setContextMetadata (ctx , chasmTree )
593656 component , err := chasmTree .Component (chasmContext , ref )
594657 if err != nil {
595658 return err
@@ -686,16 +749,13 @@ func (e *ChasmEngine) predicateSatisfied(
686749 ref chasm.ComponentRef ,
687750 executionLease api.WorkflowLease ,
688751) ([]byte , error ) {
689- chasmTree , ok := executionLease .GetMutableState ().ChasmTree ().(* chasm.Node )
690- if ! ok {
691- return nil , serviceerror .NewInternalf (
692- "CHASM tree implementation not properly wired up, encountered type: %T, expected type: %T" ,
693- executionLease .GetMutableState ().ChasmTree (),
694- & chasm.Node {},
695- )
752+ chasmTree , err := chasmTreeFromMutableState (e .logger , executionLease .GetMutableState ())
753+ if err != nil {
754+ return nil , err
696755 }
697756
698- chasmContext := chasm .NewContext (ctx , chasmTree )
757+ chasmContext := e .setContextMetadata (ctx , chasmTree )
758+
699759 component , err := chasmTree .Component (chasmContext , ref )
700760 if err != nil {
701761 return nil , err
@@ -1052,6 +1112,8 @@ func (e *ChasmEngine) handleReusePolicy(
10521112 return chasm.StartExecutionResult {}, err
10531113 }
10541114
1115+ e .setContextMetadataFromMutableState (ctx , newExecutionParams .mutableState )
1116+
10551117 serializedRef , err := newExecutionParams .executionRef .Serialize (e .registry )
10561118 if err != nil {
10571119 return chasm.StartExecutionResult {ExecutionKey : newExecutionParams .executionRef .ExecutionKey , Created : true }, err
0 commit comments