diff options
author | Michael Adam <obnox@samba.org> | 2011-12-03 02:15:30 +0100 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2011-12-03 02:15:30 +0100 |
commit | ad0de5494e90e14b61f66ac6232fae50381029bb (patch) | |
tree | 6e6e5662eb696bc8fc1f61730c97c8e0dc67b5d2 | |
parent | e15df55b5e5e0ca8763b12e345e4cce4ebce6d3e (diff) | |
download | samba-ad0de5494e90e14b61f66ac6232fae50381029bb.tar.gz samba-ad0de5494e90e14b61f66ac6232fae50381029bb.tar.xz samba-ad0de5494e90e14b61f66ac6232fae50381029bb.zip |
traverse: fix traversing with empty records by adding a new (internal) control CTDB_CONTROL_TRAVERSE_START_EXT
By this, the original CTDB_CONTROL_TRAVERSE_START control that is
used by e.g. samba's smbstatus, is not changed, so that samba
continues working without code change.
The CTDB_CONTROL_TRAVERSE_START currently just adds the "withemptyrecords"
flag to the state and processon on as CTDB_CONTROL_TRAVERSE_START_EXT.
(This used to be ctdb commit 8281bb210858ed04992eacea7f6d02261e0fc1b1)
-rw-r--r-- | ctdb/client/ctdb_client.c | 4 | ||||
-rw-r--r-- | ctdb/include/ctdb_private.h | 5 | ||||
-rw-r--r-- | ctdb/include/ctdb_protocol.h | 7 | ||||
-rw-r--r-- | ctdb/server/ctdb_control.c | 4 | ||||
-rw-r--r-- | ctdb/server/ctdb_traverse.c | 39 |
5 files changed, 52 insertions, 7 deletions
diff --git a/ctdb/client/ctdb_client.c b/ctdb/client/ctdb_client.c index 75ad0e134f..224cdc03ee 100644 --- a/ctdb/client/ctdb_client.c +++ b/ctdb/client/ctdb_client.c @@ -2059,7 +2059,7 @@ static int ctdb_traverse_ext(struct ctdb_db_context *ctdb_db, void *private_data) { TDB_DATA data; - struct ctdb_traverse_start t; + struct ctdb_traverse_start_ext t; int32_t status; int ret; uint64_t srvid = (getpid() | 0xFLL<<60); @@ -2085,7 +2085,7 @@ static int ctdb_traverse_ext(struct ctdb_db_context *ctdb_db, data.dptr = (uint8_t *)&t; data.dsize = sizeof(t); - ret = ctdb_control(ctdb_db->ctdb, CTDB_CURRENT_NODE, 0, CTDB_CONTROL_TRAVERSE_START, 0, + ret = ctdb_control(ctdb_db->ctdb, CTDB_CURRENT_NODE, 0, CTDB_CONTROL_TRAVERSE_START_EXT, 0, data, NULL, NULL, &status, NULL, NULL); if (ret != 0 || status != 0) { DEBUG(DEBUG_ERR,("ctdb_traverse_all failed\n")); diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index 4155bac45b..f545eaa4b4 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -955,6 +955,11 @@ struct ctdb_client_call_state { }; +int32_t ctdb_control_traverse_start_ext(struct ctdb_context *ctdb, + TDB_DATA indata, + TDB_DATA *outdata, + uint32_t srcnode, + uint32_t client_id); int32_t ctdb_control_traverse_start(struct ctdb_context *ctdb, TDB_DATA indata, TDB_DATA *outdata, uint32_t srcnode, uint32_t client_id); int32_t ctdb_control_traverse_all(struct ctdb_context *ctdb, TDB_DATA data, TDB_DATA *outdata); diff --git a/ctdb/include/ctdb_protocol.h b/ctdb/include/ctdb_protocol.h index 99e3f4fd9e..c71bafaaeb 100644 --- a/ctdb/include/ctdb_protocol.h +++ b/ctdb/include/ctdb_protocol.h @@ -374,6 +374,7 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS = 0, CTDB_CONTROL_SCHEDULE_FOR_DELETION = 128, CTDB_CONTROL_SET_DB_READONLY = 129, CTDB_CONTROL_CHECK_SRVIDS = 130, + CTDB_CONTROL_TRAVERSE_START_EXT = 131, }; /* @@ -582,6 +583,12 @@ struct ctdb_traverse_start { uint32_t db_id; uint32_t reqid; uint64_t srvid; +}; + +struct ctdb_traverse_start_ext { + uint32_t db_id; + uint32_t reqid; + uint64_t srvid; bool withemptyrecords; }; diff --git a/ctdb/server/ctdb_control.c b/ctdb/server/ctdb_control.c index 602e994b1d..060f2c5cf3 100644 --- a/ctdb/server/ctdb_control.c +++ b/ctdb/server/ctdb_control.c @@ -247,6 +247,10 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb, CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_traverse_start)); return ctdb_control_traverse_start(ctdb, indata, outdata, srcnode, client_id); + case CTDB_CONTROL_TRAVERSE_START_EXT: + CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_traverse_start_ext)); + return ctdb_control_traverse_start_ext(ctdb, indata, outdata, srcnode, client_id); + case CTDB_CONTROL_TRAVERSE_ALL: return ctdb_control_traverse_all(ctdb, indata, outdata); diff --git a/ctdb/server/ctdb_traverse.c b/ctdb/server/ctdb_traverse.c index d719f6f410..da5a548da5 100644 --- a/ctdb/server/ctdb_traverse.c +++ b/ctdb/server/ctdb_traverse.c @@ -557,13 +557,17 @@ static void traverse_start_callback(void *p, TDB_DATA key, TDB_DATA data) } -/* - start a traverse_all - called as a control from a client +/** + * start a traverse_all - called as a control from a client. + * extended version to take the "withemptyrecords" parameter. */ -int32_t ctdb_control_traverse_start(struct ctdb_context *ctdb, TDB_DATA data, - TDB_DATA *outdata, uint32_t srcnode, uint32_t client_id) +int32_t ctdb_control_traverse_start_ext(struct ctdb_context *ctdb, + TDB_DATA data, + TDB_DATA *outdata, + uint32_t srcnode, + uint32_t client_id) { - struct ctdb_traverse_start *d = (struct ctdb_traverse_start *)data.dptr; + struct ctdb_traverse_start_ext *d = (struct ctdb_traverse_start_ext *)data.dptr; struct traverse_start_state *state; struct ctdb_db_context *ctdb_db; struct ctdb_client *client = ctdb_reqid_find(ctdb, client_id, struct ctdb_client); @@ -615,3 +619,28 @@ int32_t ctdb_control_traverse_start(struct ctdb_context *ctdb, TDB_DATA data, return 0; } + +/** + * start a traverse_all - called as a control from a client. + */ +int32_t ctdb_control_traverse_start(struct ctdb_context *ctdb, + TDB_DATA data, + TDB_DATA *outdata, + uint32_t srcnode, + uint32_t client_id) +{ + struct ctdb_traverse_start *d = (struct ctdb_traverse_start *)data.dptr; + struct ctdb_traverse_start_ext d2; + TDB_DATA data2; + + ZERO_STRUCT(d2); + d2.db_id = d->db_id; + d2.reqid = d->reqid; + d2.srvid = d->srvid; + d2.withemptyrecords = false; + + data2.dsize = sizeof(d2); + data2.dptr = (uint8_t *)&d2; + + return ctdb_control_traverse_start_ext(ctdb, data2, outdata, srcnode, client_id); +} |