aboutsummaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2011-03-29 09:44:55 -0700
committerBen Pfaff <blp@nicira.com>2011-03-29 10:09:47 -0700
commit18e124a20b366ee96e73600624a1a4000c816604 (patch)
treea585254ce03d364d2fa016bde8ab5c7bc467b776 /python
parent2159de839136af40641738284c7eabde1b0fc72b (diff)
daemon: Avoid redundant code in already_running().
This function substantially duplicated read_pidfile(), so reuse that code instead.
Diffstat (limited to 'python')
-rw-r--r--python/ovs/daemon.py48
1 files changed, 18 insertions, 30 deletions
diff --git a/python/ovs/daemon.py b/python/ovs/daemon.py
index 83ae8cd1..4e54e697 100644
--- a/python/ovs/daemon.py
+++ b/python/ovs/daemon.py
@@ -111,37 +111,15 @@ def set_monitor():
global _monitor
_monitor = True
-def _already_running():
- """If a pidfile has been configured and that pidfile already exists and is
- locked by a running process, returns True. Otherwise, returns False."""
- if _pidfile is not None:
- try:
- file = open(_pidfile, "r+")
- try:
- try:
- fcntl.lockf(file, fcntl.LOCK_EX | fcntl.LOCK_NB)
- except IOError, e:
- if e.errno in [errno.EACCES, errno.EAGAIN]:
- return True
- logging.error("error locking %s (%s)"
- % (_pidfile, os.strerror(e.errno)))
- return False
- finally:
- # This releases the lock, which we don't really want.
- file.close()
- except IOError, e:
- if e.errno == errno.ENOENT:
- return False
- logging.error("error opening %s (%s)"
- % (_pidfile, os.strerror(e.errno)))
- return False
-
def die_if_already_running():
"""If a locked pidfile exists, issue a warning message and, unless
ignore_existing_pidfile() has been called, terminate the program."""
- if _already_running():
+ if _pidfile is None:
+ return
+ pid = read_pidfile_if_exists(_pidfile)
+ if pid > 0:
if not _overwrite_pidfile:
- msg = "%s: already running" % _pidfile
+ msg = "%s: already running as pid %d" % (_pidfile, pid)
logging.error("%s, aborting" % msg)
sys.stderr.write("%s\n" % msg)
sys.exit(1)
@@ -382,9 +360,7 @@ Daemon options:
--overwrite-pidfile with --pidfile, start even if already running
""" % (ovs.dirs.RUNDIR, ovs.util.PROGRAM_NAME))
-def read_pidfile(pidfile):
- """Opens and reads a PID from 'pidfile'. Returns the nonnegative PID if
- successful, otherwise a negative errno value."""
+def __read_pidfile(pidfile, must_exist):
if _pidfile_dev is not None:
try:
s = os.stat(pidfile)
@@ -401,6 +377,8 @@ def read_pidfile(pidfile):
try:
file = open(pidfile, "r")
except IOError, e:
+ if e.errno == errno.ENOENT and not must_exist:
+ return 0
logging.warning("%s: open: %s" % (pidfile, os.strerror(e.errno)))
return -e.errno
@@ -437,6 +415,16 @@ def read_pidfile(pidfile):
except IOError:
pass
+def read_pidfile(pidfile):
+ """Opens and reads a PID from 'pidfile'. Returns the positive PID if
+ successful, otherwise a negative errno value."""
+ return __read_pidfile(pidfile, True)
+
+def read_pidfile_if_exists(pidfile):
+ """Opens and reads a PID from 'pidfile'. Returns 0 if 'pidfile' does not
+ exist, the positive PID if successful, otherwise a negative errno value."""
+ return __read_pidfile(pidfile, False)
+
# XXX Python's getopt does not support options with optional arguments, so we
# have to separate --pidfile (with no argument) from --pidfile-name (with an
# argument). Need to write our own getopt I guess.