@@ -474,32 +474,41 @@ func (svc WorkerService) GetAllWorkflowsLocks() ([]string, error) {
474474 return svc .locker .GetAllWorkflowsLocks (svc .ctx )
475475}
476476
477- func (svc WorkerService ) ReleaseLocks (key string ) error {
478- keyParts := strings .Split (key , ":" )
479- if len (keyParts ) != 3 {
480- return fmt .Errorf ("invalid lock key format: %s" , key )
481- }
482-
483- nodeID , err := strconv .ParseUint (keyParts [1 ], 10 , 32 )
484- if err != nil {
485- return fmt .Errorf ("invalid node ID: %w" , err )
486- }
487-
488- workflowID := keyParts [2 ]
489- workflow , err := svc .ewfEngine .Store ().LoadWorkflowByUUID (svc .ctx , workflowID )
490- if err != nil {
491- return fmt .Errorf ("failed to load workflow by UUID: %w" , err )
492- }
477+ func (svc WorkerService ) ReleaseLocks (keys []string ) {
478+ log := logger .ForOperation ("locks_worker" , "release_locks" )
479+ workflowsNodes := map [string ][]uint32 {}
480+ for _ , key := range keys {
481+ parts := strings .Split (key , ":" )
482+ if len (parts ) != 3 {
483+ log .Error ().Str ("key" , key ).Msg ("invalid lock key format" )
484+ continue
485+ }
493486
494- if ! slices .Contains ([]ewf.WorkflowStatus {ewf .StatusCompleted , ewf .StatusFailed }, workflow .Status ) {
495- return nil
487+ workflowID := parts [2 ]
488+ nodeID , err := strconv .ParseUint (parts [1 ], 10 , 32 )
489+ if err != nil {
490+ log .Error ().Str ("key" , key ).Msg ("invalid node ID" )
491+ continue
492+ }
493+ workflowsNodes [workflowID ] = append (workflowsNodes [workflowID ], uint32 (nodeID ))
496494 }
497495
498- if err := svc .locker .ReleaseLock (svc .ctx , uint32 (nodeID ), workflowID ); err != nil {
499- return fmt .Errorf ("failed to release nodes locks: %w" , err )
496+ for workflowID := range workflowsNodes {
497+ workflow , err := svc .ewfEngine .Store ().LoadWorkflowByUUID (svc .ctx , workflowID )
498+ if err != nil {
499+ log .Error ().Str ("workflow_id" , workflowID ).Msg ("failed to load workflow" )
500+ continue
501+ }
502+ if ! slices .Contains ([]ewf.WorkflowStatus {ewf .StatusCompleted , ewf .StatusFailed }, workflow .Status ) {
503+ continue
504+ }
505+ nodeIDs := workflowsNodes [workflowID ]
506+ if err := svc .locker .ReleaseLock (svc .ctx , nodeIDs , workflowID ); err != nil {
507+ log .Error ().Str ("workflow_id" , workflow .UUID ).Msg ("failed to release locks" )
508+ continue
509+ }
500510 }
501511
502- return nil
503512}
504513
505514func getHoursOfGivenPeriod (startDate , endDate time.Time ) int {
0 commit comments