summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2012-02-25 17:09:49 +0000
committerLars Wirzenius <liw@liw.fi>2012-02-25 17:09:49 +0000
commitf173dcf745e30bb3f9fac759b2dafc547ebc5845 (patch)
tree71af2a8b560aafd5fca3bd0cc56263160e31cbfe
parent2a6d51f753be8ce0655e13bc2c6ef5027ed0aa8d (diff)
downloadobnam-f173dcf745e30bb3f9fac759b2dafc547ebc5845.tar.gz
Use LockManager to create root, per-client locks
-rw-r--r--obnamlib/repo.py29
1 files changed, 11 insertions, 18 deletions
diff --git a/obnamlib/repo.py b/obnamlib/repo.py
index a25a849f..be9e081c 100644
--- a/obnamlib/repo.py
+++ b/obnamlib/repo.py
@@ -64,7 +64,10 @@ class HookedFS(object):
toplevel = self._get_toplevel(filename)
return self.hooks.call('repository-read-data', data,
repo=self.repo, toplevel=toplevel)
-
+
+ def lock(self, filename):
+ self.fs.lock(filename)
+
def write_file(self, filename, data):
tracing.trace('writing hooked %s' % filename)
toplevel = self._get_toplevel(filename)
@@ -137,12 +140,12 @@ class Repository(object):
self.node_size = node_size
self.upload_queue_size = upload_queue_size
self.lru_size = lru_size
+ self.lockmgr = obnamlib.LockManager(self.fs, 0) # FIXME: timeout
self.got_root_lock = False
self.clientlist = obnamlib.ClientList(self.fs, node_size,
upload_queue_size,
lru_size, self)
self.got_client_lock = False
- self.client_lockfile = None
self.current_client = None
self.current_client_id = None
self.new_generation = None
@@ -214,7 +217,7 @@ class Repository(object):
def require_client_lock(self):
'''Ensure we have the lock on the currently open client.'''
if not self.got_client_lock:
- raise LockFail('have not got lock on client')
+ raise LockFail('have not got lock on client')
def require_open_client(self):
'''Ensure we have opened the client (r/w or r/o).'''
@@ -236,11 +239,7 @@ class Repository(object):
tracing.trace('locking root')
self.check_format_version()
- try:
- self.fs.fs.write_file('root.lock', '')
- except OSError, e:
- if e.errno == errno.EEXIST:
- raise LockFail('Lock file root.lock already exists')
+ self.lockmgr.lock(['.'])
self.got_root_lock = True
self.added_clients = []
self.removed_clients = []
@@ -252,7 +251,7 @@ class Repository(object):
self.require_root_lock()
self.added_clients = []
self.removed_clients = []
- self.fs.remove('root.lock')
+ self.lockmgr.unlock(['.'])
self.got_root_lock = False
def commit_root(self):
@@ -357,14 +356,9 @@ class Repository(object):
if not self.fs.exists(client_dir):
self.fs.mkdir(client_dir)
self.hooks.call('repository-toplevel-init', self, client_dir)
- lockname = os.path.join(client_dir, 'lock')
- try:
- self.fs.write_file(lockname, '')
- except OSError, e:
- if e.errno == errno.EEXIST:
- raise LockFail('client %s is already locked' % client_name)
+
+ self.lockmgr.lock([client_dir])
self.got_client_lock = True
- self.client_lockfile = lockname
self.current_client = client_name
self.current_client_id = client_id
self.added_generations = []
@@ -382,11 +376,10 @@ class Repository(object):
self.new_generation = None
for genid in self.added_generations:
self._really_remove_generation(genid)
+ self.lockmgr.unlock([self.client.dirname])
self.client = None # FIXME: This should remove uncommitted data.
self.added_generations = []
self.removed_generations = []
- self.fs.remove(self.client_lockfile)
- self.client_lockfile = None
self.got_client_lock = False
self.current_client = None
self.current_client_id = None