@@ -80,7 +80,7 @@ typedef struct async_command_s {
8080 int default_timeout ; /* seconds */
8181 int timeout ; /* seconds */
8282
83- int start_delay ; /* milliseconds */
83+ int start_delay ; /* seconds */
8484 int delay_id ;
8585
8686 char * op ;
@@ -123,36 +123,36 @@ static int
123123get_action_delay_max (stonith_device_t * device , const char * action )
124124{
125125 const char * value = NULL ;
126- int delay_max_ms = 0 ;
126+ int delay_max = 0 ;
127127
128128 if (safe_str_neq (action , "off" ) && safe_str_neq (action , "reboot" )) {
129129 return 0 ;
130130 }
131131
132132 value = g_hash_table_lookup (device -> params , STONITH_ATTR_DELAY_MAX );
133133 if (value ) {
134- delay_max_ms = crm_get_msec (value );
134+ delay_max = crm_get_msec (value ) / 1000 ;
135135 }
136136
137- return delay_max_ms ;
137+ return delay_max ;
138138}
139139
140140static int
141141get_action_delay_base (stonith_device_t * device , const char * action )
142142{
143143 const char * value = NULL ;
144- int delay_base_ms = 0 ;
144+ int delay_base = 0 ;
145145
146146 if (safe_str_neq (action , "off" ) && safe_str_neq (action , "reboot" )) {
147147 return 0 ;
148148 }
149149
150150 value = g_hash_table_lookup (device -> params , STONITH_ATTR_DELAY_BASE );
151151 if (value ) {
152- delay_base_ms = crm_get_msec (value );
152+ delay_base = crm_get_msec (value ) / 1000 ;
153153 }
154154
155- return delay_base_ms ;
155+ return delay_base ;
156156}
157157
158158/*!
@@ -243,6 +243,8 @@ create_async_command(xmlNode * msg)
243243 crm_element_value_int (msg , F_STONITH_CALLOPTS , & (cmd -> options ));
244244 crm_element_value_int (msg , F_STONITH_TIMEOUT , & (cmd -> default_timeout ));
245245 cmd -> timeout = cmd -> default_timeout ;
246+ // Value -1 means disable any static/random fencing delays
247+ crm_element_value_int (msg , F_STONITH_DELAY , & (cmd -> start_delay ));
246248
247249 cmd -> origin = crm_element_value_copy (msg , F_ORIG );
248250 cmd -> remote_op_id = crm_element_value_copy (msg , F_STONITH_REMOTE_OP_ID );
@@ -349,7 +351,7 @@ stonith_device_execute(stonith_device_t * device)
349351
350352 if (pending_op && pending_op -> delay_id ) {
351353 crm_trace
352- ("Operation '%s'%s%s on %s was asked to run too early, waiting for start_delay timeout of %dms " ,
354+ ("Operation '%s'%s%s on %s was asked to run too early, waiting for start_delay timeout of %ds " ,
353355 pending_op -> action , pending_op -> victim ? " targeting " : "" ,
354356 pending_op -> victim ? pending_op -> victim : "" ,
355357 device -> id , pending_op -> start_delay );
@@ -464,6 +466,7 @@ schedule_stonith_command(async_command_t * cmd, stonith_device_t * device)
464466{
465467 int delay_max = 0 ;
466468 int delay_base = 0 ;
469+ int requested_delay = cmd -> start_delay ;
467470
468471 CRM_CHECK (cmd != NULL , return );
469472 CRM_CHECK (device != NULL , return );
@@ -496,30 +499,38 @@ schedule_stonith_command(async_command_t * cmd, stonith_device_t * device)
496499 device -> pending_ops = g_list_append (device -> pending_ops , cmd );
497500 mainloop_set_trigger (device -> work );
498501
502+ // Value -1 means disable any static/random fencing delays
503+ if (requested_delay < 0 ) {
504+ return ;
505+ }
506+
499507 delay_max = get_action_delay_max (device , cmd -> action );
500508 delay_base = get_action_delay_base (device , cmd -> action );
501509 if (delay_max == 0 ) {
502510 delay_max = delay_base ;
503511 }
504512 if (delay_max < delay_base ) {
505- crm_warn ("Base-delay (%dms ) is larger than max-delay (%dms ) "
513+ crm_warn ("Base-delay (%ds ) is larger than max-delay (%ds ) "
506514 "for %s on %s - limiting to max-delay" ,
507515 delay_base , delay_max , cmd -> action , device -> id );
508516 delay_base = delay_max ;
509517 }
510518 if (delay_max > 0 ) {
511519 // coverity[dont_call] We're not using rand() for security
512- cmd -> start_delay =
520+ cmd -> start_delay + =
513521 ((delay_max != delay_base )?(rand () % (delay_max - delay_base )):0 )
514522 + delay_base ;
515- crm_notice ("Delaying '%s' action%s%s on %s for %dms (timeout=%ds, base=%dms, "
516- "max=%dms)" ,
517- cmd -> action ,
518- cmd -> victim ? " targeting " : "" , cmd -> victim ? cmd -> victim : "" ,
519- device -> id , cmd -> start_delay , cmd -> timeout ,
520- delay_base , delay_max );
523+ }
524+
525+ if (cmd -> start_delay > 0 ) {
526+ crm_notice ("Delaying '%s' action%s%s on %s for %ds (timeout=%ds, "
527+ "requested_delay=%ds, base=%ds, max=%ds)" ,
528+ cmd -> action ,
529+ cmd -> victim ? " targeting " : "" , cmd -> victim ? cmd -> victim : "" ,
530+ device -> id , cmd -> start_delay , cmd -> timeout ,
531+ requested_delay , delay_base , delay_max );
521532 cmd -> delay_id =
522- g_timeout_add (cmd -> start_delay , start_delay_helper , cmd );
533+ g_timeout_add_seconds (cmd -> start_delay , start_delay_helper , cmd );
523534 }
524535}
525536
0 commit comments