[SCM] CTDB repository - branch master updated -
b3b9707dd8244758ff1080401a9e03e74766e1ab
Andrew Tridgell
tridge at samba.org
Fri Aug 8 03:16:39 GMT 2008
The branch, master has been updated
via b3b9707dd8244758ff1080401a9e03e74766e1ab (commit)
via 7f29c50ccbc7789bfbc20bcb4b65758af9ebe6c5 (commit)
from 7c6b621f7307dc39ffcd7d965ac613642af201b8 (commit)
http://gitweb.samba.org/?p=tridge/ctdb.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit b3b9707dd8244758ff1080401a9e03e74766e1ab
Author: Andrew Tridgell <tridge at samba.org>
Date: Fri Aug 8 13:11:41 2008 +1000
added retry handling in client
commit 7f29c50ccbc7789bfbc20bcb4b65758af9ebe6c5
Author: Andrew Tridgell <tridge at samba.org>
Date: Fri Aug 8 13:11:28 2008 +1000
added a new control CTDB_CONTROL_TRANS2_COMMIT_RETRY so we can tell
the difference between a initial commit attempt and a retry, which
allows us to get the persistent updates counter right for retries
-----------------------------------------------------------------------
Summary of changes:
client/ctdb_client.c | 14 ++++++++++++--
include/ctdb_private.h | 1 +
server/ctdb_control.c | 1 +
server/ctdb_persistent.c | 12 +++++++++---
4 files changed, 23 insertions(+), 5 deletions(-)
Changeset truncated at 500 lines:
diff --git a/client/ctdb_client.c b/client/ctdb_client.c
index c0875b0..0d85374 100644
--- a/client/ctdb_client.c
+++ b/client/ctdb_client.c
@@ -3181,7 +3181,7 @@ failed:
*/
int ctdb_transaction_commit(struct ctdb_transaction_handle *h)
{
- int ret;
+ int ret, retries=0;
int32_t status;
struct ctdb_context *ctdb = h->ctdb_db->ctdb;
struct timeval timeout;
@@ -3215,7 +3215,7 @@ again:
/* tell ctdbd to commit to the other nodes */
timeout = timeval_current_ofs(1, 0);
ret = ctdb_control(ctdb, CTDB_CURRENT_NODE, h->ctdb_db->db_id,
- CTDB_CONTROL_TRANS2_COMMIT, 0,
+ retries==0?CTDB_CONTROL_TRANS2_COMMIT:CTDB_CONTROL_TRANS2_COMMIT_RETRY, 0,
ctdb_marshall_finish(h->m_write), NULL, NULL, &status,
&timeout, NULL);
if (ret != 0 || status != 0) {
@@ -3239,6 +3239,16 @@ again:
}
}
+ if (++retries == 10) {
+ DEBUG(DEBUG_ERR,(__location__ " Giving up transaction on db 0x%08x after %d retries failure_control=%u\n",
+ h->ctdb_db->db_id, retries, (unsigned)failure_control));
+ ctdb_control(ctdb, CTDB_CURRENT_NODE, h->ctdb_db->db_id,
+ failure_control, CTDB_CTRL_FLAG_NOREPLY,
+ tdb_null, NULL, NULL, NULL, NULL, NULL);
+ talloc_free(h);
+ return -1;
+ }
+
if (ctdb_replay_transaction(h) != 0) {
DEBUG(DEBUG_ERR,(__location__ " Failed to replay transaction\n"));
ctdb_control(ctdb, CTDB_CURRENT_NODE, h->ctdb_db->db_id,
diff --git a/include/ctdb_private.h b/include/ctdb_private.h
index 6cc1dc9..f44a940 100644
--- a/include/ctdb_private.h
+++ b/include/ctdb_private.h
@@ -549,6 +549,7 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS = 0,
CTDB_CONTROL_TRANS2_COMMIT = 83,
CTDB_CONTROL_TRANS2_FINISHED = 84,
CTDB_CONTROL_TRANS2_ERROR = 85,
+ CTDB_CONTROL_TRANS2_COMMIT_RETRY = 86,
};
/*
diff --git a/server/ctdb_control.c b/server/ctdb_control.c
index 59b0657..edfe344 100644
--- a/server/ctdb_control.c
+++ b/server/ctdb_control.c
@@ -397,6 +397,7 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
return ctdb_control_cancel_persistent_update(ctdb, c, indata);
case CTDB_CONTROL_TRANS2_COMMIT:
+ case CTDB_CONTROL_TRANS2_COMMIT_RETRY:
return ctdb_control_trans2_commit(ctdb, c, indata, async_reply);
case CTDB_CONTROL_TRANS2_ERROR:
diff --git a/server/ctdb_persistent.c b/server/ctdb_persistent.c
index faa6e83..42b148c 100644
--- a/server/ctdb_persistent.c
+++ b/server/ctdb_persistent.c
@@ -121,12 +121,18 @@ int32_t ctdb_control_trans2_commit(struct ctdb_context *ctdb,
then have it decremented in ctdb_control_trans2_error
or ctdb_control_trans2_finished
*/
- if (c->opcode == CTDB_CONTROL_PERSISTENT_STORE) {
+ switch (c->opcode) {
+ case CTDB_CONTROL_PERSISTENT_STORE:
if (client->num_persistent_updates > 0) {
client->num_persistent_updates--;
- }
- } else {
+ }
+ break;
+ case CTDB_CONTROL_TRANS2_COMMIT:
client->num_persistent_updates++;
+ break;
+ case CTDB_CONTROL_TRANS2_COMMIT_RETRY:
+ /* already updated from the first commit */
+ break;
}
state = talloc_zero(ctdb, struct ctdb_persistent_state);
--
CTDB repository
More information about the samba-cvs
mailing list