Rev 578: fully save/restore scheduler parameters in http://samba.org/~tridge/ctdb

tridge at samba.org tridge at samba.org
Thu Jul 12 23:35:47 GMT 2007


------------------------------------------------------------
revno: 578
revision-id: tridge at samba.org-20070712233546-55koeemyx8o2m60t
parent: tridge at samba.org-20070712231431-0ng90ee3tw25qzq1
committer: Andrew Tridgell <tridge at samba.org>
branch nick: tridge
timestamp: Fri 2007-07-13 09:35:46 +1000
message:
  fully save/restore scheduler parameters
modified:
  common/ctdb_util.c             ctdb_util.c-20061128065342-to93h6eejj5kon81-3
  include/ctdb_private.h         ctdb_private.h-20061117234101-o3qt14umlg9en8z0-13
  server/ctdb_daemon.c           ctdb_daemon.c-20070409200331-3el1kqgdb9m4ib0g-1
  server/eventscript.c           eventscript.c-20070704074533-95f10rsay8um8wrr-1
=== modified file 'common/ctdb_util.c'
--- a/common/ctdb_util.c	2007-07-10 05:29:31 +0000
+++ b/common/ctdb_util.c	2007-07-12 23:35:46 +0000
@@ -192,20 +192,42 @@
 /*
   if possible, make this task real time
  */
-void ctdb_set_realtime(bool enable)
+void ctdb_set_scheduler(struct ctdb_context *ctdb)
 {
-#if HAVE_SCHED_SETSCHEDULER
+#if HAVE_SCHED_SETSCHEDULER	
 	struct sched_param p;
-	p.__sched_priority = 1;
-
-	if (enable) {
-		if (sched_setscheduler(getpid(), SCHED_FIFO, &p) == -1) {
-			DEBUG(0,("Unable to set scheduler to SCHED_FIFO (%s)\n", strerror(errno)));
-		} else {
-			DEBUG(0,("Set scheduler to SCHED_FIFO\n"));
-		}
+
+	if (ctdb->saved_scheduler_param == NULL) {
+		ctdb->saved_scheduler_param = talloc_size(ctdb, sizeof(p));
+	}
+	
+	if (sched_getparam(0, (struct sched_param *)ctdb->saved_scheduler_param) == -1) {
+		DEBUG(0,("Unable to get old scheduler params\n"));
+		return;
+	}
+
+	p = *(struct sched_param *)ctdb->saved_scheduler_param;
+	p.sched_priority = 1;
+
+	if (sched_setscheduler(0, SCHED_FIFO, &p) == -1) {
+		DEBUG(0,("Unable to set scheduler to SCHED_FIFO (%s)\n", strerror(errno)));
 	} else {
-		sched_setscheduler(getpid(), SCHED_OTHER, &p);
+		DEBUG(0,("Set scheduler to SCHED_FIFO\n"));
+	}
+#endif
+}
+
+/*
+  restore previous scheduler parameters
+ */
+void ctdb_restore_scheduler(struct ctdb_context *ctdb)
+{
+#if HAVE_SCHED_SETSCHEDULER	
+	if (ctdb->saved_scheduler_param == NULL) {
+		ctdb_fatal(ctdb, "No saved scheduler parameters\n");
+	}
+	if (sched_setscheduler(0, SCHED_OTHER, (struct sched_param *)ctdb->saved_scheduler_param) == -1) {
+		ctdb_fatal(ctdb, "Unable to restore old scheduler parameters\n");
 	}
 #endif
 }

=== modified file 'include/ctdb_private.h'
--- a/include/ctdb_private.h	2007-07-12 22:47:02 +0000
+++ b/include/ctdb_private.h	2007-07-12 23:35:46 +0000
@@ -308,6 +308,7 @@
 	struct ctdb_tcp_list *tcp_list;
 	struct ctdb_client_ip *client_ip_list;
 	bool do_setsched;
+	void *saved_scheduler_param;
 };
 
 struct ctdb_db_context {
@@ -948,7 +949,8 @@
 			       uint32_t destnode, uint32_t db_id, uint64_t rsn);
 int ctdb_ctrl_delete_low_rsn(struct ctdb_context *ctdb, struct timeval timeout, 
 			     uint32_t destnode, uint32_t db_id, uint64_t rsn);
-void ctdb_set_realtime(bool enable);
+void ctdb_set_scheduler(struct ctdb_context *ctdb);
+void ctdb_restore_scheduler(struct ctdb_context *ctdb);
 int32_t ctdb_control_takeover_ip(struct ctdb_context *ctdb, 
 				 struct ctdb_req_control *c,
 				 TDB_DATA indata, 

=== modified file 'server/ctdb_daemon.c'
--- a/server/ctdb_daemon.c	2007-07-12 22:47:02 +0000
+++ b/server/ctdb_daemon.c	2007-07-12 23:35:46 +0000
@@ -646,7 +646,7 @@
 
 	if (ctdb->do_setsched) {
 		/* try to set us up as realtime */
-		ctdb_set_realtime(true);
+		ctdb_set_scheduler(ctdb);
 	}
 
 	/* ensure the socket is deleted on exit of the daemon */

=== modified file 'server/eventscript.c'
--- a/server/eventscript.c	2007-07-12 22:47:02 +0000
+++ b/server/eventscript.c	2007-07-12 23:35:46 +0000
@@ -167,7 +167,7 @@
 	if (state->child == 0) {
 		close(state->fd[0]);
 		if (ctdb->do_setsched) {
-			ctdb_set_realtime(false);
+			ctdb_restore_scheduler(ctdb);
 		}
 		set_close_on_exec(state->fd[1]);
 		va_start(ap, fmt);



More information about the samba-cvs mailing list