[Commits] d06d329: MDEV-7659 buildbot may leave stale mysqld

serg at mariadb.org serg at mariadb.org
Thu Mar 5 16:46:06 EET 2015


revision-id: d06d329ff98100cf0f81f3673f8526d61c74205f
parent(s): f4c9070f73a3294fa52ec693189b701efd10c4e5
committer: Sergei Golubchik
branch nick: maria
timestamp: 2015-03-05 15:45:23 +0100
message:

MDEV-7659 buildbot may leave stale mysqld

safe_process puts its children (mysqld, in this case) into a separate
process group, to be able to kill it all at once.

buildslave kills mtr's process group when it loses connection to
the master.

result? buildslave kills mtr and safe_process, but leaves stale
mysqld processes in their own process groups.

fix: put safe_process itself into a separate process group, then
buildslave won't kill it and safe_process will kill mysqld'd
and itself when it will notice that the parent mtr no longer exists.

---
 mysql-test/lib/My/SafeProcess/safe_process.cc | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/mysql-test/lib/My/SafeProcess/safe_process.cc b/mysql-test/lib/My/SafeProcess/safe_process.cc
index d6110f5..feb3eb4 100644
--- a/mysql-test/lib/My/SafeProcess/safe_process.cc
+++ b/mysql-test/lib/My/SafeProcess/safe_process.cc
@@ -125,7 +125,7 @@ extern "C" void handle_abort(int sig)
     message("Got signal %d, child_pid: %d, sending ABRT", sig, child_pid);
 
     if (child_pid > 0) {
-	kill (-child_pid, SIGABRT);	// Don't wait for it to terminate
+	kill(-child_pid, SIGABRT);	// Don't wait for it to terminate
     }
 }
 
@@ -226,6 +226,18 @@ int main(int argc, char* const argv[] )
     sleep(1);
   }
 
+  /*
+    Child: Make this process it's own process group to be able to kill
+    it and any its children that hasn't changed a group themselves)
+
+    Parent: Detach from the parent's process group, so that killing a parent
+    group wouldn't kill us (if we're killed, there's no one to kill our child
+    processes that run in their own process group). There's a loop below
+    that monitors the parent, it's enough.
+  */
+  setpgid(0, 0);
+
+
   if (child_pid == 0)
   {
     close(pfd[0]); // Close unused read end
@@ -236,10 +248,6 @@ int main(int argc, char* const argv[] )
     signal(SIGHUP, SIG_DFL);
     signal(SIGCHLD, SIG_DFL);
 
-    // Make this process it's own process group to be able to kill
-    // it and any childs(that hasn't changed group themself)
-    setpgid(0, 0);
-
     if (nocore)
     {
       struct rlimit corelim = { 0, 0 };


More information about the commits mailing list