@@ -26,12 +26,15 @@ export async function handler (args: ArgumentsCamelCase) {
2626 assertNumber ( timeout , "timeout must be a number in ms" ) ;
2727 const interval = args . interval ;
2828 assertNumber ( interval , "interval must be a number in ms" ) ;
29+ const stableChecks = args . stableChecks ;
30+ assertNumber ( stableChecks , "stableChecks must be a number" ) ;
2931
3032 const dockerode = new Docker ( ) ;
3133
3234 console . log ( `Awaiting task reconciliation for ${ timeout } ms` ) ;
3335
3436 let services : Service [ ] , tasks : Task [ ] , timedout , bail , serviceStateMap ;
37+ let stableStreak = 0 ;
3538 const start = Date . now ( ) ;
3639 do {
3740 // To prevent high cpu usage
@@ -57,15 +60,19 @@ export async function handler (args: ArgumentsCamelCase) {
5760
5861 const servicesUpdating = [ ...serviceStateMap . entries ( ) ] ;
5962
60- bail = servicesUpdating . length === 0 ;
61- if ( ! bail ) {
63+ if ( servicesUpdating . length === 0 ) {
64+ stableStreak ++ ;
65+ } else {
66+ stableStreak = 0 ;
6267 for ( const [ serviceId , state ] of servicesUpdating ) {
6368 const serviceName = services . find ( ( s ) => s . ID === serviceId ) ?. Spec ?. Name ;
6469 assert ( serviceName != null , "serviceName must be a string" ) ;
6570 const errMsg = tasks . find ( ( t ) => t . ServiceID === serviceId && t . Status . Err ) ?. Status . Err ;
6671 console . log ( `${ serviceName } is in ${ state } state${ errMsg ? ", error: '" + errMsg + "'" : "" } ` ) ;
6772 }
6873 }
74+
75+ bail = stableStreak >= stableChecks ;
6976 } while ( ! timedout && ! bail ) ;
7077
7178 if ( timedout ) {
@@ -88,6 +95,11 @@ export function builder (yargs: Argv) {
8895 description : "How often reconciliation should run" ,
8996 default : 5000 ,
9097 } ) ;
98+ yargs . positional ( "stableChecks" , {
99+ type : "number" ,
100+ description : "Consecutive settled checks required before success" ,
101+ default : 3 ,
102+ } ) ;
91103 yargs . hide ( "help" ) ;
92104 yargs . hide ( "version" ) ;
93105 return yargs ;
0 commit comments