ctdb-daemon: Make sure ctdb runs with real-time priority
authorAmitay Isaacs <amitay@gmail.com>
Fri, 12 Sep 2014 01:22:36 +0000 (11:22 +1000)
committerAmitay Isaacs <amitay@samba.org>
Fri, 12 Sep 2014 06:46:14 +0000 (08:46 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/common/system_util.c
ctdb/include/ctdb_private.h
ctdb/server/ctdb_daemon.c
ctdb/server/ctdb_lock_helper.c

index 692bc25623a325d5d46f4ed1ca01a6ee2f511728..8e8f4ac2174755c3d2e479c653cbfffb758232af 100644 (file)
@@ -37,7 +37,7 @@
 /*
   if possible, make this task real time
  */
-void set_scheduler(void)
+bool set_scheduler(void)
 {
 #ifdef _AIX_
 #if HAVE_THREAD_SETSCHED
@@ -47,14 +47,15 @@ void set_scheduler(void)
        ti = 0ULL;
        if (getthrds64(getpid(), &te, sizeof(te), &ti, 1) != 1) {
                DEBUG(DEBUG_ERR, ("Unable to get thread information\n"));
-               return;
+               return false;
        }
 
        if (thread_setsched(te.ti_tid, 0, SCHED_RR) == -1) {
                DEBUG(DEBUG_ERR, ("Unable to set scheduler to SCHED_RR (%s)\n",
                                  strerror(errno)));
+               return false;
        } else {
-               DEBUG(DEBUG_NOTICE, ("Set scheduler to SCHED_RR\n"));
+               return true;
        }
 #endif
 #else /* no AIX */
@@ -70,11 +71,13 @@ void set_scheduler(void)
        if (sched_setscheduler(0, policy, &p) == -1) {
                DEBUG(DEBUG_CRIT,("Unable to set scheduler to SCHED_FIFO (%s)\n",
                         strerror(errno)));
+               return false;
        } else {
-               DEBUG(DEBUG_NOTICE,("Set scheduler to SCHED_FIFO\n"));
+               return true;
        }
 #endif
 #endif
+       return false;
 }
 
 /*
index 285e13cdf8fa53f23b9572f0bd115964627ac17e..43daf360b1a8ea7104c2da413106bf1e160d2397 100644 (file)
@@ -1090,7 +1090,7 @@ void ctdb_call_resend_all(struct ctdb_context *ctdb);
 void ctdb_node_dead(struct ctdb_node *node);
 void ctdb_node_connected(struct ctdb_node *node);
 bool ctdb_blocking_freeze(struct ctdb_context *ctdb);
-void set_scheduler(void);
+bool set_scheduler(void);
 void reset_scheduler(void);
 
 struct tevent_signal *ctdb_init_sigchld(struct ctdb_context *ctdb);
index 4ae56a9eb7bc9e81af81fa0db0ee5665d5608ff4..46a134c60df030ac725a546c0fbb23dcb9f5e3f5 100644 (file)
@@ -1183,7 +1183,10 @@ int ctdb_start_daemon(struct ctdb_context *ctdb, bool do_fork, bool use_syslog)
 
        if (ctdb->do_setsched) {
                /* try to set us up as realtime */
-               set_scheduler();
+               if (!set_scheduler()) {
+                       exit(1);
+               }
+               DEBUG(DEBUG_NOTICE, ("Set real-time scheduler priority\n"));
        }
 
        /* ensure the socket is deleted on exit of the daemon */
index 3de07768ae490b3c7341e07ff152f16558db5d0d..49c317e30f4d48132acea5b19f6942057988964e 100644 (file)
@@ -123,7 +123,10 @@ int main(int argc, char *argv[])
                exit(1);
        }
 
-       set_scheduler();
+       if (!set_scheduler()) {
+               fprintf(stderr, "%s: Unable to set real-time scheduler priority\n",
+                       progname);
+       }
 
        log_fd = atoi(argv[1]);
        close(STDOUT_FILENO);