@@ -186,11 +186,23 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) {
186186 }
187187 } else if e .Event == "STOP_ACTIVITY" {
188188 // once we make a smooth transition to "leave_RUNNING" in ControlWorkflows, this could be deleted.
189- runEndTime := strconv .FormatInt (time .Now ().UnixMilli (), 10 )
190- env .workflow .SetRuntimeVar ("run_end_time_ms" , runEndTime )
189+ endTime , ok := env .workflow .GetUserVars ().Get ("run_end_time_ms" )
190+ if ok && endTime == "" {
191+ runEndTime := strconv .FormatInt (time .Now ().UnixMilli (), 10 )
192+ env .workflow .SetRuntimeVar ("run_end_time_ms" , runEndTime )
193+ } else {
194+ log .WithField ("partition" , envId .String ()).
195+ Debug ("O2 End time already set before before_STOP_ACTIVITY" )
196+ }
191197 } else if e .Event == "GO_ERROR" {
192- runEndTime := strconv .FormatInt (time .Now ().UnixMilli (), 10 )
193- env .workflow .SetRuntimeVar ("run_end_time_ms" , runEndTime )
198+ endTime , ok := env .workflow .GetUserVars ().Get ("run_end_time_ms" )
199+ if ok && endTime == "" {
200+ runEndTime := strconv .FormatInt (time .Now ().UnixMilli (), 10 )
201+ env .workflow .SetRuntimeVar ("run_end_time_ms" , runEndTime )
202+ } else {
203+ log .WithField ("partition" , envId .String ()).
204+ Debug ("O2 End time already set before before_GO_ERROR" )
205+ }
194206 }
195207 errHooks := env .handleHooks (env .Workflow (), fmt .Sprintf ("before_%s" , e .Event ))
196208 if errHooks != nil {
@@ -200,8 +212,14 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) {
200212 "leave_state" : func (e * fsm.Event ) {
201213 // We might leave RUNNING not only through STOP_ACTIVITY. In such cases we also need a run stop time.
202214 if e .Src == "RUNNING" {
203- runEndTime := strconv .FormatInt (time .Now ().UnixMilli (), 10 )
204- env .workflow .SetRuntimeVar ("run_end_time_ms" , runEndTime )
215+ endTime , ok := env .workflow .GetUserVars ().Get ("run_end_time_ms" )
216+ if ok && endTime == "" {
217+ runEndTime := strconv .FormatInt (time .Now ().UnixMilli (), 10 )
218+ env .workflow .SetRuntimeVar ("run_end_time_ms" , runEndTime )
219+ } else {
220+ log .WithField ("partition" , envId .String ()).
221+ Debug ("O2 End time already set before leave_RUNNING" )
222+ }
205223 }
206224 errHooks := env .handleHooks (env .Workflow (), fmt .Sprintf ("leave_%s" , e .Src ))
207225 if errHooks != nil {
0 commit comments