##// END OF EJS Templates
clone: disable stream support on server side by default....
Vadim Gelfer -
r2621:5a5852a4 default
parent child Browse files
Show More
@@ -317,7 +317,7 b' paths::'
317 317 Assigns symbolic names to repositories. The left side is the
318 318 symbolic name, and the right gives the directory or URL that is the
319 319 location of the repository. Default paths can be declared by
320 setting the following entries.
320 setting the following entries.
321 321 default;;
322 322 Directory or URL to use when pulling if no source is specified.
323 323 Default is set to repository from which the current repository
@@ -326,6 +326,18 b' paths::'
326 326 Optional. Directory or URL to use when pushing if no destination
327 327 is specified.
328 328
329 server::
330 Controls generic server settings.
331 stream;;
332 Whether to allow clients to clone a repo using the uncompressed
333 streaming protocol. This transfers about 40% more data than a
334 regular clone, but uses less memory and CPU on both server and
335 client. Over a LAN (100Mbps or better) or a very fast WAN, an
336 uncompressed streaming clone is a lot faster (~10x) than a regular
337 clone. Over most WAN connections (anything slower than about
338 6Mbps), uncompressed streaming is slower, because of the extra
339 data transfer overhead. Default is False.
340
329 341 ui::
330 342 User interface controls.
331 343 debug;;
@@ -97,7 +97,8 b' def clone(ui, source, dest=None, pull=Fa'
97 97
98 98 pull: always pull from source repository, even in local case
99 99
100 stream: stream from repository (fast over LAN, slow over WAN)
100 stream: stream raw data uncompressed from repository (fast over
101 LAN, slow over WAN)
101 102
102 103 rev: revision to clone up to (implies pull=True)
103 104
@@ -860,7 +860,10 b' class hgweb(object):'
860 860 or self.t("error", error="%r not found" % fname))
861 861
862 862 def do_capabilities(self, req):
863 resp = 'unbundle stream=%d' % (self.repo.revlogversion,)
863 caps = ['unbundle']
864 if self.repo.ui.configbool('server', 'stream'):
865 caps.append('stream=%d' % self.repo.revlogversion)
866 resp = ' '.join(caps)
864 867 req.httphdr("application/mercurial-0.1", length=len(resp))
865 868 req.write(resp)
866 869
@@ -2204,8 +2204,11 b' class localrepository(repo.repository):'
2204 2204 return 1
2205 2205
2206 2206 def stream_in(self, remote):
2207 fp = remote.stream_out()
2208 resp = int(fp.readline())
2209 if resp != 0:
2210 raise util.Abort(_('operation forbidden by server'))
2207 2211 self.ui.status(_('streaming all changes\n'))
2208 fp = remote.stream_out()
2209 2212 total_files, total_bytes = map(int, fp.readline().split(' ', 1))
2210 2213 self.ui.status(_('%d files to transfer, %s of data\n') %
2211 2214 (total_files, util.bytecount(total_bytes)))
@@ -2230,14 +2233,15 b' class localrepository(repo.repository):'
2230 2233
2231 2234 keyword arguments:
2232 2235 heads: list of revs to clone (forces use of pull)
2233 pull: force use of pull, even if remote can stream'''
2236 stream: use streaming clone if possible'''
2234 2237
2235 # now, all clients that can stream can read repo formats
2236 # supported by all servers that can stream.
2238 # now, all clients that can request uncompressed clones can
2239 # read repo formats supported by all servers that can serve
2240 # them.
2237 2241
2238 2242 # if revlog format changes, client will have to check version
2239 # and format flags on "stream" capability, and stream only if
2240 # compatible.
2243 # and format flags on "stream" capability, and use
2244 # uncompressed only if compatible.
2241 2245
2242 2246 if stream and not heads and remote.capable('stream'):
2243 2247 return self.stream_in(remote)
@@ -60,8 +60,10 b' class sshserver(object):'
60 60 capabilities: space separated list of tokens
61 61 '''
62 62
63 r = "capabilities: unbundle stream=%d\n" % (self.repo.revlogversion,)
64 self.respond(r)
63 caps = ['unbundle']
64 if self.ui.configbool('server', 'stream'):
65 caps.append('stream=%d' % self.repo.revlogversion)
66 self.respond("capabilities: %s\n" % (' '.join(caps),))
65 67
66 68 def do_lock(self):
67 69 '''DEPRECATED - allowing remote client to lock repo is not safe'''
@@ -59,6 +59,13 b' def walkrepo(root):'
59 59 def stream_out(repo, fileobj):
60 60 '''stream out all metadata files in repository.
61 61 writes to file-like object, must support write() and optional flush().'''
62
63 if not repo.ui.configbool('server', 'stream'):
64 fileobj.write('1\n')
65 return
66
67 fileobj.write('0\n')
68
62 69 # get consistent snapshot of repo. lock during scan so lock not
63 70 # needed while we stream, and commits can happen.
64 71 lock = repo.lock()
@@ -1,23 +1,23 b''
1 1 #!/bin/sh
2 2
3 mkdir test
3 hg init test
4 4 cd test
5 5 echo foo>foo
6 hg init
7 hg addremove
8 hg commit -m 1
9 hg verify
10 hg serve -p 20059 -d --pid-file=hg.pid
11 cat hg.pid >> $DAEMON_PIDS
6 hg commit -A -d '0 0' -m 1
7 hg --config server.stream=True serve -p 20059 -d --pid-file=hg1.pid
8 cat hg1.pid >> $DAEMON_PIDS
9 hg serve -p 20060 -d --pid-file=hg2.pid
10 cat hg2.pid >> $DAEMON_PIDS
12 11 cd ..
13 12
14 13 echo % clone via stream
15 http_proxy= hg clone --stream http://localhost:20059/ copy 2>&1 | \
14 http_proxy= hg clone --uncompressed http://localhost:20059/ copy 2>&1 | \
16 15 sed -e 's/[0-9][0-9.]*/XXX/g'
17 16 cd copy
18 17 hg verify
19 18
20 cd ..
19 echo % try to clone via stream, should use pull instead
20 http_proxy= hg clone --uncompressed http://localhost:20060/ copy2
21 21
22 22 echo % clone via pull
23 23 http_proxy= hg clone http://localhost:20059/ copy-pull
@@ -4,7 +4,7 b' hg init a'
4 4 cd a
5 5 echo a > a
6 6 hg ci -Ama -d '1123456789 0'
7 hg serve -p 20059 -d --pid-file=hg.pid
7 hg --config server.stream=True serve -p 20059 -d --pid-file=hg.pid
8 8 cat hg.pid >> $DAEMON_PIDS
9 9
10 10 cd ..
@@ -14,7 +14,7 b' cat proxy.pid >> $DAEMON_PIDS'
14 14 sleep 2
15 15
16 16 echo %% url for proxy, stream
17 http_proxy=http://localhost:20060/ hg --config http_proxy.always=True clone --stream http://localhost:20059/ b | \
17 http_proxy=http://localhost:20060/ hg --config http_proxy.always=True clone --uncompressed http://localhost:20059/ b | \
18 18 sed -e 's/[0-9][0-9.]*/XXX/g'
19 19 cd b
20 20 hg verify
@@ -1,10 +1,4 b''
1 (the addremove command is deprecated; use add and remove --after instead)
2 1 adding foo
3 checking changesets
4 checking manifests
5 crosschecking files in changesets and manifests
6 checking files
7 1 files, 1 changesets, 1 total revisions
8 2 % clone via stream
9 3 streaming all changes
10 4 XXX files to transfer, XXX bytes of data
@@ -15,6 +9,13 b' checking manifests'
15 9 crosschecking files in changesets and manifests
16 10 checking files
17 11 1 files, 1 changesets, 1 total revisions
12 % try to clone via stream, should use pull instead
13 requesting all changes
14 adding changesets
15 adding manifests
16 adding file changes
17 added 1 changesets with 1 changes to 1 files
18 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
18 19 % clone via pull
19 20 requesting all changes
20 21 adding changesets
@@ -27,11 +27,13 b' hg init remote'
27 27 cd remote
28 28 echo this > foo
29 29 hg ci -A -m "init" -d "1000000 0" foo
30 echo '[server]' > .hg/hgrc
31 echo 'stream = True' >> .hg/hgrc
30 32
31 33 cd ..
32 34
33 35 echo "# clone remote via stream"
34 hg clone -e ./dummyssh --stream ssh://user@dummy/remote local-stream 2>&1 | \
36 hg clone -e ./dummyssh --uncompressed ssh://user@dummy/remote local-stream 2>&1 | \
35 37 sed -e 's/[0-9][0-9.]*/XXX/g'
36 38 cd local-stream
37 39 hg verify
General Comments 0
You need to be logged in to leave comments. Login now