diff options
author | Ben Pfaff <blp@nicira.com> | 2011-03-29 09:44:55 -0700 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2011-03-29 10:09:47 -0700 |
commit | 18e124a20b366ee96e73600624a1a4000c816604 (patch) | |
tree | a585254ce03d364d2fa016bde8ab5c7bc467b776 /python | |
parent | 2159de839136af40641738284c7eabde1b0fc72b (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.py | 48 |
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. |