[SCM] CTDB repository - branch 1.2-nodeflags updated - ctdb-1.0.114-375-g7c988b9
Ronnie Sahlberg
sahlberg at samba.org
Mon Oct 11 10:02:59 MDT 2010
The branch, 1.2-nodeflags has been updated
via 7c988b9145e9ba885152380881e8bde0f212633b (commit)
via dad98d96da5e6cff54a1cc04413e5229ca588533 (commit)
via 41f4b989e7ff84043d1b5527694eb8760d741bcc (commit)
from d300c635f78440665cd0a13b53e9420d154d784c (commit)
http://gitweb.samba.org/?p=sahlberg/ctdb.git;a=shortlog;h=1.2-nodeflags
- Log -----------------------------------------------------------------
commit 7c988b9145e9ba885152380881e8bde0f212633b
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Oct 12 02:49:11 2010 +1100
move extracting the config from config.tdb for public addresses
into its own function
commit dad98d96da5e6cff54a1cc04413e5229ca588533
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Mon Oct 11 15:11:18 2010 +1100
Update latency countes to show min/max and average
commit 41f4b989e7ff84043d1b5527694eb8760d741bcc
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Mon Oct 11 07:09:18 2010 +1100
Update the default hash size to be 100001 instead of 10000
This can sometimes improve performance for environments where very many
files are touched in rapid succession
-----------------------------------------------------------------------
Summary of changes:
config/events.d/00.ctdb | 34 ++++++++++++---------
include/ctdb_private.h | 39 +++++++++++++++++++-----
include/ctdb_protocol.h | 17 +++++++---
server/ctdb_daemon.c | 10 +++---
server/ctdb_lockwait.c | 2 +-
server/ctdb_persistent.c | 2 +-
server/ctdb_tunables.c | 2 +-
tools/ctdb.c | 74 ++++++++++++++++++++++++++++++++++------------
8 files changed, 125 insertions(+), 55 deletions(-)
Changeset truncated at 500 lines:
diff --git a/config/events.d/00.ctdb b/config/events.d/00.ctdb
index 8ff6488..1389ae4 100755
--- a/config/events.d/00.ctdb
+++ b/config/events.d/00.ctdb
@@ -12,6 +12,24 @@
. $CTDB_BASE/functions
loadconfig
+update_config_from_tdb() {
+ # Pull optional ctdb configuration data out of config.tdb
+ PUBLICADDRESSESKEY='public-addresses:node#'`ctdb -t 1 xpnn|sed -e "s/.*://"`
+ rm -f $CTDB_VARDIR/state/public_addresses
+ ctdb pfetch config.tdb $PUBLICADDRESSESKEY $CTDB_VARDIR/state/public_addresses
+ [ "$?" = "0" ] && [ `stat --format="%s" /etc/ctdb/state/public_addresses` != "0" ] && [ ! -z "$CTDB_PUBLIC_ADDRESSES" ] && {
+ diff $CTDB_VARDIR/state/public_addresses $CTDB_PUBLIC_ADDRESSES >/dev/null 2>/dev/null
+ [ $? = "0" ] || {
+ echo CTDB public address configuration had been updated.
+ echo Extracting new configuration from database.
+ diff $CTDB_VARDIR/state/public_addresses $CTDB_PUBLIC_ADDRESSES
+ cp $CTDB_VARDIR/state/public_addresses $CTDB_PUBLIC_ADDRESSES
+ echo Restarting CTDB
+ service ctdb restart &
+ }
+ }
+}
+
case "$1" in
init)
# make sure we have a blank state directory for the scripts to work with
@@ -35,21 +53,7 @@ case "$1" in
;;
startup)
- # Pull optional ctdb configuration data out of config.tdb
- PUBLICADDRESSESKEY='public-addresses:node#'`ctdb -t 1 xpnn|sed -e "s/.*://"`
- rm -f $CTDB_VARDIR/state/public_addresses
- ctdb pfetch config.tdb $PUBLICADDRESSESKEY $CTDB_VARDIR/state/public_addresses
- [ "$?" = "0" ] && [ `stat --format="%s" /etc/ctdb/state/public_addresses` != "0" ] && [ ! -z "$CTDB_PUBLIC_ADDRESSES" ] && {
- diff $CTDB_VARDIR/state/public_addresses $CTDB_PUBLIC_ADDRESSES >/dev/null 2>/dev/null
- [ $? = "0" ] || {
- echo CTDB public address configuration had been updated.
- echo Extracting new configuration from database.
- diff $CTDB_VARDIR/state/public_addresses $CTDB_PUBLIC_ADDRESSES
- cp $CTDB_VARDIR/state/public_addresses $CTDB_PUBLIC_ADDRESSES
- echo Restarting CTDB
- service ctdb restart &
- }
- }
+ update_config_from_tdb &
;;
monitor)
# We should never enter swap, so SwapTotal == SwapFree.
diff --git a/include/ctdb_private.h b/include/ctdb_private.h
index 6022188..0966d33 100644
--- a/include/ctdb_private.h
+++ b/include/ctdb_private.h
@@ -304,10 +304,21 @@ struct ctdb_daemon_data {
#define CTDB_UPDATE_RECLOCK_LATENCY(ctdb, name, counter, value) \
{ \
- if (value > ctdb->statistics.counter) \
- ctdb->statistics.counter = value; \
- if (value > ctdb->statistics_current.counter) \
- ctdb->statistics_current.counter = value; \
+ if (value > ctdb->statistics.counter.max) \
+ ctdb->statistics.counter.max = value; \
+ if (value > ctdb->statistics_current.counter.max) \
+ ctdb->statistics_current.counter.max = value; \
+ \
+ if (ctdb->statistics.counter.num == 0 || value < ctdb->statistics.counter.min) \
+ ctdb->statistics.counter.min = value; \
+ if (ctdb->statistics_current.counter.num == 0 || value < ctdb->statistics_current.counter.min) \
+ ctdb->statistics_current.counter.min = value; \
+ \
+ ctdb->statistics.counter.total += value; \
+ ctdb->statistics_current.counter.total += value; \
+ \
+ ctdb->statistics.counter.num++; \
+ ctdb->statistics_current.counter.num++; \
\
if (ctdb->tunable.reclock_latency_ms != 0) { \
if (value*1000 > ctdb->tunable.reclock_latency_ms) { \
@@ -320,10 +331,22 @@ struct ctdb_daemon_data {
#define CTDB_UPDATE_LATENCY(ctdb, db, operation, counter, t) \
{ \
double l = timeval_elapsed(&t); \
- if (l > ctdb->statistics.counter) \
- ctdb->statistics.counter = l; \
- if (l > ctdb->statistics_current.counter) \
- ctdb->statistics_current.counter = l; \
+ \
+ if (l > ctdb->statistics.counter.max) \
+ ctdb->statistics.counter.max = l; \
+ if (l > ctdb->statistics_current.counter.max) \
+ ctdb->statistics_current.counter.max = l; \
+ \
+ if (ctdb->statistics.counter.num == 0 || l < ctdb->statistics.counter.min) \
+ ctdb->statistics.counter.min = l; \
+ if (ctdb->statistics_current.counter.num == 0 || l < ctdb->statistics_current.counter.min) \
+ ctdb->statistics_current.counter.min = l; \
+ \
+ ctdb->statistics.counter.total += l; \
+ ctdb->statistics_current.counter.total += l; \
+ \
+ ctdb->statistics.counter.num++; \
+ ctdb->statistics_current.counter.num++; \
\
if (ctdb->tunable.log_latency_ms !=0) { \
if (l*1000 > ctdb->tunable.log_latency_ms) { \
diff --git a/include/ctdb_protocol.h b/include/ctdb_protocol.h
index 7048ac1..475806c 100644
--- a/include/ctdb_protocol.h
+++ b/include/ctdb_protocol.h
@@ -528,6 +528,13 @@ struct ctdb_all_public_ips {
};
+struct latency_counter {
+ int num;
+ double min;
+ double max;
+ double total;
+};
+
/*
ctdb statistics information
*/
@@ -562,8 +569,8 @@ struct ctdb_statistics {
uint32_t traverse;
} timeouts;
struct {
- double ctdbd;
- double recd;
+ struct latency_counter ctdbd;
+ struct latency_counter recd;
} reclock;
uint32_t total_calls;
uint32_t pending_calls;
@@ -574,9 +581,9 @@ struct ctdb_statistics {
uint32_t memory_used;
uint32_t __last_counter; /* hack for control_statistics_all */
uint32_t max_hop_count;
- double max_call_latency;
- double max_lockwait_latency;
- double max_childwrite_latency;
+ struct latency_counter call_latency;
+ struct latency_counter lockwait_latency;
+ struct latency_counter childwrite_latency;
uint32_t num_recoveries;
struct timeval statistics_start_time;
struct timeval statistics_current_time;
diff --git a/server/ctdb_daemon.c b/server/ctdb_daemon.c
index 16ccaac..12ad954 100644
--- a/server/ctdb_daemon.c
+++ b/server/ctdb_daemon.c
@@ -258,7 +258,7 @@ static void daemon_call_from_client_callback(struct ctdb_call_state *state)
DEBUG(DEBUG_ERR, (__location__ " ctdbd_call_recv() returned error\n"));
CTDB_DECREMENT_STAT(client->ctdb, pending_calls);
- CTDB_UPDATE_LATENCY(client->ctdb, ctdb_db, "call_from_client_cb 1", max_call_latency, dstate->start_time);
+ CTDB_UPDATE_LATENCY(client->ctdb, ctdb_db, "call_from_client_cb 1", call_latency, dstate->start_time);
return;
}
@@ -268,7 +268,7 @@ static void daemon_call_from_client_callback(struct ctdb_call_state *state)
if (r == NULL) {
DEBUG(DEBUG_ERR, (__location__ " Failed to allocate reply_call in ctdb daemon\n"));
CTDB_DECREMENT_STAT(client->ctdb, pending_calls);
- CTDB_UPDATE_LATENCY(client->ctdb, ctdb_db, "call_from_client_cb 2", max_call_latency, dstate->start_time);
+ CTDB_UPDATE_LATENCY(client->ctdb, ctdb_db, "call_from_client_cb 2", call_latency, dstate->start_time);
return;
}
r->hdr.reqid = dstate->reqid;
@@ -283,7 +283,7 @@ static void daemon_call_from_client_callback(struct ctdb_call_state *state)
if (res != 0) {
DEBUG(DEBUG_ERR, (__location__ " Failed to queue packet from daemon to client\n"));
}
- CTDB_UPDATE_LATENCY(client->ctdb, ctdb_db, "call_from_client_cb 3", max_call_latency, dstate->start_time);
+ CTDB_UPDATE_LATENCY(client->ctdb, ctdb_db, "call_from_client_cb 3", call_latency, dstate->start_time);
CTDB_DECREMENT_STAT(client->ctdb, pending_calls);
talloc_free(dstate);
}
@@ -409,7 +409,7 @@ static void daemon_request_call_from_client(struct ctdb_client *client,
DEBUG(DEBUG_ERR,(__location__ " Unable to allocate call\n"));
CTDB_DECREMENT_STAT(ctdb, pending_calls);
- CTDB_UPDATE_LATENCY(ctdb, ctdb_db, "call_from_client 1", max_call_latency, dstate->start_time);
+ CTDB_UPDATE_LATENCY(ctdb, ctdb_db, "call_from_client 1", call_latency, dstate->start_time);
return;
}
@@ -433,7 +433,7 @@ static void daemon_request_call_from_client(struct ctdb_client *client,
if (state == NULL) {
DEBUG(DEBUG_ERR,(__location__ " Unable to setup call send\n"));
CTDB_DECREMENT_STAT(ctdb, pending_calls);
- CTDB_UPDATE_LATENCY(ctdb, ctdb_db, "call_from_client 2", max_call_latency, dstate->start_time);
+ CTDB_UPDATE_LATENCY(ctdb, ctdb_db, "call_from_client 2", call_latency, dstate->start_time);
return;
}
talloc_steal(state, dstate);
diff --git a/server/ctdb_lockwait.c b/server/ctdb_lockwait.c
index 9bbc25f..48198fd 100644
--- a/server/ctdb_lockwait.c
+++ b/server/ctdb_lockwait.c
@@ -53,7 +53,7 @@ static void lockwait_handler(struct event_context *ev, struct fd_event *fde,
key.dptr = talloc_memdup(tmp_ctx, key.dptr, key.dsize);
talloc_set_destructor(h, NULL);
- CTDB_UPDATE_LATENCY(h->ctdb, h->ctdb_db, "lockwait", max_lockwait_latency, h->start_time);
+ CTDB_UPDATE_LATENCY(h->ctdb, h->ctdb_db, "lockwait", lockwait_latency, h->start_time);
CTDB_DECREMENT_STAT(h->ctdb, pending_lockwait_calls);
/* the handle needs to go away when the context is gone - when
diff --git a/server/ctdb_persistent.c b/server/ctdb_persistent.c
index 8672c5b..9346f7d 100644
--- a/server/ctdb_persistent.c
+++ b/server/ctdb_persistent.c
@@ -475,7 +475,7 @@ static void childwrite_handler(struct event_context *ev, struct fd_event *fde,
int ret;
char c;
- CTDB_UPDATE_LATENCY(h->ctdb, h->ctdb_db, "persistent", max_childwrite_latency, h->start_time);
+ CTDB_UPDATE_LATENCY(h->ctdb, h->ctdb_db, "persistent", childwrite_latency, h->start_time);
CTDB_DECREMENT_STAT(h->ctdb, pending_childwrite_calls);
/* the handle needs to go away when the context is gone - when
diff --git a/server/ctdb_tunables.c b/server/ctdb_tunables.c
index 02e76ae..4a3cfbb 100644
--- a/server/ctdb_tunables.c
+++ b/server/ctdb_tunables.c
@@ -42,7 +42,7 @@ static const struct {
{ "EventScriptUnhealthyOnTimeout", 0, offsetof(struct ctdb_tunable, script_unhealthy_on_timeout) },/* OBSOLETE */
{ "RecoveryGracePeriod", 120, offsetof(struct ctdb_tunable, recovery_grace_period) },
{ "RecoveryBanPeriod", 300, offsetof(struct ctdb_tunable, recovery_ban_period) },
- { "DatabaseHashSize", 10000, offsetof(struct ctdb_tunable, database_hash_size) },
+ { "DatabaseHashSize", 100001, offsetof(struct ctdb_tunable, database_hash_size) },
{ "DatabaseMaxDead", 5, offsetof(struct ctdb_tunable, database_max_dead) },
{ "RerecoveryTimeout", 10, offsetof(struct ctdb_tunable, rerecovery_timeout) },
{ "EnableBans", 1, offsetof(struct ctdb_tunable, enable_bans) },
diff --git a/tools/ctdb.c b/tools/ctdb.c
index ad1c0a2..072e8e5 100644
--- a/tools/ctdb.c
+++ b/tools/ctdb.c
@@ -219,11 +219,29 @@ static void show_statistics(struct ctdb_statistics *s, int show_header)
for (i=0;i<ARRAY_SIZE(fields);i++) {
printf("%s:", fields[i].name);
}
- printf("max_reclock_ctdbd:");
- printf("max_reclock_recd:");
+ printf("num_reclock_ctdbd_latency:");
+ printf("min_reclock_ctdbd_latency:");
+ printf("avg_reclock_ctdbd_latency:");
+ printf("max_reclock_ctdbd_latency:");
+
+ printf("num_reclock_recd_latency:");
+ printf("min_reclock_recd_latency:");
+ printf("avg_reclock_recd_latency:");
+ printf("max_reclock_recd_latency:");
+
+ printf("num_call_latency:");
+ printf("min_call_latency:");
+ printf("avg_call_latency:");
printf("max_call_latency:");
+
+ printf("num_lockwait_latency:");
+ printf("min_lockwait_latency:");
+ printf("avg_lockwait_latency:");
printf("max_lockwait_latency:");
- printf("max_childwrite_latency:");
+
+ printf("num_childwrite_latency:");
+ printf("min_childwrite_latency:");
+ printf("avg_childwrite_latency:");
printf("max_childwrite_latency:");
printf("\n");
}
@@ -233,12 +251,30 @@ static void show_statistics(struct ctdb_statistics *s, int show_header)
for (i=0;i<ARRAY_SIZE(fields);i++) {
printf("%d:", *(uint32_t *)(fields[i].offset+(uint8_t *)s));
}
- printf("%.6f:", s->reclock.ctdbd);
- printf("%.6f:", s->reclock.recd);
- printf("%.6f:", s->max_call_latency);
- printf("%.6f:", s->max_lockwait_latency);
- printf("%.6f:", s->max_childwrite_latency);
- printf("%.6f:", s->max_childwrite_latency);
+ printf("%d:", s->reclock.ctdbd.num);
+ printf("%.6f:", s->reclock.ctdbd.min);
+ printf("%.6f:", s->reclock.ctdbd.num?s->reclock.ctdbd.total/s->reclock.ctdbd.num:0.0);
+ printf("%.6f:", s->reclock.ctdbd.max);
+
+ printf("%d:", s->reclock.recd.num);
+ printf("%.6f:", s->reclock.recd.min);
+ printf("%.6f:", s->reclock.recd.num?s->reclock.recd.total/s->reclock.recd.num:0.0);
+ printf("%.6f:", s->reclock.recd.max);
+
+ printf("%d:", s->call_latency.num);
+ printf("%.6f:", s->call_latency.min);
+ printf("%.6f:", s->call_latency.num?s->call_latency.total/s->call_latency.num:0.0);
+ printf("%.6f:", s->call_latency.max);
+
+ printf("%d:", s->lockwait_latency.num);
+ printf("%.6f:", s->lockwait_latency.min);
+ printf("%.6f:", s->lockwait_latency.num?s->lockwait_latency.total/s->lockwait_latency.num:0.0);
+ printf("%.6f:", s->lockwait_latency.max);
+
+ printf("%d:", s->childwrite_latency.num);
+ printf("%.6f:", s->childwrite_latency.min);
+ printf("%.6f:", s->childwrite_latency.num?s->childwrite_latency.total/s->childwrite_latency.num:0.0);
+ printf("%.6f:", s->childwrite_latency.max);
printf("\n");
} else {
printf("CTDB version %u\n", CTDB_VERSION);
@@ -261,13 +297,13 @@ static void show_statistics(struct ctdb_statistics *s, int show_header)
preflen?0:4, "",
*(uint32_t *)(fields[i].offset+(uint8_t *)s));
}
- printf(" %-30s %.6f sec\n", "max_reclock_ctdbd", s->reclock.ctdbd);
- printf(" %-30s %.6f sec\n", "max_reclock_recd", s->reclock.recd);
+ printf(" %-30s %.6f/%.6f/%.6f sec out of %d\n", "reclock_ctdbd MIN/AVG/MAX", s->reclock.ctdbd.min, s->reclock.ctdbd.num?s->reclock.ctdbd.total/s->reclock.ctdbd.num:0.0, s->reclock.ctdbd.max, s->reclock.ctdbd.num);
+
+ printf(" %-30s %.6f/%.6f/%.6f sec out of %d\n", "reclock_recd MIN/AVG/MAX", s->reclock.recd.min, s->reclock.recd.num?s->reclock.recd.total/s->reclock.recd.num:0.0, s->reclock.recd.max, s->reclock.recd.num);
- printf(" %-30s %.6f sec\n", "max_call_latency", s->max_call_latency);
- printf(" %-30s %.6f sec\n", "max_lockwait_latency", s->max_lockwait_latency);
- printf(" %-30s %.6f sec\n", "max_childwrite_latency", s->max_childwrite_latency);
- printf(" %-30s %.6f sec\n", "max_childwrite_latency", s->max_childwrite_latency);
+ printf(" %-30s %.6f/%.6f/%.6f sec out of %d\n", "call_latency MIN/AVG/MAX", s->call_latency.min, s->call_latency.num?s->call_latency.total/s->call_latency.num:0.0, s->call_latency.max, s->call_latency.num);
+ printf(" %-30s %.6f/%.6f/%.6f sec out of %d\n", "lockwait_latency MIN/AVG/MAX", s->lockwait_latency.min, s->lockwait_latency.num?s->lockwait_latency.total/s->lockwait_latency.num:0.0, s->lockwait_latency.max, s->lockwait_latency.num);
+ printf(" %-30s %.6f/%.6f/%.6f sec out of %d\n", "childwrite_latency MIN/AVG/MAX", s->childwrite_latency.min, s->childwrite_latency.num?s->childwrite_latency.total/s->childwrite_latency.num:0.0, s->childwrite_latency.max, s->childwrite_latency.num);
}
talloc_free(tmp_ctx);
@@ -305,10 +341,10 @@ static int control_statistics_all(struct ctdb_context *ctdb)
}
statistics.max_hop_count =
MAX(statistics.max_hop_count, s1.max_hop_count);
- statistics.max_call_latency =
- MAX(statistics.max_call_latency, s1.max_call_latency);
- statistics.max_lockwait_latency =
- MAX(statistics.max_lockwait_latency, s1.max_lockwait_latency);
+ statistics.call_latency.max =
+ MAX(statistics.call_latency.max, s1.call_latency.max);
+ statistics.lockwait_latency.max =
+ MAX(statistics.lockwait_latency.max, s1.lockwait_latency.max);
}
talloc_free(nodes);
printf("Gathered statistics for %u nodes\n", num_nodes);
--
CTDB repository
More information about the samba-cvs
mailing list