From mboxrd@z Thu Jan 1 00:00:00 1970 From: teigland@sourceware.org Date: 20 Nov 2006 18:13:03 -0000 Subject: [Cluster-devel] cluster/group/gfs_controld plock.c Message-ID: <20061120181303.28118.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL50 Changes by: teigland at sourceware.org 2006-11-20 18:13:03 Modified files: group/gfs_controld: plock.c Log message: The plock rate limiting code should use the full timeval to measure the 1 sec limit interval instead of just the rough difference in tv_sec values. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/gfs_controld/plock.c.diff?cvsroot=cluster&only_with_tag=RHEL50&r1=1.25.4.1&r2=1.25.4.2 --- cluster/group/gfs_controld/plock.c 2006/11/14 21:30:59 1.25.4.1 +++ cluster/group/gfs_controld/plock.c 2006/11/20 18:13:02 1.25.4.2 @@ -311,6 +311,21 @@ return control_fd; } +static unsigned long time_diff_ms(struct timeval *begin, struct timeval *end) +{ + unsigned long a_us, b_us, c_us, s, us, ms; + + a_us = begin->tv_sec * 1000000 + begin->tv_usec; + b_us = end->tv_sec * 1000000 + end->tv_usec; + c_us = b_us - a_us; + + s = c_us / 1000000; + us = c_us % 1000000; + ms = us / 1000; + + return (s * 1000 + ms); +} + int process_plocks(void) { struct mountgroup *mg; @@ -324,13 +339,13 @@ if (message_flow_control_on) return 0; - /* do we want to do something a little more accurate than tv_sec? */ + /* Every N ops we check how long it's taken to do those N ops. + If it's less than 1000 ms, we don't take any more. */ - /* limit plock rate within one second */ if (plock_rate_limit && plock_read_count && !(plock_read_count % plock_rate_limit)) { gettimeofday(&now, NULL); - if (now.tv_sec - plock_rate_last.tv_sec <= 0) { + if (time_diff_ms(&plock_rate_last, &now) < 1000) { plock_rate_delays++; return -EBUSY; }