This patch stops using instance "respawn" flag as a state variable. This fixes the bug when instance loses "respawn" flag after it has been restarted (if instance is started before the process has exited, it will not copy all parameters). --- service/instance.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/service/instance.c b/service/instance.c index a968a0b..5aab23a 100644 --- a/service/instance.c +++ b/service/instance.c @@ -506,12 +506,17 @@ instance_timeout(struct uloop_timeout *t) in = container_of(t, struct service_instance, timeout); - if (in->halt) { - LOG("Instance %s::%s pid %d not stopped on SIGTERM, sending SIGKILL instead\n", - in->srv->name, in->name, in->proc.pid); - kill(in->proc.pid, SIGKILL); - } else if (in->restart || in->respawn) - instance_start(in); + if (!in->proc.pending) { + if (in->respawn) { + instance_start(in); + } + } else { + if (in->halt) { + LOG("Instance %s::%s pid %d not stopped on SIGTERM, sending SIGKILL instead\n", + in->srv->name, in->name, in->proc.pid); + kill(in->proc.pid, SIGKILL); + } + } } static void @@ -545,6 +550,7 @@ instance_exit(struct uloop_process *p, int ret) service_stopped(s); } } else if (in->restart) { + /* can never happen */ instance_start(in); } else if (in->respawn) { if (runtime < in->respawn_threshold) @@ -554,8 +560,8 @@ instance_exit(struct uloop_process *p, int ret) if (in->respawn_count > in->respawn_retry && in->respawn_retry > 0 ) { LOG("Instance %s::%s s in a crash loop %d crashes, %ld seconds since last crash\n", in->srv->name, in->name, in->respawn_count, runtime); - in->restart = in->respawn = 0; - in->halt = 1; + in->restart = false; + in->halt = true; service_event("instance.fail", in->srv->name, in->name); } else { service_event("instance.respawn", in->srv->name, in->name); @@ -570,7 +576,7 @@ instance_stop(struct service_instance *in) if (!in->proc.pending) return; in->halt = true; - in->restart = in->respawn = false; + in->restart = false; kill(in->proc.pid, SIGTERM); uloop_timeout_set(&in->timeout, in->term_timeout * 1000); } -- 2.7.4 _______________________________________________ Lede-dev mailing list Lede-dev@lists.infradead.org http://lists.infradead.org/mailman/listinfo/lede-dev