merge from tridge
authorRonnie Sahlberg <sahlberg@ronnie>
Sun, 13 May 2007 20:25:15 +0000 (06:25 +1000)
committerRonnie Sahlberg <sahlberg@ronnie>
Sun, 13 May 2007 20:25:15 +0000 (06:25 +1000)
1  2 
common/ctdb_client.c
common/ctdb_control.c
common/ctdb_recover.c
direct/ctdb_recoverd.c
include/ctdb.h
include/ctdb_private.h

Simple merge
Simple merge
index 5f5112d11f8a9c33a26795e39cb8e320d0c9c221,2f1ce5a45e72873f117c74763536f5f7ad73770f..3099b7abb979e531036f4409f81c5c6e2fd6464c
@@@ -368,40 -428,19 +428,57 @@@ int32_t ctdb_control_clear_db(struct ct
        return 0;
  }
  
+ /*
+   set the recovery mode
+  */
+ int32_t ctdb_control_set_recmode(struct ctdb_context *ctdb, TDB_DATA indata, 
+                                const char **errormsg)
+ {
+       uint32_t recmode = *(uint32_t *)indata.dptr;
+       if (ctdb->freeze_mode != CTDB_FREEZE_FROZEN) {
+               DEBUG(0,("Attempt to change recovery mode to %u when not frozen\n", 
+                        recmode));
+               (*errormsg) = "Cannot change recovery mode while not frozen";
+               return -1;
+       }
+       ctdb->recovery_mode = recmode;
+       return 0;
+ }
++
 +static int traverse_bumprsn(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *p)
 +{
 +      struct ctdb_ltdb_header *header = (struct ctdb_ltdb_header *)data.dptr;
 +      int ret;
 +
 +      header->rsn++;
 +
 +      ret = tdb_store(tdb, key, data, TDB_REPLACE);
 +      if (ret) {
 +              DEBUG(0,(__location__ "failed to write tdb data back  ret:%d\n",ret));
 +              return ret;
 +      }
 +      return 0;
 +}
 +
 +int32_t ctdb_control_bump_rsn(struct ctdb_context *ctdb, TDB_DATA indata)
 +{
 +      uint32_t dbid = *(uint32_t *)indata.dptr;
 +      struct ctdb_db_context *ctdb_db;
 +
 +      ctdb_db = find_ctdb_db(ctdb, dbid);
 +      if (!ctdb_db) {
 +              DEBUG(0,(__location__ " Unknown db 0x%08x\n",dbid));
 +              return -1;
 +      }
 +
 +      if (tdb_lockall_nonblock(ctdb_db->ltdb->tdb) != 0) {
 +              DEBUG(0,(__location__ " Failed to get nonblock lock on entired db - failing\n"));
 +              return -1;
 +      }       
 +
 +      tdb_traverse(ctdb_db->ltdb->tdb, traverse_bumprsn, NULL);
 +
 +      tdb_unlockall(ctdb_db->ltdb->tdb);
 +
 +      return 0;
 +}
Simple merge
diff --cc include/ctdb.h
Simple merge
index b2119b30972bfebd6139afbed39a79e6ede4d491,2981a7861d551496feb61ce77cfc2966b2797fff..6e5c8176d12d74354dafe6ac0d087966f9062f60
@@@ -343,7 -350,8 +350,9 @@@ enum ctdb_controls {CTDB_CONTROL_PROCES
                    CTDB_CONTROL_GET_PID,
                    CTDB_CONTROL_GET_RECMASTER,
                    CTDB_CONTROL_SET_RECMASTER,
 +                  CTDB_CONTROL_BUMP_RSN,
+                   CTDB_CONTROL_FREEZE,
+                   CTDB_CONTROL_THAW,
  };
  
  
@@@ -781,6 -790,12 +791,13 @@@ int32_t ctdb_control_pull_db(struct ctd
  int32_t ctdb_control_push_db(struct ctdb_context *ctdb, TDB_DATA indata);
  int32_t ctdb_control_set_dmaster(struct ctdb_context *ctdb, TDB_DATA indata);
  int32_t ctdb_control_clear_db(struct ctdb_context *ctdb, TDB_DATA indata);
 +int32_t ctdb_control_bump_rsn(struct ctdb_context *ctdb, TDB_DATA indata);
  
+ int32_t ctdb_control_set_recmode(struct ctdb_context *ctdb, TDB_DATA data, const char **);
+ void ctdb_request_control_reply(struct ctdb_context *ctdb, struct ctdb_req_control *c,
+                               TDB_DATA *outdata, int32_t status, const char *errormsg);
+ int32_t ctdb_control_freeze(struct ctdb_context *ctdb, struct ctdb_req_control *c, bool *async_reply);
+ int32_t ctdb_control_thaw(struct ctdb_context *ctdb);
  #endif