[#2335] [GTKUI] Fix startup failing with 'cannot acquire lock'

This issue was caused by an unclean shutdown of Deluge, usually on system shutdown, and upon rebooting
the PID stored in the lockfile is in used by another process thus the lockfile is never removed. It
affects users with Deluge set in startup applications as the PIDs are more likely to be reused.

 * Lockfile is removed if Deluge is restarted in IPC.
 * Renamed the old_tempfile variable to make it clearer as to it's role.
This commit is contained in:
Calum Lind 2014-10-02 17:15:00 +01:00
parent 294ad9fae1
commit 47daef1e47
1 changed files with 16 additions and 12 deletions

View File

@ -120,24 +120,28 @@ class IPCInterface(component.Component):
sys.exit(0) sys.exit(0)
else: else:
# Find and remove any restart tempfiles # Find and remove any restart tempfiles
old_tempfile = glob(os.path.join(ipc_dir, 'tmp*deluge')) restart_tempfile = glob(os.path.join(ipc_dir, 'tmp*deluge'))
for f in old_tempfile: for f in restart_tempfile:
os.remove(f) os.remove(f)
lockfile = socket + ".lock" lockfile = socket + ".lock"
log.debug("Checking if lockfile exists: %s", lockfile) log.debug("Checking if lockfile exists: %s", lockfile)
if os.path.lexists(lockfile) or os.path.lexists(socket): if os.path.lexists(lockfile):
try: def delete_lockfile():
os.kill(int(os.readlink(lockfile)), 0)
except OSError:
log.debug("Removing lockfile since it's stale.") log.debug("Removing lockfile since it's stale.")
try: try:
os.remove(lockfile) os.remove(lockfile)
except OSError, ex:
log.error("Failed to delete IPC lockfile file: %s", ex)
try:
os.remove(socket) os.remove(socket)
except OSError, ex: except OSError as ex:
log.error("Failed to delete IPC socket file: %s", ex) log.error("Failed to delete lockfile: %s", ex)
try:
os.kill(int(os.readlink(lockfile)), 0)
except OSError:
delete_lockfile()
else:
if restart_tempfile:
log.warning("Found running PID but it is not a Deluge process, removing lockfile...")
delete_lockfile()
try: try:
self.factory = Factory() self.factory = Factory()
self.factory.protocol = IPCProtocolServer self.factory.protocol = IPCProtocolServer
@ -154,7 +158,7 @@ class IPCInterface(component.Component):
gtk.gdk.notify_startup_complete() gtk.gdk.notify_startup_complete()
sys.exit(0) sys.exit(0)
else: else:
if old_tempfile: if restart_tempfile:
log.error("Deluge restart failed: %s", e) log.error("Deluge restart failed: %s", e)
sys.exit(1) sys.exit(1)
else: else: