[SCM] CTDB repository - branch 1.13 updated - ctdb-1.43-5-gc8886ad

Ronnie Sahlberg sahlberg at samba.org
Thu May 24 21:26:25 MDT 2012


The branch, 1.13 has been updated
       via  c8886ad41c80c45619d5eb6e2f95d652b171ca1e (commit)
       via  ea073ef2f73343247e653c7c39f2e0f5e34a0c39 (commit)
      from  b8260448c192c3866bffb99b475a4b3de57f38b3 (commit)

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


- Log -----------------------------------------------------------------
commit c8886ad41c80c45619d5eb6e2f95d652b171ca1e
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Fri May 25 12:31:11 2012 +1000

    RECOVERY: Increase the time we allow before timing out recovery related tasks.
    
    If the system is temporarily taking unusually long to perform these tasks it is better to wait a lot longer and allow the tasks to complete than timing out repeatedly and then becomming banned.

commit ea073ef2f73343247e653c7c39f2e0f5e34a0c39
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Fri May 25 12:27:59 2012 +1000

    RECOVER: When we pull databases during recovery, we used to reallocate the databuffer for each entry added. This would normally not be an issue, but for cases where memory is fragmented, this could start to cost significant cpu if we need to reallocate and move to a different region.
    
    Change this to instead preallocate , by default, 10MByte chunks to the data buffer.
    This significantly reduces the number of potential reallocate and move  operations that may be required.
    
    Create a tunable to override/change how much preallocation should be used.

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

Summary of changes:
 include/ctdb_private.h |    1 +
 server/ctdb_recover.c  |    7 ++++++-
 server/ctdb_recoverd.c |    7 ++++++-
 server/ctdb_tunables.c |    5 +++--
 4 files changed, 16 insertions(+), 4 deletions(-)


Changeset truncated at 500 lines:

diff --git a/include/ctdb_private.h b/include/ctdb_private.h
index 0f494b4..7c3fdf0 100644
--- a/include/ctdb_private.h
+++ b/include/ctdb_private.h
@@ -134,6 +134,7 @@ struct ctdb_tunable {
 	uint32_t db_record_count_warn;
 	uint32_t db_record_size_warn;
 	uint32_t db_size_warn;
+	uint32_t pulldb_preallocation_size;
 };
 
 /*
diff --git a/server/ctdb_recover.c b/server/ctdb_recover.c
index 05f72f9..e54312f 100644
--- a/server/ctdb_recover.c
+++ b/server/ctdb_recover.c
@@ -348,6 +348,7 @@ struct pulldb_data {
 	struct ctdb_db_context *ctdb_db;
 	struct ctdb_marshall_buffer *pulldata;
 	uint32_t len;
+	uint32_t allocated_len;
 	bool failed;
 };
 
@@ -364,7 +365,10 @@ static int traverse_pulldb(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data,
 		params->failed = true;
 		return -1;
 	}
-	params->pulldata = talloc_realloc_size(NULL, params->pulldata, rec->length + params->len);
+	if (params->len + rec->length >= params->allocated_len) {
+		params->allocated_len = rec->length + params->len + ctdb->tunable.pulldb_preallocation_size;
+		params->pulldata = talloc_realloc_size(NULL, params->pulldata, params->allocated_len);
+	}
 	if (params->pulldata == NULL) {
 		DEBUG(DEBUG_CRIT,(__location__ " Failed to expand pulldb_data to %u\n", rec->length + params->len));
 		ctdb_fatal(params->ctdb, "failed to allocate memory for recovery. shutting down\n");
@@ -414,6 +418,7 @@ int32_t ctdb_control_pull_db(struct ctdb_context *ctdb, TDB_DATA indata, TDB_DAT
 	params.ctdb_db = ctdb_db;
 	params.pulldata = reply;
 	params.len = offsetof(struct ctdb_marshall_buffer, data);
+	params.allocated_len = params.len;
 	params.failed = false;
 
 	if (ctdb_db->unhealthy_reason) {
diff --git a/server/ctdb_recoverd.c b/server/ctdb_recoverd.c
index f739900..b380746 100644
--- a/server/ctdb_recoverd.c
+++ b/server/ctdb_recoverd.c
@@ -1178,6 +1178,7 @@ struct recdb_data {
 	struct ctdb_context *ctdb;
 	struct ctdb_marshall_buffer *recdata;
 	uint32_t len;
+	uint32_t allocated_len;
 	bool failed;
 	bool persistent;
 };
@@ -1206,7 +1207,10 @@ static int traverse_recdb(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data,
 		params->failed = true;
 		return -1;
 	}
-	params->recdata = talloc_realloc_size(NULL, params->recdata, rec->length + params->len);
+	if (params->len + rec->length >= params->allocated_len) {
+		params->allocated_len = rec->length + params->len + params->ctdb->tunable.pulldb_preallocation_size;
+		params->recdata = talloc_realloc_size(NULL, params->recdata, params->allocated_len);
+	}
 	if (params->recdata == NULL) {
 		DEBUG(DEBUG_CRIT,(__location__ " Failed to expand recdata to %u (%u records)\n", 
 			 rec->length + params->len, params->recdata->count));
@@ -1245,6 +1249,7 @@ static int push_recdb_database(struct ctdb_context *ctdb, uint32_t dbid,
 	params.ctdb = ctdb;
 	params.recdata = recdata;
 	params.len = offsetof(struct ctdb_marshall_buffer, data);
+	params.allocated_len = params.len;
 	params.failed = false;
 	params.persistent = persistent;
 
diff --git a/server/ctdb_tunables.c b/server/ctdb_tunables.c
index 663c387..57dd1f3 100644
--- a/server/ctdb_tunables.c
+++ b/server/ctdb_tunables.c
@@ -31,7 +31,7 @@ static const struct {
 	{ "TraverseTimeout",     20, offsetof(struct ctdb_tunable, traverse_timeout), false },
 	{ "KeepaliveInterval",    5,  offsetof(struct ctdb_tunable, keepalive_interval), false },
 	{ "KeepaliveLimit",       5,  offsetof(struct ctdb_tunable, keepalive_limit), false },
-	{ "RecoverTimeout",      20,  offsetof(struct ctdb_tunable, recover_timeout), false },
+	{ "RecoverTimeout",     120,  offsetof(struct ctdb_tunable, recover_timeout), false },
 	{ "RecoverInterval",      1,  offsetof(struct ctdb_tunable, recover_interval), false },
 	{ "ElectionTimeout",      3,  offsetof(struct ctdb_tunable, election_timeout), false },
 	{ "TakeoverTimeout",      9,  offsetof(struct ctdb_tunable, takeover_timeout), false },
@@ -82,7 +82,8 @@ static const struct {
 	{ "NoIPTakeover",         0,  offsetof(struct ctdb_tunable, no_ip_takeover), false },
 	{ "DBRecordCountWarn",    100000,  offsetof(struct ctdb_tunable, db_record_count_warn), false },
 	{ "DBRecordSizeWarn",   10000000,  offsetof(struct ctdb_tunable, db_record_size_warn), false },
-	{ "DBSizeWarn",        100000000,  offsetof(struct ctdb_tunable, db_size_warn), false }
+	{ "DBSizeWarn",        100000000,  offsetof(struct ctdb_tunable, db_size_warn), false },
+	{ "PullDBPreallocation", 10*1024*10240,  offsetof(struct ctdb_tunable, pulldb_preallocation_size), false }
 };
 
 /*


-- 
CTDB repository


More information about the samba-cvs mailing list