[SCM] Samba Shared Repository - branch master updated

Martin Schwenke martins at samba.org
Wed Feb 24 10:58:02 UTC 2016


The branch, master has been updated
       via  d7f552c ctdb-client: Add missing initialisation of calldata
       via  6444765 ctdb-client: Keep trying to migrate till record lock is obtained
       via  fbd3fd3 ctdb-client: Remove TALLOC_CTX argument from sync functions
       via  d23c5a6 ctdb-client: Add async version of set/remove message handler functions
       via  1f2c990 ctdb-client: Add sync API for waiting for recovery
       via  cf3a0aa ctdb-client: Drop TALLOC_CTX argument from ctdb_attach
       via  69113fa ctdb-client: Add new API for ctdb_client_wait_timeout()
       via  d8c28fc ctdb-client: Do not use sync functions in async computation
       via  e8d4b5d ctdb-client: Do not use sync functions in async computation
      from  b4239ca idmap_script: Parallelize script calls

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit d7f552cbbd173db941ef752fb70609eb1b0d0e70
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Sat Nov 21 23:36:00 2015 +1100

    ctdb-client: Add missing initialisation of calldata
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    
    Autobuild-User(master): Martin Schwenke <martins at samba.org>
    Autobuild-Date(master): Wed Feb 24 11:57:23 CET 2016 on sn-devel-144

commit 64447653ed793f9935b7495a7d0e594983288bdd
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Nov 20 16:22:41 2015 +1100

    ctdb-client: Keep trying to migrate till record lock is obtained
    
    If a record is not on a local node, then it is migrated from remote node.
    However, before the client can get a lock on the record, it's possible
    for the record to get migrated away.  In that case, repeat migration.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit fbd3fd343bd0d1c6c03f8ae82ae79ad5580af421
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Wed Nov 18 15:15:16 2015 +1100

    ctdb-client: Remove TALLOC_CTX argument from sync functions
    
    There is no allocated memory returned from these functions.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit d23c5a6c2f365b249233f9a1c6d42d220b2b7c67
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Wed Nov 18 15:11:37 2015 +1100

    ctdb-client: Add async version of set/remove message handler functions
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 1f2c9903723e84416e0cd44f1c4da6fcd8464ea6
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Nov 17 16:58:26 2015 +1100

    ctdb-client: Add sync API for waiting for recovery
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit cf3a0aa4102fd0e0417edfbb51785e2c04625a76
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Nov 17 16:52:54 2015 +1100

    ctdb-client: Drop TALLOC_CTX argument from ctdb_attach
    
    The database context returned is allocated off the client and is not
    allocated from user-supplied TALLOC_CTX.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 69113fa02efb9f21592b25a46d000f7fff173453
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Nov 10 16:59:21 2015 +1100

    ctdb-client: Add new API for ctdb_client_wait_timeout()
    
    This is similar to ctdb_client_wait() with additional timeout argument.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit d8c28fc9729b371a9521f959054985749248be26
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Nov 6 17:08:48 2015 +1100

    ctdb-client: Do not use sync functions in async computation
    
    This leads to nested event loops.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit e8d4b5d58399aac7ed57a14b92193606499baf7f
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Nov 6 15:44:27 2015 +1100

    ctdb-client: Do not use sync functions in async computation
    
    This leads to nested event loops.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

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

Summary of changes:
 ctdb/client/client.h         |  32 +++++--
 ctdb/client/client_connect.c | 131 ++++++++++++++++++++++------
 ctdb/client/client_db.c      | 108 ++++++++++++++++++-----
 ctdb/client/client_message.c | 199 ++++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 414 insertions(+), 56 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/client/client.h b/ctdb/client/client.h
index f2f8d6b..df0b9b8 100644
--- a/ctdb/client/client.h
+++ b/ctdb/client/client.h
@@ -45,12 +45,18 @@ uint32_t ctdb_client_pnn(struct ctdb_client_context *client);
 
 void ctdb_client_wait(struct tevent_context *ev, bool *done);
 
+int ctdb_client_wait_timeout(struct tevent_context *ev, bool *done,
+			     struct timeval timeout);
+
 struct tevent_req *ctdb_recovery_wait_send(TALLOC_CTX *mem_ctx,
 					   struct tevent_context *ev,
 					   struct ctdb_client_context *client);
 
 bool ctdb_recovery_wait_recv(struct tevent_req *req, int *perr);
 
