The branch, master has been updated
       via  1a7ff4577d33f0dd470f7465c7d0e875c962f54e (commit)
       via  403c68f96e1380dd07217c688de2730464f77ea0 (commit)
      from  59a879626a6a55fb6a43cadf5338c1aa6afe96d1 (commit)

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


- Log -----------------------------------------------------------------
commit 1a7ff4577d33f0dd470f7465c7d0e875c962f54e
Author: Ronnie Sahlberg <[EMAIL PROTECTED]>
Date:   Wed Oct 22 11:06:18 2008 +1100

    new version 1.0.64

commit 403c68f96e1380dd07217c688de2730464f77ea0
Author: Ronnie Sahlberg <[EMAIL PROTECTED]>
Date:   Wed Oct 22 11:04:41 2008 +1100

    add a context and a timed event so that once we have been in recovery
    mode for too long we drop all public ip addresses

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

Summary of changes:
 include/ctdb_private.h  |    2 ++
 packaging/RPM/ctdb.spec |    5 ++++-
 server/ctdb_control.c   |    8 +-------
 server/ctdb_recover.c   |   40 ++++++++++++++++++++++++++++++++++++++++
 server/ctdb_takeover.c  |    3 +++
 server/eventscript.c    |    6 +++---
 tools/ctdb.c            |    3 +--
 7 files changed, 54 insertions(+), 13 deletions(-)


Changeset truncated at 500 lines:

