mirror of
https://github.com/samba-team/samba.git
synced 2025-02-28 01:58:17 +03:00
control to delete all records in a database
(This used to be ctdb commit 6664e00fc02e1c60cc1a35ecd15f4893a34f23d1)
This commit is contained in:
parent
c0b0b4a0f5
commit
376a3ea852
@ -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
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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};
|
||||
|
||||
|
@ -44,6 +44,7 @@ static void usage(void)
|
||||
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);
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user