summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2011-12-03 02:15:30 +0100
committerMichael Adam <obnox@samba.org>2011-12-03 02:15:30 +0100
commitad0de5494e90e14b61f66ac6232fae50381029bb (patch)
tree6e6e5662eb696bc8fc1f61730c97c8e0dc67b5d2
parente15df55b5e5e0ca8763b12e345e4cce4ebce6d3e (diff)
downloadsamba-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.c4
-rw-r--r--ctdb/include/ctdb_private.h5
-rw-r--r--ctdb/include/ctdb_protocol.h7
-rw-r--r--ctdb/server/ctdb_control.c4
-rw-r--r--ctdb/server/ctdb_traverse.c39
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);
+}