[SCM] CTDB repository - branch master updated - 1.0.99-34-g4037b6e

Ronnie Sahlberg sahlberg at samba.org
Mon Oct 26 22:48:46 MDT 2009


The branch, master has been updated
       via  4037b6e73a819a8e2463dfe0959b42875e05e106 (commit)
       via  227fe99f105bdc3a4f1000f238cbe3adeb3f22f0 (commit)
       via  cc30ee2f4f33cb75b2be980c2d4dff6c7c23852f (commit)
       via  a10fc51f4c30e85ada6d4b7347b0f9a8ebc76637 (commit)
      from  20678e1506db1f96b58c326ee91339e797c07c22 (commit)

http://gitweb.samba.org/?p=sahlberg/ctdb.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 4037b6e73a819a8e2463dfe0959b42875e05e106
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Tue Oct 27 15:45:03 2009 +1100

    add a check that winbind can actually talk to teh dc during the startup event
    and refuse to start up if it can not

commit 227fe99f105bdc3a4f1000f238cbe3adeb3f22f0
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Tue Oct 27 15:17:45 2009 +1100

    temporarily try allowing clients to attach to databases even if the node is banned/stopped or inactive in any other way.

commit cc30ee2f4f33cb75b2be980c2d4dff6c7c23852f
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Tue Oct 27 13:51:45 2009 +1100

    dont run the monitor event so frequently after a event has failed.
    
    use _exit() instead of exit() when terminating an eventscript.

commit a10fc51f4c30e85ada6d4b7347b0f9a8ebc76637
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Tue Oct 27 13:18:52 2009 +1100

    for debugging
    
    add a global variable holding the pid of the main daemon.
    change the tracking of time() in the event loop to only check/warn when called from the main daemon

-----------------------------------------------------------------------

Summary of changes:
 client/ctdb_client.c         |    2 ++
 config/events.d/50.samba     |    4 ++++
 include/ctdb_private.h       |    5 +++++
 lib/events/events_epoll.c    |   22 +++++++++++++---------
 lib/events/events_select.c   |   22 +++++++++++++---------
 lib/events/events_standard.c |   22 +++++++++++++---------
 server/ctdb_daemon.c         |    4 +++-
 server/ctdb_ltdb_server.c    |   25 ++++++++++++++-----------
 server/ctdb_monitor.c        |    4 ++--
 server/eventscript.c         |    2 +-
 tools/ctdb.c                 |    1 -
 11 files changed, 70 insertions(+), 43 deletions(-)


Changeset truncated at 500 lines:

diff --git a/client/ctdb_client.c b/client/ctdb_client.c
index e8c543f..d4130cd 100644
--- a/client/ctdb_client.c
+++ b/client/ctdb_client.c
@@ -30,6 +30,8 @@
 #include "../include/ctdb_private.h"
 #include "lib/util/dlinklist.h"
 
+pid_t ctdbd_pid;
+
 /*
   allocate a packet for use in client<->daemon communication
  */
diff --git a/config/events.d/50.samba b/config/events.d/50.samba
index 814fb9a..1785f4d 100755
--- a/config/events.d/50.samba
+++ b/config/events.d/50.samba
@@ -171,6 +171,10 @@ case $cmd in
 		    killall -q -9 winbindd
 		}
 		service "$CTDB_SERVICE_WINBIND" start
+		wbinfo -t || {
+			echo "Startup failed. wbinfo -t returned error."
+			exit 1
+		}
 	}
 
 	# start Samba service. Start it reniced, as under very heavy load 
