@@ -41,24 +41,21 @@ export async function handler (args: ArgumentsCamelCase) {
4141
4242 serviceStateMap = new Map < string , string > ( ) ;
4343 services = await dockerode . listServices ( { filters : { label : [ `com.docker.stack.namespace=${ appName } ` ] } } ) ;
44- tasks = await dockerode . listTasks ( { filters : { "label" : [ `com.docker.stack.namespace=${ appName } ` ] , "desired-state" : [ "running" ] } } ) as Task [ ] ;
44+ tasks = await dockerode . listTasks ( { filters : { "label" : [ `com.docker.stack.namespace=${ appName } ` ] } } ) as Task [ ] ;
4545
4646 for ( const s of services ) {
47- if ( s . UpdateStatus ?. State ) {
47+ const runningTasks = tasks . filter ( ( t ) => t . Status . State === "running" && t . ServiceID === s . ID ) ;
48+ const desiredReplicas = s . Spec ?. Mode ?. Replicated ?. Replicas ?? 0 ;
49+
50+ // Always check replica count first - compare running tasks against desired replicas
51+ if ( runningTasks . length < desiredReplicas ) {
52+ serviceStateMap . set ( s . ID , "replicating" ) ;
53+ } else if ( s . UpdateStatus ?. State && [ "updating" , "paused" , "rollback_started" , "rollback_paused" ] . includes ( s . UpdateStatus . State ) ) {
4854 serviceStateMap . set ( s . ID , s . UpdateStatus . State ) ;
49- } else {
50- const runningTasks = tasks . filter ( ( t ) => t . Status . State === "running" && t . ServiceID === s . ID ) ;
51- const totalTasks = tasks . filter ( ( t ) => t . ServiceID === s . ID ) ;
52- if ( totalTasks . length > runningTasks . length ) {
53- serviceStateMap . set ( s . ID , "replicating" ) ;
54- }
5555 }
5656 }
5757
58- const servicesUpdating = [ ] ;
59- for ( const [ id , state ] of serviceStateMap ) {
60- if ( ! [ "completed" , "rollback_completed" ] . includes ( state ) ) servicesUpdating . push ( [ id , state ] ) ;
61- }
58+ const servicesUpdating = [ ...serviceStateMap . entries ( ) ] ;
6259
6360 bail = servicesUpdating . length === 0 ;
6461 if ( ! bail ) {
0 commit comments