[SCM] CTDB repository - branch master updated - ctdb-1.12-86-g8281bb2

Michael Adam obnox at samba.org
Fri Dec 2 18:21:49 MST 2011


The branch, master has been updated
       via  8281bb210858ed04992eacea7f6d02261e0fc1b1 (commit)
      from  6489d0d9b8ec14c7764a1865618faf659800bcc3 (commit)

http://gitweb.samba.org/?p=ctdb.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8281bb210858ed04992eacea7f6d02261e0fc1b1
Author: Michael Adam <obnox at samba.org>
Date:   Sat Dec 3 02:15:30 2011 +0100

    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.

-----------------------------------------------------------------------

Summary of changes:
 client/ctdb_client.c    |    4 ++--
 include/ctdb_private.h  |    5 +++++
 include/ctdb_protocol.h |    7 +++++++
 server/ctdb_control.c   |    4 ++++
 server/ctdb_traverse.c  |   39 ++++++++++++++++++++++++++++++++++-----
 5 files changed, 52 insertions(+), 7 deletions(-)


Changeset truncated at 500 lines:

diff --git a/client/ctdb_client.c b/client/ctdb_client.c
index 75ad0e1..224cdc0 100644
--- a/client/ctdb_client.c
+++ b/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/include/ctdb_private.h b/include/ctdb_private.h
index 4155bac..f545eaa 100644
--- a/include/ctdb_private.h
+++ b/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/include/ctdb_protocol.h b/include/ctdb_protocol.h
index 99e3f4f..c71bafa 100644
--- a/include/ctdb_protocol.h
+++ b/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/server/ctdb_control.c b/server/ctdb_control.c
index 602e994..060f2c5 100644
--- a/server/ctdb_control.c
+++ b/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/server/ctdb_traverse.c b/server/ctdb_traverse.c
index d719f6f..da5a548 100644
--- a/server/ctdb_traverse.c
+++ b/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);
+}


-- 
CTDB repository


More information about the samba-cvs mailing list