[Ocfs2-commits] mfasheh commits r2538 -
branches/ocfs2-1.0/fs/ocfs2/cluster
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Mon Aug 22 13:54:30 CDT 2005
Author: mfasheh
Signed-off-by: manish
Date: 2005-08-22 13:54:28 -0500 (Mon, 22 Aug 2005)
New Revision: 2538
Modified:
branches/ocfs2-1.0/fs/ocfs2/cluster/heartbeat.c
Log:
* Backport r2537 from trunk:
* Have heartbeat sleep only as much as is required based on how long
it spent doing it's work. This should help on busy systems.
Signed-off-by: manish
Modified: branches/ocfs2-1.0/fs/ocfs2/cluster/heartbeat.c
===================================================================
--- branches/ocfs2-1.0/fs/ocfs2/cluster/heartbeat.c 2005-08-19 23:05:25 UTC (rev 2537)
+++ branches/ocfs2-1.0/fs/ocfs2/cluster/heartbeat.c 2005-08-22 18:54:28 UTC (rev 2538)
@@ -849,6 +849,32 @@
}
}
+/* Subtract b from a, storing the result in a. a *must* have a larger
+ * value than b. */
+static void o2hb_tv_subtract(struct timeval *a,
+ struct timeval *b)
+{
+ BUG_ON(a->tv_sec < b->tv_sec);
+ BUG_ON(a->tv_sec == b->tv_sec && a->tv_usec < b->tv_usec);
+
+ a->tv_sec -= b->tv_sec;
+ a->tv_usec -= b->tv_usec;
+ while ( a->tv_usec < 0 ) {
+ a->tv_sec--;
+ a->tv_usec += 1000000;
+ }
+}
+
+static unsigned int o2hb_elapsed_msecs(struct timeval *start,
+ struct timeval *end)
+{
+ struct timeval res = *end;
+
+ o2hb_tv_subtract(&res, start);
+
+ return res.tv_sec * 1000 + res.tv_usec / 1000;
+}
+
/*
* we ride the region ref that the region dir holds. before the region
* dir is removed and drops it ref it will wait to tear down this
@@ -860,17 +886,35 @@
struct o2hb_region *reg = data;
struct bio *write_bio;
struct o2hb_bio_wait_ctxt write_wc;
+ struct timeval before_hb, after_hb;
+ unsigned int elapsed_msec;
mlog(ML_HEARTBEAT|ML_KTHREAD, "hb thread running\n");
set_user_nice(current, -20);
while (!kthread_should_stop() && !reg->hr_unclean_stop) {
+ /* We track the time spent inside
+ * o2hb_do_disk_heartbeat so that we avoid more then
+ * hr_timeout_ms between disk writes. On busy systems
+ * this should result in a heartbeat which is less
+ * likely to time itself out. */
+ do_gettimeofday(&before_hb);
+
o2hb_do_disk_heartbeat(reg);
- /* the kthread api has blocked signals for us so no
- * need to record the return value. */
- msleep_interruptible(reg->hr_timeout_ms);
+ do_gettimeofday(&after_hb);
+ elapsed_msec = o2hb_elapsed_msecs(&before_hb, &after_hb);
+
+ mlog(0, "start = %lu.%lu, end = %lu.%lu, msec = %u\n",
+ before_hb.tv_sec, before_hb.tv_usec,
+ after_hb.tv_sec, after_hb.tv_usec, elapsed_msec);
+
+ if (elapsed_msec < reg->hr_timeout_ms) {
+ /* the kthread api has blocked signals for us so no
+ * need to record the return value. */
+ msleep_interruptible(reg->hr_timeout_ms - elapsed_msec);
+ }
}
o2hb_disarm_write_timeout(reg);
More information about the Ocfs2-commits
mailing list