X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Flockfile.c;h=43ccaf98a21387fa448cfa9fa779994373e79c43;hb=df89525eb0b20233cdc8a58e6a43bf9b8bfd84c5;hp=9bb7c6b18af76a08b8159cb0a57c4a9e04208102;hpb=c69ee87c10818267f991236201150b1fa51ae519;p=sliver-openvswitch.git diff --git a/lib/lockfile.c b/lib/lockfile.c index 9bb7c6b18..43ccaf98a 100644 --- a/lib/lockfile.c +++ b/lib/lockfile.c @@ -1,4 +1,4 @@ - /* Copyright (c) 2008, 2009 Nicira Networks + /* Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,10 +29,15 @@ #include "hmap.h" #include "timeval.h" #include "util.h" - -#define THIS_MODULE VLM_lockfile #include "vlog.h" +VLOG_DEFINE_THIS_MODULE(lockfile); + +COVERAGE_DEFINE(lockfile_lock); +COVERAGE_DEFINE(lockfile_timeout); +COVERAGE_DEFINE(lockfile_error); +COVERAGE_DEFINE(lockfile_unlock); + struct lockfile { struct hmap_node hmap_node; char *name; @@ -84,6 +89,7 @@ lockfile_lock(const char *file, int timeout, struct lockfile **lockfilep) * because the Open vSwitch code that currently uses lock files does so in * stylized ways such that any number of readers may access a file while it * is being written. */ + long long int warn_elapsed = 1000; long long int start, elapsed; char *lock_name; int error; @@ -98,19 +104,19 @@ lockfile_lock(const char *file, int timeout, struct lockfile **lockfilep) error = lockfile_try_lock(lock_name, timeout > 0, lockfilep); time_refresh(); elapsed = time_msec() - start; - } while (error == EINTR && (timeout == INT_MAX || elapsed < timeout)); - - if (!error) { - if (elapsed) { - VLOG_WARN("%s: waited %lld ms for lock file", + if (elapsed > warn_elapsed) { + warn_elapsed *= 2; + VLOG_WARN("%s: waiting for lock file, %lld ms elapsed", lock_name, elapsed); } - } else if (error == EINTR) { + } while (error == EINTR && (timeout == INT_MAX || elapsed < timeout)); + + if (error == EINTR) { COVERAGE_INC(lockfile_timeout); VLOG_WARN("%s: giving up on lock file after %lld ms", lock_name, elapsed); error = ETIMEDOUT; - } else { + } else if (error) { COVERAGE_INC(lockfile_error); if (error == EACCES) { error = EAGAIN; @@ -145,7 +151,7 @@ lockfile_postfork(void) { struct lockfile *lockfile; - HMAP_FOR_EACH (lockfile, struct lockfile, hmap_node, &lock_table) { + HMAP_FOR_EACH (lockfile, hmap_node, &lock_table) { if (lockfile->fd >= 0) { VLOG_WARN("%s: child does not inherit lock", lockfile->name); lockfile_unhash(lockfile); @@ -165,7 +171,7 @@ lockfile_find(dev_t device, ino_t inode) { struct lockfile *lockfile; - HMAP_FOR_EACH_WITH_HASH (lockfile, struct lockfile, hmap_node, + HMAP_FOR_EACH_WITH_HASH (lockfile, hmap_node, lockfile_hash(device, inode), &lock_table) { if (lockfile->device == device && lockfile->inode == inode) { return lockfile;