diff --git a/include/ctdb_private.h b/include/ctdb_private.h
index 756c62a..9c06409 100644
--- a/include/ctdb_private.h
+++ b/include/ctdb_private.h
@@ -420,6 +420,7 @@ struct ctdb_context {
        uint32_t event_script_timeouts; /* counting how many consecutive times 
an eventscript has timedout */
        TALLOC_CTX *eventscripts_ctx; /* a context to hold data for the 
RUN_EVENTSCRIPTS control */
        uint32_t *recd_ping_count;
+       TALLOC_CTX *release_ips_ctx; /* a context used to automatically drop 
all IPs if we fail to recover the node */
 };
 
 struct ctdb_db_context {
@@ -1422,6 +1423,7 @@ char *ctdb_addr_to_str(ctdb_sock_addr *addr);
 void ctdb_canonicalize_ip(const ctdb_sock_addr *ip, ctdb_sock_addr *cip);
 
 int32_t ctdb_control_recd_ping(struct ctdb_context *ctdb);
+int32_t ctdb_control_set_recmaster(struct ctdb_context *ctdb, uint32_t opcode, 
TDB_DATA indata);
 
 extern int script_log_level;
 
diff --git a/packaging/RPM/ctdb.spec b/packaging/RPM/ctdb.spec
index a052910..2fed220 100644
--- a/packaging/RPM/ctdb.spec
+++ b/packaging/RPM/ctdb.spec
@@ -5,7 +5,7 @@ Vendor: Samba Team
 Packager: Samba Team <[EMAIL PROTECTED]>
 Name: ctdb
 Version: 1.0
-Release: 63
+Release: 64
 Epoch: 0
 License: GNU GPL version 3
 Group: System Environment/Daemons
@@ -120,6 +120,9 @@ fi
 %{_includedir}/ctdb_private.h
 
 %changelog
+* Mon Oct 22 2008 : Version 1.0.64
+ - Add a context and a timed event so that once we have been in recovery for
+   too long we drop all public addresses.
 * Mon Oct 20 2008 : Version 1.0.63
  - Remove logging of "periodic cleanup ..." in 50.samba
  - When we reload a nodes file, we must detect this and reload the file also
diff --git a/server/ctdb_control.c b/server/ctdb_control.c
index fa38fea..5f65547 100644
--- a/server/ctdb_control.c
+++ b/server/ctdb_control.c
@@ -160,13 +160,7 @@ static int32_t ctdb_control_dispatch(struct ctdb_context 
*ctdb,
        }
 
        case CTDB_CONTROL_SET_RECMASTER: {
-               CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
-               if (ctdb->freeze_mode != CTDB_FREEZE_FROZEN) {
-                       DEBUG(DEBUG_NOTICE,("Attempt to set recmaster when not 
frozen\n"));
-                       return -1;
-               }
-               ctdb->recovery_master = ((uint32_t *)(&indata.dptr[0]))[0];
-               return 0;
+               return ctdb_control_set_recmaster(ctdb, opcode, indata);
        }
 
        case CTDB_CONTROL_GET_RECMASTER:
diff --git a/server/ctdb_recover.c b/server/ctdb_recover.c
index 8d61704..c8b0ba0 100644
--- a/server/ctdb_recover.c
+++ b/server/ctdb_recover.c
@@ -529,6 +529,19 @@ static void set_recmode_handler(struct event_context *ev, 
struct fd_event *fde,
        return;
 }
 
+static void
+ctdb_drop_all_ips_event(struct event_context *ev, struct timed_event *te, 
+                              struct timeval t, void *private_data)
+{
+       struct ctdb_context *ctdb = talloc_get_type(private_data, struct 
ctdb_context);
+
+       DEBUG(DEBUG_INFO,(__location__ " Been in recovery mode for too long. 
Dropping all IPS\n"));
+       talloc_free(ctdb->release_ips_ctx);
+       ctdb->release_ips_ctx = NULL;
+
+       ctdb_release_all_ips(ctdb);
+}
+
 /*
   set the recovery mode
  */
@@ -542,6 +555,21 @@ int32_t ctdb_control_set_recmode(struct ctdb_context *ctdb,
        struct ctdb_set_recmode_state *state;
        pid_t parent = getpid();
 
+       /* if we enter recovery but stay in recovery for too long
+          we will eventually drop all our ip addresses
+       */
+       if (recmode == CTDB_RECOVERY_NORMAL) {
+               talloc_free(ctdb->release_ips_ctx);
+               ctdb->release_ips_ctx = NULL;
+       } else {
+               talloc_free(ctdb->release_ips_ctx);
+               ctdb->release_ips_ctx = talloc_new(ctdb);
+               CTDB_NO_MEMORY(ctdb, ctdb->release_ips_ctx);
+
+               event_add_timed(ctdb->ev, ctdb->release_ips_ctx, 
timeval_current_ofs(5,0), ctdb_drop_all_ips_event, ctdb);
+       }
+
+
        if (ctdb->freeze_mode != CTDB_FREEZE_FROZEN) {
                DEBUG(DEBUG_ERR,("Attempt to change recovery mode to %u when 
not frozen\n", 
                         recmode));
@@ -1045,3 +1073,15 @@ int32_t ctdb_control_recd_ping(struct ctdb_context *ctdb)
        return 0;
 }
 
+
+
+int32_t ctdb_control_set_recmaster(struct ctdb_context *ctdb, uint32_t opcode, 
TDB_DATA indata)
+{
+       CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
+       if (ctdb->freeze_mode != CTDB_FREEZE_FROZEN) {
+               DEBUG(DEBUG_NOTICE,("Attempt to set recmaster when not 
frozen\n"));
+               return -1;
+       }
+       ctdb->recovery_master = ((uint32_t *)(&indata.dptr[0]))[0];
+       return 0;
+}
diff --git a/server/ctdb_takeover.c b/server/ctdb_takeover.c
index 6533d71..c14afb3 100644
--- a/server/ctdb_takeover.c
+++ b/server/ctdb_takeover.c
@@ -1291,6 +1291,9 @@ void ctdb_release_all_ips(struct ctdb_context *ctdb)
                if (!ctdb_sys_have_ip(&vnn->public_address)) {
                        continue;
                }
+               if (vnn->pnn == ctdb->pnn) {
+                       vnn->pnn = -1;
+               }
                ctdb_event_script(ctdb, "releaseip %s %s %u",
                                  vnn->iface, 
                                  talloc_strdup(ctdb, 
ctdb_addr_to_str(&vnn->public_address)),
diff --git a/server/eventscript.c b/server/eventscript.c
index deaf750..6edd1a4 100644
--- a/server/eventscript.c
+++ b/server/eventscript.c
@@ -72,13 +72,13 @@ static int ctdb_event_script_v(struct ctdb_context *ctdb, 
const char *options)
        if (ctdb->recovery_mode != CTDB_RECOVERY_NORMAL) {
                /* we guarantee that only some specifically allowed event 
scripts are run
                   while in recovery */
-               const char *allowed_scripts[] = {"startrecovery", "shutdown" };
+               const char *allowed_scripts[] = {"startrecovery", "shutdown", 
"releaseip" };
                int i;
                for (i=0;i<ARRAY_SIZE(allowed_scripts);i++) {
-                       if (strcmp(options, allowed_scripts[i]) == 0) break;
+                       if (strncmp(options, allowed_scripts[i], 
strlen(allowed_scripts[i])) == 0) break;
                }
                if (i == ARRAY_SIZE(allowed_scripts)) {
-                       DEBUG(0,("Refusing to run event scripts with option 
'%s' while in recovery\n",
+                       DEBUG(DEBUG_ERR,("Refusing to run event scripts with 
option '%s' while in recovery\n",
                                 options));
                        return -1;
                }
diff --git a/tools/ctdb.c b/tools/ctdb.c
index 5055c26..5c553e6 100644
--- a/tools/ctdb.c
+++ b/tools/ctdb.c
@@ -441,8 +441,7 @@ static int control_status(struct ctdb_context *ctdb, int 
argc, const char **argv
 static int control_recmaster(struct ctdb_context *ctdb, int argc, const char 
**argv)
 {
        int ret;
-       uint32_t recmode, recmaster;
-       int mypnn;
+       uint32_t recmaster;
 
        ret = ctdb_ctrl_getrecmaster(ctdb, ctdb, TIMELIMIT(), options.pnn, 
&recmaster);
        if (ret != 0) {


-- 
CTDB repository

Reply via email to