diff --git a/include/ctdb_private.h b/include/ctdb_private.h
index ad84628..e73913a 100644
--- a/include/ctdb_private.h
+++ b/include/ctdb_private.h
@@ -54,6 +54,11 @@ struct takeover_run_reply {
 };
 
 /*
+ * pid of the ctdbd daemon
+ */
+extern pid_t ctdbd_pid;
+
+/*
   a tcp connection description
  */
 struct ctdb_tcp_connection {
diff --git a/lib/events/events_epoll.c b/lib/events/events_epoll.c
index b7172a7..0dfdb79 100644
--- a/lib/events/events_epoll.c
+++ b/lib/events/events_epoll.c
@@ -29,6 +29,8 @@
 #include "lib/events/events_internal.h"
 #include <sys/epoll.h>
 
+extern pid_t ctdbd_pid;
+
 struct epoll_event_context {
 	/* a pointer back to the generic event_context */
 	struct event_context *ev;
@@ -466,17 +468,19 @@ static int epoll_event_loop_wait(struct event_context *ev)
 		if (epoll_event_loop_once(ev) != 0) {
 			break;
 		}
-		new_t=time(NULL);
-		if (t != 0) {
-			if (t > new_t) {
-				DEBUG(0,("ERROR Time skipped backward by %d seconds\n", (int)(t-new_t)));
-			}
-			/* We assume here that we get at least one event every 5 seconds */
-			if (new_t > (t+5)) {
-				DEBUG(0,("ERROR Time jumped forward by %d seconds\n", (int)(new_t-t)));
+		if (getpid() == ctdbd_pid) {
+			new_t=time(NULL);
+			if (t != 0) {
+				if (t > new_t) {
+					DEBUG(0,("ERROR Time skipped backward by %d seconds\n", (int)(t-new_t)));
+				}
+				/* We assume here that we get at least one event every 5 seconds */
+				if (new_t > (t+5)) {
+					DEBUG(0,("ERROR Time jumped forward by %d seconds\n", (int)(new_t-t)));
+				}
 			}
+			t=new_t;
 		}
-		t=new_t;
 	}
 
 	return 0;
diff --git a/lib/events/events_select.c b/lib/events/events_select.c
index c908b12..404cd8c 100644
--- a/lib/events/events_select.c
+++ b/lib/events/events_select.c
@@ -31,6 +31,8 @@
 #include "lib/events/events.h"
 #include "lib/events/events_internal.h"
 
+extern pid_t ctdbd_pid;
+
 struct select_event_context {
 	/* a pointer back to the generic event_context */
 	struct event_context *ev;
@@ -281,17 +283,19 @@ static int select_event_loop_wait(struct event_context *ev)
 		if (select_event_loop_once(ev) != 0) {
 			break;
 		}
-		new_t=time(NULL);
-		if (t != 0) {
-			if (t > new_t) {
-				DEBUG(0,("ERROR Time skipped backward by %d seconds\n", (int)(t-new_t)));
-			}
-			/* We assume here that we get at least one event every 5 seconds */
-			if (new_t > (t+5)) {
-				DEBUG(0,("ERROR Time jumped forward by %d seconds\n", (int)(new_t-t)));
+		if (getpid() == ctdbd_pid) {
+			new_t=time(NULL);
+			if (t != 0) {
+				if (t > new_t) {
+					DEBUG(0,("ERROR Time skipped backward by %d seconds\n", (int)(t-new_t)));
+				}
+				/* We assume here that we get at least one event every 5 seconds */
+				if (new_t > (t+5)) {
+					DEBUG(0,("ERROR Time jumped forward by %d seconds\n", (int)(new_t-t)));
+				}
 			}
+			t=new_t;
 		}
-		t=new_t;
 	}
 
 	return select_ev->exit_code;
diff --git a/lib/events/events_standard.c b/lib/events/events_standard.c
index 35516ea..9ee2328 100644
--- a/lib/events/events_standard.c
+++ b/lib/events/events_standard.c
@@ -36,6 +36,8 @@
 #include "lib/events/events.h"
 #include "lib/events/events_internal.h"
 
+extern pid_t ctdbd_pid;
+
 struct std_event_context {
 	/* a pointer back to the generic event_context */
 	struct event_context *ev;
@@ -582,17 +584,19 @@ static int std_event_loop_wait(struct event_context *ev)
 		if (std_event_loop_once(ev) != 0) {
 			break;
 		}
-		new_t=time(NULL);
-		if (t != 0) {
-			if (t > new_t) {
-				DEBUG(0,("ERROR Time skipped backward by %d seconds\n", (int)(t-new_t)));
-			}
-			/* We assume here that we get at least one event every 5 seconds */
-			if (new_t > (t+5)) {
-				DEBUG(0,("ERROR Time jumped forward by %d seconds\n", (int)(new_t-t)));
+		if (getpid() == ctdbd_pid) {
+			new_t=time(NULL);
+			if (t != 0) {
+				if (t > new_t) {
+					DEBUG(0,("ERROR Time skipped backward by %d seconds\n", (int)(t-new_t)));
+				}
+				/* We assume here that we get at least one event every 5 seconds */
+				if (new_t > (t+5)) {
+					DEBUG(0,("ERROR Time jumped forward by %d seconds\n", (int)(new_t-t)));
+				}
 			}
+			t=new_t;
 		}
-		t=new_t;
 	}
 
 	return std_ev->exit_code;
diff --git a/server/ctdb_daemon.c b/server/ctdb_daemon.c
index a8dc651..54a47c1 100644
--- a/server/ctdb_daemon.c
+++ b/server/ctdb_daemon.c
@@ -36,7 +36,6 @@ static void print_exit_message(void)
 	DEBUG(DEBUG_NOTICE,("CTDB daemon shutting down\n"));
 }
 
-
 /* called when the "startup" event script has finished */
 static void ctdb_start_transport(struct ctdb_context *ctdb)
 {
@@ -690,6 +689,9 @@ int ctdb_start_daemon(struct ctdb_context *ctdb, bool do_fork)
 	}
 	block_signal(SIGPIPE);
 
+	ctdbd_pid = getpid();
+	DEBUG(DEBUG_ERR, ("Starting CTDBD as pid : %u\n", ctdbd_pid));
+
 	if (ctdb->do_setsched) {
 		/* try to set us up as realtime */
 		ctdb_set_scheduler(ctdb);
diff --git a/server/ctdb_ltdb_server.c b/server/ctdb_ltdb_server.c
index ec29076..54b4f5e 100644
--- a/server/ctdb_ltdb_server.c
+++ b/server/ctdb_ltdb_server.c
@@ -316,7 +316,9 @@ int32_t ctdb_control_db_attach(struct ctdb_context *ctdb, TDB_DATA indata,
 {
 	const char *db_name = (const char *)indata.dptr;
 	struct ctdb_db_context *db;
+#if 0
 	struct ctdb_node *node = ctdb->nodes[ctdb->pnn];
+#endif
 
 	/* the client can optionally pass additional tdb flags, but we
 	   only allow a subset of those on the database in ctdb. Note
@@ -324,25 +326,26 @@ int32_t ctdb_control_db_attach(struct ctdb_context *ctdb, TDB_DATA indata,
 	   srvid to the attach control */
 	tdb_flags &= TDB_NOSYNC;
 
-	/* If the node is inactive it is not part of the cluster
-	   and we should not allow clients to attach to any
-	   databases
-	*/
-	if (node->flags & NODE_FLAGS_INACTIVE) {
-		DEBUG(DEBUG_ERR,("DB Attach to database %s refused since node is inactive (disconnected or banned)\n", db_name));
-		return -1;
-	}
-
-
 	/* see if we already have this name */
 	db = ctdb_db_handle(ctdb, db_name);
-	if (db) {
+	if (db != NULL) {
 		outdata->dptr  = (uint8_t *)&db->db_id;
 		outdata->dsize = sizeof(db->db_id);
 		tdb_add_flags(db->ltdb->tdb, tdb_flags);
 		return 0;
 	}
 
+#if 0
+	/* If the node is inactive it is not part of the cluster
+	   and we should not allow clients to attach to any new
+	   databases
+	*/
+	if (node->flags & NODE_FLAGS_INACTIVE) {
+		DEBUG(DEBUG_ERR,("DB Attach to database %s refused since node is inactive (disconnected or banned)\n", db_name));
+		return -1;
+	}
+#endif
+
 	if (ctdb_local_attach(ctdb, db_name, persistent) != 0) {
 		return -1;
 	}
diff --git a/server/ctdb_monitor.c b/server/ctdb_monitor.c
index 8997535..f2d6d18 100644
--- a/server/ctdb_monitor.c
+++ b/server/ctdb_monitor.c
@@ -126,7 +126,7 @@ static void ctdb_health_callback(struct ctdb_context *ctdb, int status, void *p)
 	if (status != 0 && !(node->flags & NODE_FLAGS_UNHEALTHY)) {
 		DEBUG(DEBUG_NOTICE,("monitor event failed - disabling node\n"));
 		node->flags |= NODE_FLAGS_UNHEALTHY;
-		ctdb->monitor->next_interval = 1;
+		ctdb->monitor->next_interval = 5;
 		if (ctdb->tunable.disable_when_unhealthy != 0) {
 			DEBUG(DEBUG_INFO, ("DISABLING node since it became unhealthy\n"));
 			node->flags |= NODE_FLAGS_DISABLED;
@@ -144,7 +144,7 @@ static void ctdb_health_callback(struct ctdb_context *ctdb, int status, void *p)
 	} else if (status == 0 && (node->flags & NODE_FLAGS_UNHEALTHY)) {
 		DEBUG(DEBUG_NOTICE,("monitor event OK - node re-enabled\n"));
 		node->flags &= ~NODE_FLAGS_UNHEALTHY;
-		ctdb->monitor->next_interval = 1;
+		ctdb->monitor->next_interval = 5;
 
 		ctdb_run_notification_script(ctdb, "healthy");
 
diff --git a/server/eventscript.c b/server/eventscript.c
index 3b86615..b4f5e2a 100644
--- a/server/eventscript.c
+++ b/server/eventscript.c
@@ -53,7 +53,7 @@ static void sigterm(int sig)
 
 	/* all the child processes will be running in the same process group */
 	kill(-getpgrp(), SIGKILL);
-	exit(1);
+	_exit(1);
 }
 
 struct ctdb_event_script_state {
diff --git a/tools/ctdb.c b/tools/ctdb.c
index 2f78ebe..bad4450 100644
--- a/tools/ctdb.c
+++ b/tools/ctdb.c
@@ -31,7 +31,6 @@
 #include "../common/rb_tree.h"
 #include "db_wrap.h"
 
-
 #define ERR_TIMEOUT	20	/* timed out trying to reach node */
 #define ERR_NONODE	21	/* node does not exist */
 #define ERR_DISNODE	22	/* node is disconnected */


-- 
CTDB repository


More information about the samba-cvs mailing list