Ensure that Subversion repositories get a clean disconnect when
SIGTERM is sent to the process by registering a handler for that signal which gracefully shuts down APR. * viewcvs/lib/vclib/svn/__init__.py (SubversionRepository.__init__): Register a handler for SIGTERM that cleanly closes up shop. (SubversionRepository._close): New (with code copied and modified from __del__). (SubversionRepository.__del__): Cored out (see _close). git-svn-id: http://viewvc.tigris.org/svn/viewvc/trunk@1011 8cb11bc2-c004-0410-86c3-e597b4017df7remotes/tags/1.0.0-rc1
parent
b5cf642f0e
commit
5ad97c13bb
|
@ -22,6 +22,7 @@ import os
|
|||
import os.path
|
||||
import string
|
||||
import cStringIO
|
||||
import signal
|
||||
|
||||
# Subversion swig libs
|
||||
from svn import fs, repos, core, delta
|
||||
|
@ -310,9 +311,22 @@ class SubversionRepository(vclib.Repository):
|
|||
if not os.path.isdir(rootpath):
|
||||
raise vclib.ReposNotFound(name)
|
||||
|
||||
# Initialize some stuff that __del__ will look for.
|
||||
# Initialize some stuff.
|
||||
self.pool = None
|
||||
self.apr_init = 0
|
||||
self.rootpath = rootpath
|
||||
self.name = name
|
||||
self.rev = rev
|
||||
|
||||
# Register a handler for SIGTERM so we can have a chance to
|
||||
# cleanup. If ViewCVS takes too long to start generating CGI
|
||||
# output, Apache will grow impatient and SIGTERM it. While we
|
||||
# don't mind getting told to bail, we want to gracefully close the
|
||||
# repository before we bail.
|
||||
def _sigterm_handler(signum, frame):
|
||||
self._close()
|
||||
sys.exit(-1)
|
||||
signal.signal(signal.SIGTERM, _sigterm_handler)
|
||||
|
||||
# Initialize APR and get our top-level pool.
|
||||
core.apr_initialize()
|
||||
|
@ -322,10 +336,7 @@ class SubversionRepository(vclib.Repository):
|
|||
|
||||
# Open the repository and init some other variables.
|
||||
self.repos = repos.svn_repos_open(rootpath, self.pool)
|
||||
self.name = name
|
||||
self.rootpath = rootpath
|
||||
self.fs_ptr = repos.svn_repos_fs(self.repos)
|
||||
self.rev = rev
|
||||
self.youngest = fs.youngest_rev(self.fs_ptr, self.pool)
|
||||
if self.rev is None:
|
||||
self.rev = self.youngest
|
||||
|
@ -334,10 +345,15 @@ class SubversionRepository(vclib.Repository):
|
|||
self.fsroot = fs.revision_root(self.fs_ptr, self.rev, self.pool)
|
||||
|
||||
def __del__(self):
|
||||
self._close()
|
||||
|
||||
def _close(self):
|
||||
if self.pool:
|
||||
core.svn_pool_destroy(self.pool)
|
||||
self.pool = None
|
||||
if self.apr_init:
|
||||
core.apr_terminate()
|
||||
self.apr_init = 0
|
||||
|
||||
def _scratch_clear(self):
|
||||
core.svn_pool_clear(self.scratch_pool)
|
||||
|
|
Loading…
Reference in New Issue