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;
+}
CTDB_CONTROL_GET_PID,
CTDB_CONTROL_GET_RECMASTER,
CTDB_CONTROL_SET_RECMASTER,
+ CTDB_CONTROL_BUMP_RSN,
+ CTDB_CONTROL_FREEZE,
+ CTDB_CONTROL_THAW,
};
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