Skip to content

Commit

Permalink
Fix #378: warn on console if run/task times out during bootstrap
Browse files Browse the repository at this point in the history
Signed-off-by: Joachim Wiberg <[email protected]>
  • Loading branch information
troglobit committed Oct 30, 2023
1 parent fbb3779 commit f221883
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 6 deletions.
5 changes: 4 additions & 1 deletion src/service.c
Original file line number Diff line number Diff line change
Expand Up @@ -2609,6 +2609,7 @@ void service_runtask_clean(void)

/**
* service_completed - Have run/task completed in current runlevel
* @svcp: On %FALSE return, this points to the first incomplete svc
*
* This function checks if all run/task have run once in the current
* runlevel. E.g., at bootstrap we must wait for these scripts or
Expand All @@ -2621,7 +2622,7 @@ void service_runtask_clean(void)
* Returns:
* %TRUE(1) or %FALSE(0)
*/
int service_completed(void)
int service_completed(svc_t **svcp)
{
svc_t *svc, *iter = NULL;

Expand All @@ -2643,6 +2644,8 @@ int service_completed(void)

if (!svc->once) {
dbg("%s has not yet completed ...", svc_ident(svc, NULL, 0));
if (svcp)
*svcp = svc;
return 0;
}
dbg("%s has completed ...", svc_ident(svc, NULL, 0));
Expand Down
2 changes: 1 addition & 1 deletion src/service.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ int service_step (svc_t *svc);
void service_step_all (int types);
void service_worker (void *unused);

int service_completed (void);
int service_completed (svc_t **svc);
void service_notify_reconf (void);

void service_init (uev_ctx_t *ctx);
Expand Down
16 changes: 12 additions & 4 deletions src/sm.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,21 +53,29 @@ sm_t sm;
static void sm_check_bootstrap(void *work)
{
static int timeout = 120;
int level = cfglevel;
int bootstrap_done;
int level = cfglevel;
svc_t *svc = NULL;

dbg("Step all services ...");
service_step_all(SVC_TYPE_ANY);

if (timeout-- > 0 && !service_completed()) {
bootstrap_done = service_completed(&svc);
if (timeout-- > 0 && !bootstrap_done) {
dbg("Not all bootstrap run/tasks have completed yet ... %d", timeout);
schedule_work(work);
return;
}

if (timeout > 0)
if (timeout > 0) {
dbg("All run/task have completed, resuming bootstrap.");
else
} else {
dbg("Timeout, resuming bootstrap.");
if (svc)
print(2, "Timeout waiting for %s to run, resuming bootstrap", svc_ident(svc, NULL, 0));
else
print(2, "Timeout waiting for unknown run/task, resuming bootstrap");
}

dbg("Flushing pending .conf file events ...");
conf_flush_events();
Expand Down

0 comments on commit f221883

Please sign in to comment.