+bool ctdb_recovery_wait(struct tevent_context *ev,
+			struct ctdb_client_context *client);
+
 /* from client/client_call.c */
 
 struct tevent_req *ctdb_client_call_send(TALLOC_CTX *mem_ctx,
@@ -76,14 +82,30 @@ int ctdb_client_message(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
 			struct ctdb_client_context *client,
 			uint32_t destnode, struct ctdb_req_message *message);
 
-int ctdb_client_set_message_handler(TALLOC_CTX *mem_ctx,
-				    struct tevent_context *ev,
+struct tevent_req *ctdb_client_set_message_handler_send(
+					TALLOC_CTX *mem_ctx,
+					struct tevent_context *ev,
+					struct ctdb_client_context *client,
+					uint64_t srvid,
+					srvid_handler_fn handler,
+					void *private_data);
+bool ctdb_client_set_message_handler_recv(struct tevent_req *req, int *perr);
+
+struct tevent_req *ctdb_client_remove_message_handler_send(
+					TALLOC_CTX *mem_ctx,
+					struct tevent_context *ev,
+					struct ctdb_client_context *client,
+					uint64_t srvid,
+					void *private_data);
+bool ctdb_client_remove_message_handler_recv(struct tevent_req *req,
+					     int *perr);
+
+int ctdb_client_set_message_handler(struct tevent_context *ev,
 				    struct ctdb_client_context *client,
 				    uint64_t srvid, srvid_handler_fn handler,
 				    void *private_data);
 
-int ctdb_client_remove_message_handler(TALLOC_CTX *mem_ctx,
-				       struct tevent_context *ev,
+int ctdb_client_remove_message_handler(struct tevent_context *ev,
 				       struct ctdb_client_context *client,
 				       uint64_t srvid, void *private_data);
 
@@ -715,7 +737,7 @@ struct tevent_req *ctdb_attach_send(TALLOC_CTX *mem_ctx,
 bool ctdb_attach_recv(struct tevent_req *req, int *perr,
 		      struct ctdb_db_context **out);
 
-int ctdb_attach(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
+int ctdb_attach(struct tevent_context *ev,
 		struct ctdb_client_context *client,
 		struct timeval timeout,
 		const char *db_name, uint8_t db_flags,
diff --git a/ctdb/client/client_connect.c b/ctdb/client/client_connect.c
index d433f7d..f2fe673 100644
--- a/ctdb/client/client_connect.c
+++ b/ctdb/client/client_connect.c
@@ -239,11 +239,55 @@ void ctdb_client_wait(struct tevent_context *ev, bool *done)
 	}
 }
 
+static void ctdb_client_wait_timeout_handler(struct tevent_context *ev,
+					     struct tevent_timer *te,
+					     struct timeval t,
+					     void *private_data)
+{
+	bool *timed_out = (bool *)private_data;
+
+	*timed_out = true;
+}
+
+int ctdb_client_wait_timeout(struct tevent_context *ev, bool *done,
+			     struct timeval timeout)
+{
+	TALLOC_CTX *mem_ctx;
+	struct tevent_timer *timer;
+	bool timed_out = false;
+
+	mem_ctx = talloc_new(ev);
+	if (mem_ctx == NULL) {
+		return ENOMEM;
+	}
+
+	timer = tevent_add_timer(ev, mem_ctx, timeout,
+				 ctdb_client_wait_timeout_handler,
+				 &timed_out);
+	if (timer == NULL) {
+		talloc_free(mem_ctx);
+		return ENOMEM;
+	}
+
+	while (! (*done) && ! timed_out) {
+		tevent_loop_once(ev);
+	}
+
+	talloc_free(mem_ctx);
+
+	if (timed_out) {
+		return ETIME;
+	}
+
+	return 0;
+}
+
 struct ctdb_recovery_wait_state {
 	struct tevent_context *ev;
 	struct ctdb_client_context *client;
 };
 
+static void ctdb_recovery_wait_recmode(struct tevent_req *subreq);
 static void ctdb_recovery_wait_retry(struct tevent_req *subreq);
 
 struct tevent_req *ctdb_recovery_wait_send(TALLOC_CTX *mem_ctx,
@@ -252,8 +296,7 @@ struct tevent_req *ctdb_recovery_wait_send(TALLOC_CTX *mem_ctx,
 {
 	struct tevent_req *req, *subreq;
 	struct ctdb_recovery_wait_state *state;
-	int recmode;
-	int ret;
+	struct ctdb_req_control request;
 
 	req = tevent_req_create(mem_ctx, &state,
 				struct ctdb_recovery_wait_state);
@@ -264,47 +307,36 @@ struct tevent_req *ctdb_recovery_wait_send(TALLOC_CTX *mem_ctx,
 	state->ev = ev;
 	state->client = client;
 
-	ret = ctdb_ctrl_get_recmode(client, ev, client, client->pnn,
-				    tevent_timeval_zero(), &recmode);
-	if (ret != 0) {
-		tevent_req_error(req, ret);
-		return tevent_req_post(req, ev);
-	}
-
-	if (recmode == CTDB_RECOVERY_NORMAL) {
-		tevent_req_done(req);
-		return tevent_req_post(req, ev);
-	}
-
-	subreq = tevent_wakeup_send(state, ev,
-				    tevent_timeval_current_ofs(1, 0));
+	ctdb_req_control_get_recmode(&request);
+	subreq = ctdb_client_control_send(state, ev, client, client->pnn,
+					  tevent_timeval_zero(), &request);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
-	tevent_req_set_callback(subreq, ctdb_recovery_wait_retry, req);
+	tevent_req_set_callback(subreq, ctdb_recovery_wait_recmode, req);
 
 	return req;
 }
 
-static void ctdb_recovery_wait_retry(struct tevent_req *subreq)
+static void ctdb_recovery_wait_recmode(struct tevent_req *subreq)
 {
 	struct tevent_req *req = tevent_req_callback_data(
 		subreq, struct tevent_req);
 	struct ctdb_recovery_wait_state *state = tevent_req_data(
 		req, struct ctdb_recovery_wait_state);
-	int ret, recmode;
+	struct ctdb_reply_control *reply;
+	int recmode;
+	int ret;
 	bool status;
 
-	status = tevent_wakeup_recv(subreq);
+	status = ctdb_client_control_recv(subreq, &ret, state, &reply);
 	TALLOC_FREE(subreq);
 	if (! status) {
-		tevent_req_error(req, ENOMEM);
+		tevent_req_error(req, ret);
 		return;
 	}
 
-	ret = ctdb_ctrl_get_recmode(state, state->ev, state->client,
-				    ctdb_client_pnn(state->client),
-				    tevent_timeval_zero(), &recmode);
+	ret = ctdb_reply_control_get_recmode(reply, &recmode);
 	if (ret != 0) {
 		tevent_req_error(req, ret);
 		return;
@@ -323,6 +355,32 @@ static void ctdb_recovery_wait_retry(struct tevent_req *subreq)
 	tevent_req_set_callback(subreq, ctdb_recovery_wait_retry, req);
 }
 
+static void ctdb_recovery_wait_retry(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct ctdb_recovery_wait_state *state = tevent_req_data(
+		req, struct ctdb_recovery_wait_state);
+	struct ctdb_req_control request;
+	bool status;
+
+	status = tevent_wakeup_recv(subreq);
+	TALLOC_FREE(subreq);
+	if (! status) {
+		tevent_req_error(req, ENOMEM);
+		return;
+	}
+
+	ctdb_req_control_get_recmode(&request);
+	subreq = ctdb_client_control_send(state, state->ev, state->client,
+					  state->client->pnn,
+					  tevent_timeval_zero(), &request);
+	if (tevent_req_nomem(subreq, req)) {
+		return;
+	}
+	tevent_req_set_callback(subreq, ctdb_recovery_wait_recmode, req);
+}
+
 bool ctdb_recovery_wait_recv(struct tevent_req *req, int *perr)
 {
 	int err;
@@ -336,3 +394,28 @@ bool ctdb_recovery_wait_recv(struct tevent_req *req, int *perr)
 
 	return true;
 }
+
+bool ctdb_recovery_wait(struct tevent_context *ev,
+			struct ctdb_client_context *client)
+{
+	TALLOC_CTX *mem_ctx;
+	struct tevent_req *req;
+	bool status;
+
+	mem_ctx = talloc_new(client);
+	if (mem_ctx == NULL) {
+		return false;
+	}
+
+	req = ctdb_recovery_wait_send(mem_ctx, ev, client);
+	if (req == NULL) {
+		return false;
+	}
+
+	tevent_req_poll(req, ev);
+
+	status = ctdb_recovery_wait_recv(req, NULL);
+
+	talloc_free(mem_ctx);
+	return status;
+}
diff --git a/ctdb/client/client_db.c b/ctdb/client/client_db.c
index 287efd6..d95e89e 100644
--- a/ctdb/client/client_db.c
+++ b/ctdb/client/client_db.c
@@ -515,19 +515,26 @@ bool ctdb_attach_recv(struct tevent_req *req, int *perr,
 	return true;
 }
 
-int ctdb_attach(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
+int ctdb_attach(struct tevent_context *ev,
 		struct ctdb_client_context *client,
 		struct timeval timeout,
 		const char *db_name, uint8_t db_flags,
 		struct ctdb_db_context **out)
 {
+	TALLOC_CTX *mem_ctx;
 	struct tevent_req *req;
 	bool status;
 	int ret;
 
+	mem_ctx = talloc_new(client);
+	if (mem_ctx == NULL) {
+		return ENOMEM;
+	}
+
 	req = ctdb_attach_send(mem_ctx, ev, client, timeout,
 			       db_name, db_flags);
 	if (req == NULL) {
+		talloc_free(mem_ctx);
 		return ENOMEM;
 	}
 
@@ -535,6 +542,7 @@ int ctdb_attach(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
 
 	status = ctdb_attach_recv(req, &ret, out);
 	if (! status) {
+		talloc_free(mem_ctx);
 		return ret;
 	}
 
@@ -544,6 +552,7 @@ int ctdb_attach(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
 	ctdb_set_call(db, CTDB_FETCH_WITH_HEADER_FUNC, ctdb_fetch_with_header_func);
 	*/
 
+	talloc_free(mem_ctx);
 	return 0;
 }
 
@@ -860,6 +869,7 @@ static void ctdb_fetch_lock_migrate(struct tevent_req *req)
 	request.db_id = state->h->db->db_id;
 	request.callid = CTDB_NULL_FUNC;
 	request.key = state->h->key;
+	request.calldata = tdb_null;
 
 	subreq = ctdb_client_call_send(state, state->ev, state->client,
 				       &request);
@@ -895,7 +905,9 @@ static void ctdb_fetch_lock_migrate_done(struct tevent_req *subreq)
 
 	ret = ctdb_fetch_lock_check(req);
 	if (ret != 0) {
-		tevent_req_error(req, ret);
+		if (ret != EAGAIN) {
+			tevent_req_error(req, ret);
+		}
 		return;
 	}
 
@@ -1942,8 +1954,10 @@ struct ctdb_transaction_commit_state {
 	uint64_t seqnum;
 };
 
-static void ctdb_transaction_commit_done(struct tevent_req *subreq);
+static void ctdb_transaction_commit_seqnum_done(struct tevent_req *subreq);
 static void ctdb_transaction_commit_try(struct tevent_req *subreq);
+static void ctdb_transaction_commit_done(struct tevent_req *subreq);
+static void ctdb_transaction_commit_seqnum2_done(struct tevent_req *subreq);
 
 struct tevent_req *ctdb_transaction_commit_send(
 					TALLOC_CTX *mem_ctx,
@@ -1952,7 +1966,7 @@ struct tevent_req *ctdb_transaction_commit_send(
 {
 	struct tevent_req *req, *subreq;
 	struct ctdb_transaction_commit_state *state;
-	int ret;
+	struct ctdb_req_control request;
 
 	req = tevent_req_create(mem_ctx, &state,
 				struct ctdb_transaction_commit_state);
@@ -1963,27 +1977,53 @@ struct tevent_req *ctdb_transaction_commit_send(
 	state->ev = ev;
 	state->h = h;
 
-	ret = ctdb_ctrl_get_db_seqnum(state, ev, h->client,
-				      h->client->pnn, tevent_timeval_zero(),
-				      h->db->db_id, &state->seqnum);
+	ctdb_req_control_get_db_seqnum(&request, h->db->db_id);
+	subreq = ctdb_client_control_send(state, ev, h->client,
+					  h->client->pnn,
+					  tevent_timeval_zero(), &request);
+	if (tevent_req_nomem(subreq, req)) {
+		return tevent_req_post(req, ev);
+	}
+	tevent_req_set_callback(subreq, ctdb_transaction_commit_seqnum_done,
+				req);
+
+	return req;
+}
+
+static void ctdb_transaction_commit_seqnum_done(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct ctdb_transaction_commit_state *state = tevent_req_data(
+		req, struct ctdb_transaction_commit_state);
+	struct ctdb_reply_control *reply;
+	int ret;
+	bool status;
+
+	status = ctdb_client_control_recv(subreq, &ret, state, &reply);
+	TALLOC_FREE(subreq);
+	if (! status) {
+		tevent_req_error(req, ret);
+		return;
+	}
+
+	ret = ctdb_reply_control_get_db_seqnum(reply, &state->seqnum);
 	if (ret != 0) {
 		tevent_req_error(req, ret);
-		return tevent_req_post(req, ev);
+		return;
 	}
 
-	ret = ctdb_transaction_store_db_seqnum(h, state->seqnum+1);
+	ret = ctdb_transaction_store_db_seqnum(state->h, state->seqnum+1);
 	if (ret != 0) {
 		tevent_req_error(req, ret);
-		return tevent_req_post(req, ev);
+		return;
 	}
 
-	subreq = ctdb_recovery_wait_send(state, ev, h->client);
+	subreq = ctdb_recovery_wait_send(state, state->ev, state->h->client);
 	if (tevent_req_nomem(subreq, req)) {
-		return tevent_req_post(req, ev);
+		return;
 	}
 	tevent_req_set_callback(subreq, ctdb_transaction_commit_try, req);
-
-	return req;
 }
 
 static void ctdb_transaction_commit_try(struct tevent_req *subreq)
@@ -2020,7 +2060,7 @@ static void ctdb_transaction_commit_done(struct tevent_req *subreq)
 	struct ctdb_transaction_commit_state *state = tevent_req_data(
 		req, struct ctdb_transaction_commit_state);
 	struct ctdb_reply_control *reply;
-	uint64_t seqnum;
+	struct ctdb_req_control request;
 	int ret;
 	bool status;
 
@@ -2044,10 +2084,36 @@ static void ctdb_transaction_commit_done(struct tevent_req *subreq)
 		return;
 	}
 
-	ret = ctdb_ctrl_get_db_seqnum(state, state->ev, state->h->client,
-				      state->h->client->pnn,
-				      tevent_timeval_zero(),
-				      state->h->db->db_id, &seqnum);
+	ctdb_req_control_get_db_seqnum(&request, state->h->db->db_id);
+	subreq = ctdb_client_control_send(state, state->ev, state->h->client,
+					  state->h->client->pnn,
+					  tevent_timeval_zero(), &request);
+	if (tevent_req_nomem(subreq, req)) {
+		return;
+	}
+	tevent_req_set_callback(subreq, ctdb_transaction_commit_seqnum2_done,
+				req);
+}
+
+static void ctdb_transaction_commit_seqnum2_done(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct ctdb_transaction_commit_state *state = tevent_req_data(
+		req, struct ctdb_transaction_commit_state);
+	struct ctdb_reply_control *reply;
+	uint64_t seqnum;
+	int ret;
+	bool status;
+
+	status = ctdb_client_control_recv(subreq, &ret, state, &reply);
+	TALLOC_FREE(subreq);
+	if (! status) {
+		tevent_req_error(req, ret);
+		return;
+	}
+
+	ret = ctdb_reply_control_get_db_seqnum(reply, &seqnum);
 	if (ret != 0) {
 		tevent_req_error(req, ret);
 		return;
@@ -2074,19 +2140,15 @@ static void ctdb_transaction_commit_done(struct tevent_req *subreq)
 
 bool ctdb_transaction_commit_recv(struct tevent_req *req, int *perr)
 {
-	struct ctdb_transaction_commit_state *state = tevent_req_data(
-		req, struct ctdb_transaction_commit_state);
 	int err;
 
 	if (tevent_req_is_unix_error(req, &err)) {
 		if (perr != NULL) {
 			*perr = err;
 		}
-		TALLOC_FREE(state->h);
 		return false;
 	}
 
-	TALLOC_FREE(state->h);
 	return true;
 }
 
diff --git a/ctdb/client/client_message.c b/ctdb/client/client_message.c
index bfa9ba2..d533842 100644
--- a/ctdb/client/client_message.c
+++ b/ctdb/client/client_message.c
@@ -192,16 +192,201 @@ int ctdb_client_message(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
 	return 0;
 }
 
-int ctdb_client_set_message_handler(TALLOC_CTX *mem_ctx,
-				    struct tevent_context *ev,
+struct ctdb_client_set_message_handler_state {
+	struct ctdb_client_context *client;
+	uint64_t srvid;
+	srvid_handler_fn handler;
+	void *private_data;
+};
+
+static void ctdb_client_set_message_handler_done(struct tevent_req *subreq);
+
+struct tevent_req *ctdb_client_set_message_handler_send(


-- 
Samba Shared Repository



More information about the samba-cvs mailing list