return 0;
}
+/*
+ delete all records from a tdb
+ */
+int ctdb_cleardb(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX *mem_ctx, uint32_t dbid)
+{
+ int ret;
+ TDB_DATA indata, outdata;
+ int32_t res;
+
+ indata.dsize = sizeof(uint32_t);
+ indata.dptr = (unsigned char *)talloc_array(mem_ctx, uint32_t, 1);
+
+ ((uint32_t *)(&indata.dptr[0]))[0] = dbid;
+
+ ret = ctdb_control(ctdb, destnode, 0,
+ CTDB_CONTROL_CLEAR_DB, indata,
+ mem_ctx, &outdata, &res);
+ if (ret != 0 || res != 0) {
+ DEBUG(0,(__location__ " ctdb_control for cleardb failed\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
/*
ping a node
*/
} while (0)
+static int traverse_cleardb(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *p)
+{
+ int ret;
+
+
+ ret = tdb_delete(tdb, key);
+ if (ret) {
+ DEBUG(0,(__location__ "failed to delete tdb record\n"));
+ return ret;
+ }
+ return 0;
+}
+
static int traverse_setdmaster(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *p)
{
uint32_t *dmaster = (uint32_t *)p;
case CTDB_CONTROL_GET_KEYS: {
uint32_t dbid;
struct ctdb_db_context *ctdb_db;
- struct tdb_wrap *db;
struct getkeys_params params;
dbid = *((uint32_t *)(&indata.dptr[0]));
outdata->dptr = (unsigned char *)talloc_array(outdata, uint32_t, 1);
*((uint32_t *)(&outdata->dptr[0]))=0;
- db = tdb_wrap_open(NULL, ctdb_db->db_path, 0, TDB_DEFAULT, O_RDONLY, 0);
- if (db == NULL) {
- DEBUG(0,(__location__ " failed to open db\n"));
- return -1;
- }
-
params.ctdb_db = ctdb_db;
params.outdata = outdata;
- tdb_traverse(db->tdb, traverse_getkeys, ¶ms);
+ tdb_traverse_read(ctdb_db->ltdb->tdb, traverse_getkeys, ¶ms);
- talloc_free(db);
return 0;
}
case CTDB_CONTROL_SET_DMASTER: {
uint32_t dbid, dmaster;
struct ctdb_db_context *ctdb_db;
- struct tdb_wrap *db;
dbid = ((uint32_t *)(&indata.dptr[0]))[0];
ctdb_db = find_ctdb_db(ctdb, dbid);
outdata->dsize = 0;
outdata->dptr = NULL;
- db = tdb_wrap_open(NULL, ctdb_db->db_path, 0, TDB_DEFAULT, O_RDONLY, 0);
- if (db == NULL) {
- DEBUG(0,(__location__ " failed to open db\n"));
+ tdb_traverse(ctdb_db->ltdb->tdb, traverse_setdmaster, &dmaster);
+
+ return 0;
+ }
+
+ case CTDB_CONTROL_CLEAR_DB: {
+ uint32_t dbid;
+ struct ctdb_db_context *ctdb_db;
+
+ dbid = ((uint32_t *)(&indata.dptr[0]))[0];
+ ctdb_db = find_ctdb_db(ctdb, dbid);
+ if (!ctdb_db) {
+ DEBUG(0,(__location__ " Unknown db 0x%08x\n",dbid));
return -1;
}
- tdb_traverse(db->tdb, traverse_setdmaster, &dmaster);
+ outdata->dsize = 0;
+ outdata->dptr = NULL;
- talloc_free(db);
+ tdb_traverse(ctdb_db->ltdb->tdb, traverse_cleardb, NULL);
return 0;
}
*/
int ctdb_setdmaster(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX *mem_ctx, uint32_t dbid, uint32_t dmaster);
+/*
+ delete all records from a tdb
+ */
+int ctdb_cleardb(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX *mem_ctx, uint32_t dbid);
+
#endif
CTDB_CONTROL_GET_DBMAP,
CTDB_CONTROL_GET_NODEMAP,
CTDB_CONTROL_GET_KEYS,
- CTDB_CONTROL_SET_DMASTER};
+ CTDB_CONTROL_SET_DMASTER,
+ CTDB_CONTROL_CLEAR_DB};
enum call_state {CTDB_CALL_WAIT, CTDB_CALL_DONE, CTDB_CALL_ERROR};
printf(" getnodemap <vnn> lists nodes known to a ctdb daemon\n");
printf(" getkeys <vnn> <dbid> lists all keys in a remote tdb\n");
printf(" setdmaster <vnn> <dbid> <dmaster> sets new dmaster for all records in the database\n");
+ printf(" cleardb <vnn> <dbid> deletes all records in a db\n");
exit(1);
}
uint32_t vnn, dbid, dmaster;
int ret;
- if (argc < 2) {
+ if (argc < 3) {
usage();
}
return 0;
}
+/*
+ clears a database
+ */
+static int control_cleardb(struct ctdb_context *ctdb, int argc, const char **argv)
+{
+ uint32_t vnn, dbid;
+ int ret;
+
+ if (argc < 2) {
+ usage();
+ }
+
+ vnn = strtoul(argv[0], NULL, 0);
+ dbid = strtoul(argv[1], NULL, 0);
+
+ ret = ctdb_cleardb(ctdb, vnn, ctdb, dbid);
+ if (ret != 0) {
+ printf("Unable to clear db for node %u db:0x%08x\n", vnn, dbid);
+ return ret;
+ }
+ return 0;
+}
+
/*
ping all node
*/
ret = control_setvnnmap(ctdb, extra_argc-1, extra_argv+1);
} else if (strcmp(control, "setdmaster") == 0) {
ret = control_setdmaster(ctdb, extra_argc-1, extra_argv+1);
+ } else if (strcmp(control, "cleardb") == 0) {
+ ret = control_cleardb(ctdb, extra_argc-1, extra_argv+1);
} else if (strcmp(control, "ping") == 0) {
ret = control_ping(ctdb, extra_argc-1, extra_argv+1);
} else if (strcmp(control, "debug") == 0) {