The branch, master has been updated via 7b7aa7b599536cd60ebb84d363607bb4e953248a (commit) via 1c9025fdd08d1cea342af7487d0123015e08831b (commit) via f0853013655ac3bedf1b793de128fb679c6db6c6 (commit) via a610bc351f0754c84c78c27d02f9a695e60c5b0f (commit) via 60cb40d090e45ff6134c098a238fac7ad854f134 (commit) from e9ef93f7b6dad59eabaa32124df81f3e74c651ef (commit)
http://gitweb.samba.org/?p=ctdb.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 7b7aa7b599536cd60ebb84d363607bb4e953248a Author: Amitay Isaacs <ami...@gmail.com> Date: Wed Aug 14 11:44:12 2013 +1000 recoverd: Improve log message when nodes disagree on recmaster Signed-off-by: Amitay Isaacs <ami...@gmail.com> commit 1c9025fdd08d1cea342af7487d0123015e08831b Author: Amitay Isaacs <ami...@gmail.com> Date: Fri Aug 2 11:05:08 2013 +1000 common: Null terminate process name string so valgrind doesn't complain Signed-off-by: Amitay Isaacs <ami...@gmail.com> commit f0853013655ac3bedf1b793de128fb679c6db6c6 Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Aug 12 15:50:30 2013 +1000 vacuuming: Fix vacuuming bug where requests keep bouncing between nodes (part 2) This is caused by corruption of a record header such that the records on two nodes point to each other as dmaster. This makes a request for that record bounce between nodes endlessly. Signed-off-by: Amitay Isaacs <ami...@gmail.com> commit a610bc351f0754c84c78c27d02f9a695e60c5b0f Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Aug 12 15:51:00 2013 +1000 vacuuming: Fix vacuuming bug where requests keep bouncing between nodes (part 1) This is caused by corruption of a record header such that the records on two nodes point to each other as dmaster. This makes a request for that record bounce between nodes endlessly. Signed-off-by: Amitay Isaacs <ami...@gmail.com> commit 60cb40d090e45ff6134c098a238fac7ad854f134 Author: Amitay Isaacs <ami...@gmail.com> Date: Tue Aug 6 14:37:13 2013 +1000 db_wrap: Make sure tdb messages are logged correctly Signed-off-by: Amitay Isaacs <ami...@gmail.com> ----------------------------------------------------------------------- Summary of changes: common/system_linux.c | 1 + lib/util/db_wrap.c | 1 + server/ctdb_recover.c | 42 +++++++++++++++++++++--------------------- server/ctdb_recoverd.c | 2 +- 4 files changed, 24 insertions(+), 22 deletions(-) Changeset truncated at 500 lines: diff --git a/common/system_linux.c b/common/system_linux.c index ab232f0..84daba4 100644 --- a/common/system_linux.c +++ b/common/system_linux.c @@ -606,6 +606,7 @@ int ctdb_set_process_name(const char *name) char procname[16]; strncpy(procname, name, 15); + procname[15] = '\0'; return prctl(PR_SET_NAME, (unsigned long)procname, 0, 0, 0); } diff --git a/lib/util/db_wrap.c b/lib/util/db_wrap.c index 07b066c..1b2bf7e 100644 --- a/lib/util/db_wrap.c +++ b/lib/util/db_wrap.c @@ -47,6 +47,7 @@ static void log_fn(struct tdb_context *tdb, enum tdb_debug_level level, const ch { if (level <= TDB_DEBUG_ERROR) { va_list ap; + this_log_level = level; char newfmt[strlen(tdb_name(tdb)) + 1 + strlen(fmt) + 1]; sprintf(newfmt, "%s:%s", tdb_name(tdb), fmt); va_start(ap, fmt); diff --git a/server/ctdb_recover.c b/server/ctdb_recover.c index 0bec03e..1cbcc59 100644 --- a/server/ctdb_recover.c +++ b/server/ctdb_recover.c @@ -785,7 +785,7 @@ bool ctdb_recovery_lock(struct ctdb_context *ctdb, bool keep) */ static int delete_tdb_record(struct ctdb_context *ctdb, struct ctdb_db_context *ctdb_db, struct ctdb_rec_data *rec) { - TDB_DATA key, data; + TDB_DATA key, data, data2; struct ctdb_ltdb_header *hdr, *hdr2; /* these are really internal tdb functions - but we need them here for @@ -816,13 +816,13 @@ static int delete_tdb_record(struct ctdb_context *ctdb, struct ctdb_db_context * return -1; } - data = tdb_fetch(ctdb_db->ltdb->tdb, key); - if (data.dptr == NULL) { + data2 = tdb_fetch(ctdb_db->ltdb->tdb, key); + if (data2.dptr == NULL) { tdb_chainunlock(ctdb_db->ltdb->tdb, key); return 0; } - if (data.dsize < sizeof(struct ctdb_ltdb_header)) { + if (data2.dsize < sizeof(struct ctdb_ltdb_header)) { if (tdb_lock_nonblock(ctdb_db->ltdb->tdb, -1, F_WRLCK) == 0) { if (tdb_delete(ctdb_db->ltdb->tdb, key) != 0) { DEBUG(DEBUG_CRIT,(__location__ " Failed to delete corrupt record\n")); @@ -831,59 +831,59 @@ static int delete_tdb_record(struct ctdb_context *ctdb, struct ctdb_db_context * DEBUG(DEBUG_CRIT,(__location__ " Deleted corrupt record\n")); } tdb_chainunlock(ctdb_db->ltdb->tdb, key); - free(data.dptr); + free(data2.dptr); return 0; } - hdr2 = (struct ctdb_ltdb_header *)data.dptr; + hdr2 = (struct ctdb_ltdb_header *)data2.dptr; if (hdr2->rsn > hdr->rsn) { tdb_chainunlock(ctdb_db->ltdb->tdb, key); DEBUG(DEBUG_INFO,(__location__ " Skipping record with rsn=%llu - called with rsn=%llu\n", (unsigned long long)hdr2->rsn, (unsigned long long)hdr->rsn)); - free(data.dptr); - return -1; + free(data2.dptr); + return -1; } /* do not allow deleting record that have readonly flags set. */ if (hdr->flags & CTDB_REC_RO_FLAGS) { tdb_chainunlock(ctdb_db->ltdb->tdb, key); DEBUG(DEBUG_INFO,(__location__ " Skipping record with readonly flags set\n")); - free(data.dptr); - return -1; + free(data2.dptr); + return -1; } if (hdr2->flags & CTDB_REC_RO_FLAGS) { tdb_chainunlock(ctdb_db->ltdb->tdb, key); DEBUG(DEBUG_INFO,(__location__ " Skipping record with readonly flags set\n")); - free(data.dptr); - return -1; + free(data2.dptr); + return -1; } if (hdr2->dmaster == ctdb->pnn) { tdb_chainunlock(ctdb_db->ltdb->tdb, key); DEBUG(DEBUG_INFO,(__location__ " Attempted delete record where we are the dmaster\n")); - free(data.dptr); - return -1; + free(data2.dptr); + return -1; } if (tdb_lock_nonblock(ctdb_db->ltdb->tdb, -1, F_WRLCK) != 0) { tdb_chainunlock(ctdb_db->ltdb->tdb, key); - free(data.dptr); - return -1; + free(data2.dptr); + return -1; } if (tdb_delete(ctdb_db->ltdb->tdb, key) != 0) { tdb_unlock(ctdb_db->ltdb->tdb, -1, F_WRLCK); tdb_chainunlock(ctdb_db->ltdb->tdb, key); DEBUG(DEBUG_INFO,(__location__ " Failed to delete record\n")); - free(data.dptr); - return -1; + free(data2.dptr); + return -1; } tdb_unlock(ctdb_db->ltdb->tdb, -1, F_WRLCK); tdb_chainunlock(ctdb_db->ltdb->tdb, key); - free(data.dptr); - return 0; + free(data2.dptr); + return 0; } @@ -1153,7 +1153,7 @@ static int store_tdb_record(struct ctdb_context *ctdb, goto done; } - hdr2 = (struct ctdb_ltdb_header *)data.dptr; + hdr2 = (struct ctdb_ltdb_header *)data2.dptr; if (hdr2->rsn > hdr->rsn) { DEBUG(DEBUG_INFO, (__location__ " Skipping record with " diff --git a/server/ctdb_recoverd.c b/server/ctdb_recoverd.c index a1513ee..d35a786 100644 --- a/server/ctdb_recoverd.c +++ b/server/ctdb_recoverd.c @@ -2823,7 +2823,7 @@ static void verify_recmaster_callback(struct ctdb_client_control_state *state) status field */ if (state->status != rmdata->pnn) { - DEBUG(DEBUG_ERR,("Node %d does not agree we are the recmaster. Need a new recmaster election\n", state->c->hdr.destnode)); + DEBUG(DEBUG_ERR,("Node %d thinks node %d is recmaster. Need a new recmaster election\n", state->c->hdr.destnode, state->status)); ctdb_set_culprit(rmdata->rec, state->c->hdr.destnode); rmdata->status = MONITOR_ELECTION_NEEDED; } -- CTDB repository