def put(self, _, uuid):
with self.lock.exclusive(uuid) as locked:
(fd, name, dbname, path) = self.tmp_graph(uuid)
os.close(fd)
cleanup = [lambda: os.unlink(path)]
try:
# with self.graph(uuid, readonly=True, locked=locked) as g1, self.collection.graph(dbname, create=True, hook=False) as g2:
with self.graph(uuid, locked=locked) as g1, self.collection.graph(dbname, create=True, hook=False) as g2:
with g1.transaction(write=False) as t1, g2.transaction(write=True) as t2:
# fixme
cleanup.append(lambda: os.unlink('%s-lock' % path))
keep = self.input()
if keep is None:
keep = self.default_keep
if keep.get('kv',False):
self.clone_kv(t1, t2)
seeds = keep.get('seeds', None)
if seeds:
self.clone_seeds(uuid, t1, t2, seeds)
target = g1.path
cleanup.pop()() # unlink(path-lock)
try:
# fixme
os.unlink('%s-lock' % target)
except OSError:
pass
os.rename(path, target)
cleanup.pop() # unlink(path)
# bypass creds check, allow hooks to run
self.collection.remove(uuid)
# with self.collection.graph(uuid, readonly=True):
with self.collection.graph(uuid):
pass
except (IOError, OSError) as e:
if e.errno is errno.EPERM:
raise HTTPError(403, str(e))
elif e.errno is errno.ENOSPC:
raise HTTPError(507, str(e))
raise HTTPError(404, "Reset failed for graph %s: %s" % (uuid, repr(e)))
finally:
for x in cleanup:
try:
x()
except:
pass
评论列表
文章目录