Skip to content

Commit

Permalink
Fix #280: allow calling initctl restart foo from within foo
Browse files Browse the repository at this point in the history
Move the stop+start from initctl to the state machine by allowing
stopped tasks to restart once it has been collected.  This should
prevent finit from blocking, allowing it to handle other requests
while waiting for the service's PID to be collected.

Effectively, this will allow a service to call initctl to restart
itself, as reported in issue #280.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
  • Loading branch information
troglobit committed May 30, 2022
1 parent 5ef669f commit ccb84ce
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 19 deletions.
7 changes: 5 additions & 2 deletions src/api.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,7 @@ static int restart(svc_t *svc, void *user_data)
if (!svc)
return 1;

svc_mark_dirty(svc);
svc_start(svc);
service_stop(svc);
service_step(svc);

return 0;
Expand Down Expand Up @@ -319,6 +318,10 @@ static void api_cb(uev_t *w, void *arg, int events)
if (EAGAIN == errno)
break;

/* we get here when client restarts itself */
if (ECONNRESET == errno)
break;

_e("Failed reading initctl request, error %d: %s", errno, strerror(errno));
}

Expand Down
19 changes: 3 additions & 16 deletions src/initctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,23 +271,10 @@ static int do_reload (char *arg)

static int do_restart(char *arg)
{
size_t retries = 3;
svc_t *svc;

if (do_startstop(INIT_CMD_STOP_SVC, arg))
return 1;

while (retries-- > 0 && (svc = client_svc_find(arg))) {
if (!svc_is_running(svc))
break;
if (do_startstop(INIT_CMD_RESTART_SVC, arg))
ERRX(7, "failed restarting %s", arg);

sleep(1);
}

if (retries == 0)
ERRX(7, "failed stopping %s (restart)", arg);

return do_startstop(INIT_CMD_RESTART_SVC, arg);
return 0;
}

/**
Expand Down
6 changes: 5 additions & 1 deletion src/service.c
Original file line number Diff line number Diff line change
Expand Up @@ -731,10 +731,14 @@ static void service_cleanup(svc_t *svc)
* service_stop - Stop service
* @svc: Service to stop
*
* Called externally by initctl to perform stop/start (restart) of
* services. Internally it is used to bring a run/task/service to
* HALTED state.
*
* Returns:
* 0 if the service was successfully stopped. Non-zero otherwise.
*/
static int service_stop(svc_t *svc)
int service_stop(svc_t *svc)
{
char cmdline[CMD_SIZE] = "";
int do_progress = 1;
Expand Down
1 change: 1 addition & 0 deletions src/service.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ int service_timeout_cancel (svc_t *svc);

void service_forked (svc_t *svc);

int service_stop (svc_t *svc);
int service_step (svc_t *svc);
void service_step_all (int types);
void service_worker (void *unused);
Expand Down

0 comments on commit ccb84ce

Please sign in to comment.