From: Ronnie Sahlberg Date: Sun, 29 Apr 2007 08:48:46 +0000 (+1000) Subject: control to delete all records in a database X-Git-Tag: tevent-0.9.20~348^2~2800^2~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=376a3ea85224f805ad12c245f01c96b7b188cd9b;p=thirdparty%2Fsamba.git control to delete all records in a database (This used to be ctdb commit 6664e00fc02e1c60cc1a35ecd15f4893a34f23d1) --- diff --git a/ctdb/common/ctdb_client.c b/ctdb/common/ctdb_client.c index b6a3963a497..990c3d4dddc 100644 --- a/ctdb/common/ctdb_client.c +++ b/ctdb/common/ctdb_client.c @@ -984,6 +984,31 @@ int ctdb_setdmaster(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX *me 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 */ diff --git a/ctdb/common/ctdb_control.c b/ctdb/common/ctdb_control.c index 903722a1846..eab6cf5af44 100644 --- a/ctdb/common/ctdb_control.c +++ b/ctdb/common/ctdb_control.c @@ -43,6 +43,19 @@ struct ctdb_control_state { } 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; @@ -237,7 +250,6 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb, 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])); @@ -251,17 +263,10 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb, 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; } @@ -269,7 +274,6 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb, 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); @@ -283,15 +287,26 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb, 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; } diff --git a/ctdb/include/ctdb.h b/ctdb/include/ctdb.h index ef38582f3cd..bf8643f22dd 100644 --- a/ctdb/include/ctdb.h +++ b/ctdb/include/ctdb.h @@ -266,4 +266,9 @@ int ctdb_set_debuglevel(struct ctdb_context *ctdb, uint32_t destnode, uint32_t l */ 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 diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index f1d414efb67..5207bea9709 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -256,7 +256,8 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS, 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}; diff --git a/ctdb/tools/ctdb_control.c b/ctdb/tools/ctdb_control.c index c5f28eb87ca..f96fad8af1e 100644 --- a/ctdb/tools/ctdb_control.c +++ b/ctdb/tools/ctdb_control.c @@ -44,6 +44,7 @@ static void usage(void) printf(" getnodemap lists nodes known to a ctdb daemon\n"); printf(" getkeys lists all keys in a remote tdb\n"); printf(" setdmaster sets new dmaster for all records in the database\n"); + printf(" cleardb deletes all records in a db\n"); exit(1); } @@ -305,7 +306,7 @@ static int control_setdmaster(struct ctdb_context *ctdb, int argc, const char ** uint32_t vnn, dbid, dmaster; int ret; - if (argc < 2) { + if (argc < 3) { usage(); } @@ -321,6 +322,29 @@ static int control_setdmaster(struct ctdb_context *ctdb, int argc, const char ** 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 */ @@ -451,6 +475,8 @@ int main(int argc, const char *argv[]) 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) {