##// END OF EJS Templates
lock: take both vfs and lock file path relative to vfs to access via vfs...
FUJIWARA Katsunori -
r20091:abfe6a8e default
parent child Browse files
Show More
@@ -213,7 +213,7 b' def copystore(ui, srcrepo, destpath):'
213 if srcvfs.exists(f):
213 if srcvfs.exists(f):
214 if f.endswith('data'):
214 if f.endswith('data'):
215 # lock to avoid premature writing to the target
215 # lock to avoid premature writing to the target
216 destlock = lock.lock(dstvfs.join(dstbase + "/lock"))
216 destlock = lock.lock(dstvfs, dstbase + "/lock")
217 hardlink, n = util.copyfiles(srcvfs.join(f), dstvfs.join(f),
217 hardlink, n = util.copyfiles(srcvfs.join(f), dstvfs.join(f),
218 hardlink)
218 hardlink)
219 num += n
219 num += n
@@ -1000,16 +1000,16 b' class localrepository(object):'
1000 pass
1000 pass
1001 self.invalidatecaches()
1001 self.invalidatecaches()
1002
1002
1003 def _lock(self, lockname, wait, releasefn, acquirefn, desc):
1003 def _lock(self, vfs, lockname, wait, releasefn, acquirefn, desc):
1004 try:
1004 try:
1005 l = lockmod.lock(lockname, 0, releasefn, desc=desc)
1005 l = lockmod.lock(vfs, lockname, 0, releasefn, desc=desc)
1006 except error.LockHeld, inst:
1006 except error.LockHeld, inst:
1007 if not wait:
1007 if not wait:
1008 raise
1008 raise
1009 self.ui.warn(_("waiting for lock on %s held by %r\n") %
1009 self.ui.warn(_("waiting for lock on %s held by %r\n") %
1010 (desc, inst.locker))
1010 (desc, inst.locker))
1011 # default to 600 seconds timeout
1011 # default to 600 seconds timeout
1012 l = lockmod.lock(lockname,
1012 l = lockmod.lock(vfs, lockname,
1013 int(self.ui.config("ui", "timeout", "600")),
1013 int(self.ui.config("ui", "timeout", "600")),
1014 releasefn, desc=desc)
1014 releasefn, desc=desc)
1015 if acquirefn:
1015 if acquirefn:
@@ -1044,7 +1044,7 b' class localrepository(object):'
1044 continue
1044 continue
1045 ce.refresh()
1045 ce.refresh()
1046
1046
1047 l = self._lock(self.sjoin("lock"), wait, unlock,
1047 l = self._lock(self.svfs, "lock", wait, unlock,
1048 self.invalidate, _('repository %s') % self.origroot)
1048 self.invalidate, _('repository %s') % self.origroot)
1049 self._lockref = weakref.ref(l)
1049 self._lockref = weakref.ref(l)
1050 return l
1050 return l
@@ -1062,7 +1062,7 b' class localrepository(object):'
1062 self.dirstate.write()
1062 self.dirstate.write()
1063 self._filecache['dirstate'].refresh()
1063 self._filecache['dirstate'].refresh()
1064
1064
1065 l = self._lock(self.join("wlock"), wait, unlock,
1065 l = self._lock(self.vfs, "wlock", wait, unlock,
1066 self.invalidatedirstate, _('working directory of %s') %
1066 self.invalidatedirstate, _('working directory of %s') %
1067 self.origroot)
1067 self.origroot)
1068 self._wlockref = weakref.ref(l)
1068 self._wlockref = weakref.ref(l)
@@ -29,7 +29,8 b' class lock(object):'
29
29
30 _host = None
30 _host = None
31
31
32 def __init__(self, file, timeout=-1, releasefn=None, desc=None):
32 def __init__(self, vfs, file, timeout=-1, releasefn=None, desc=None):
33 self.vfs = vfs
33 self.f = file
34 self.f = file
34 self.held = 0
35 self.held = 0
35 self.timeout = timeout
36 self.timeout = timeout
@@ -75,13 +76,14 b' class lock(object):'
75 lockname = '%s:%s' % (lock._host, self.pid)
76 lockname = '%s:%s' % (lock._host, self.pid)
76 while not self.held:
77 while not self.held:
77 try:
78 try:
78 util.makelock(lockname, self.f)
79 self.vfs.makelock(lockname, self.f)
79 self.held = 1
80 self.held = 1
80 except (OSError, IOError), why:
81 except (OSError, IOError), why:
81 if why.errno == errno.EEXIST:
82 if why.errno == errno.EEXIST:
82 locker = self.testlock()
83 locker = self.testlock()
83 if locker is not None:
84 if locker is not None:
84 raise error.LockHeld(errno.EAGAIN, self.f, self.desc,
85 raise error.LockHeld(errno.EAGAIN,
86 self.vfs.join(self.f), self.desc,
85 locker)
87 locker)
86 else:
88 else:
87 raise error.LockUnavailable(why.errno, why.strerror,
89 raise error.LockUnavailable(why.errno, why.strerror,
@@ -99,7 +101,7 b' class lock(object):'
99
101
100 """
102 """
101 try:
103 try:
102 locker = util.readlock(self.f)
104 locker = self.vfs.readlock(self.f)
103 except (OSError, IOError), why:
105 except (OSError, IOError), why:
104 if why.errno == errno.ENOENT:
106 if why.errno == errno.ENOENT:
105 return None
107 return None
@@ -119,8 +121,8 b' class lock(object):'
119 # if locker dead, break lock. must do this with another lock
121 # if locker dead, break lock. must do this with another lock
120 # held, or can race and break valid lock.
122 # held, or can race and break valid lock.
121 try:
123 try:
122 l = lock(self.f + '.break', timeout=0)
124 l = lock(self.vfs, self.f + '.break', timeout=0)
123 util.unlink(self.f)
125 self.vfs.unlink(self.f)
124 l.release()
126 l.release()
125 except error.LockError:
127 except error.LockError:
126 return locker
128 return locker
@@ -140,7 +142,7 b' class lock(object):'
140 if self.releasefn:
142 if self.releasefn:
141 self.releasefn()
143 self.releasefn()
142 try:
144 try:
143 util.unlink(self.f)
145 self.vfs.unlink(self.f)
144 except OSError:
146 except OSError:
145 pass
147 pass
146 for callback in self.postrelease:
148 for callback in self.postrelease:
General Comments 0
You need to be logged in to leave comments. Login now