procd: instance: Support deleting stopped instances
authorKristian Evensen <kristian.evensen@gmail.com>
Sat, 6 Apr 2019 12:28:30 +0000 (14:28 +0200)
committerHans Dedecker <dedeckeh@gmail.com>
Sun, 7 Apr 2019 19:20:55 +0000 (21:20 +0200)
procd currently does not support deleting a stopped instance. The reason
is that we return in instance_stop(), if pending is set to false. This
patch adds a new function, instance_delete(), which does the necessary
clean-up of an instance. instance_delete() is called before we return in
instance_stop(), as well as when a process that should not be restarted
has exited in instance_exit().

Signed-off-by: Kristian Evensen <kristian.evensen@gmail.com>
service/instance.c

index a5742b7300d0b9075a605126b9574f3da0c13190..3512f66b313c89f40fd293921327d0273ee2725d 100644 (file)
@@ -518,6 +518,16 @@ instance_timeout(struct uloop_timeout *t)
                instance_start(in);
 }
 
+static void
+instance_delete(struct service_instance *in)
+{
+       struct service *s = in->srv;
+
+       avl_delete(&s->instances.avl, &in->node.avl);
+       instance_free(in);
+       service_stopped(s);
+}
+
 static void
 instance_exit(struct uloop_process *p, int ret)
 {
@@ -539,13 +549,8 @@ instance_exit(struct uloop_process *p, int ret)
                instance_removepid(in);
                if (in->restart)
                        instance_start(in);
-               else {
-                       struct service *s = in->srv;
-
-                       avl_delete(&s->instances.avl, &in->node.avl);
-                       instance_free(in);
-                       service_stopped(s);
-               }
+               else
+                       instance_delete(in);
        } else if (in->restart) {
                instance_start(in);
        } else if (in->respawn) {
@@ -569,8 +574,11 @@ instance_exit(struct uloop_process *p, int ret)
 void
 instance_stop(struct service_instance *in, bool halt)
 {
-       if (!in->proc.pending)
+       if (!in->proc.pending) {
+               if (halt)
+                       instance_delete(in);
                return;
+       }
        in->halt = halt;
        in->restart = in->respawn = false;
        kill(in->proc.pid, SIGTERM);