annotate mercurial/lock.py @ 1598:14d1f1868bf6

cleanup of revlog.group when repository is local revlog.group cached every chunk from the revlog, the behaviour was needed to minimize the roundtrip with old-http. We now cache the revlog data ~4MB at a time. The memory used server side when pulling goes down to 35Mo maximum whereas without the patch more than 160Mo was used when cloning the linux kernel repository. The time used by cloning is higher mainly because of the check in revlog.revision. before 110.25user 20.90system 2:52.00elapsed 76%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+708707minor)pagefaults 0swaps after 117.56user 18.86system 2:50.43elapsed 80%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+748366minor)pagefaults 0swaps
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Tue, 27 Dec 2005 13:09:49 -0600
parents 59b3639df0a9
children e6e70450edb9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
1 # lock.py - simple locking scheme for mercurial
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
2 #
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
3 # Copyright 2005 Matt Mackall <mpm@selenic.com>
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
4 #
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
5 # This software may be used and distributed according to the terms
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
6 # of the GNU General Public License, incorporated herein by reference.
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
7
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
8 import os, time
422
10c43444a38e [PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents: 161
diff changeset
9 import util
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
10
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
11 class LockHeld(Exception):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
12 pass
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
13
1559
59b3639df0a9 Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents: 1530
diff changeset
14 class lock(object):
1530
abfab59fce79 add a releasefn keyword to lock.lock
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1062
diff changeset
15 def __init__(self, file, wait=1, releasefn=None):
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
16 self.f = file
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
17 self.held = 0
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
18 self.wait = wait
1530
abfab59fce79 add a releasefn keyword to lock.lock
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1062
diff changeset
19 self.releasefn = releasefn
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
20 self.lock()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
21
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
22 def __del__(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
23 self.release()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
24
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
25 def lock(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
26 while 1:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
27 try:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
28 self.trylock()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
29 return 1
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
30 except LockHeld, inst:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
31 if self.wait:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
32 time.sleep(1)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
33 continue
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
34 raise inst
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 503
diff changeset
35
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
36 def trylock(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
37 pid = os.getpid()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
38 try:
422
10c43444a38e [PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents: 161
diff changeset
39 util.makelock(str(pid), self.f)
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
40 self.held = 1
704
5ca319a641e1 Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 515
diff changeset
41 except (OSError, IOError):
422
10c43444a38e [PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents: 161
diff changeset
42 raise LockHeld(util.readlock(self.f))
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
43
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
44 def release(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
45 if self.held:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
46 self.held = 0
1530
abfab59fce79 add a releasefn keyword to lock.lock
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1062
diff changeset
47 if self.releasefn:
abfab59fce79 add a releasefn keyword to lock.lock
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1062
diff changeset
48 self.releasefn()
503
c6a2e41c8c60 Fix troubles with clone and exception handling
mpm@selenic.com
parents: 429
diff changeset
49 try:
c6a2e41c8c60 Fix troubles with clone and exception handling
mpm@selenic.com
parents: 429
diff changeset
50 os.unlink(self.f)
c6a2e41c8c60 Fix troubles with clone and exception handling
mpm@selenic.com
parents: 429
diff changeset
51 except: pass
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
52