annotate tests/test-walkrepo.py @ 39561:d06834e0f48e

wireprotov2peer: stream decoded responses Previously, wire protocol version 2 would buffer all response data. Only once all data was received did we CBOR decode it and resolve the future associated with the command. This was obviously not desirable. In future commits that introduce large response payloads, this caused significant memory bloat and slowed down client operations due to waiting on the server. This commit refactors the response handling code so that response data can be streamed. Command response objects now contain a buffered CBOR decoder. As new data arrives, it is fed into the decoder. Decoded objects are made available to the generator as they are decoded. Because there is a separate thread processing incoming frames and feeding data into the response object, there is the potential for race conditions when mutating response objects. So a lock has been added to guard access to critical state variables. Because the generator emitting decoded objects needs to wait on those objects to become available, we've added an Event for the generator to wait on so it doesn't busy loop. This does mean there is the potential for deadlocks. And I'm pretty sure they can occur in some scenarios. We already have a handful of TODOs around this. But I've added some more. Fixing this will likely require moving the background thread receiving frames into clienthandler. We likely would have done this anyway when implementing the client bits for the SSH transport. Test output changes because the initial CBOR map holding the overall response state is now always handled internally by the response object. Differential Revision: https://phab.mercurial-scm.org/D4474
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 29 Aug 2018 15:17:11 -0700
parents fa2423acb02f
children 2372284d9457
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
1 from __future__ import absolute_import, print_function
27300
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
2
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
3 import os
27300
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
4
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
5 from mercurial import (
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
6 hg,
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
7 scmutil,
28777
778d947f222e tests: alias ui as uimod in test-walkrepo
Yuya Nishihara <yuya@tcha.org>
parents: 28676
diff changeset
8 ui as uimod,
27300
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
9 util,
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
10 )
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
11
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
12 chdir = os.chdir
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
13 mkdir = os.mkdir
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
14 pjoin = os.path.join
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
15
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
16 walkrepos = scmutil.walkrepos
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
17 checklink = util.checklink
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
18
30559
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 28777
diff changeset
19 u = uimod.ui.load()
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
20 sym = checklink(b'.')
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
21
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
22 hg.repository(u, b'top1', create=1)
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
23 mkdir(b'subdir')
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
24 chdir(b'subdir')
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
25 hg.repository(u, b'sub1', create=1)
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
26 mkdir(b'subsubdir')
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
27 chdir(b'subsubdir')
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
28 hg.repository(u, b'subsub1', create=1)
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
29 chdir(os.path.pardir)
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
30 if sym:
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
31 os.symlink(os.path.pardir, b'circle')
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
32 os.symlink(pjoin(b'subsubdir', b'subsub1'), b'subsub1')
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
33
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
34 def runtest():
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
35 reposet = frozenset(walkrepos(b'.', followsym=True))
7494
85dc88630beb util: disable walkrepo() recursive behaviour
Patrick Mezard <pmezard@gmail.com>
parents: 7201
diff changeset
36 if sym and (len(reposet) != 3):
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
37 print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
38 print(("Found %d repositories when I should have found 3"
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
39 % (len(reposet),)))
7494
85dc88630beb util: disable walkrepo() recursive behaviour
Patrick Mezard <pmezard@gmail.com>
parents: 7201
diff changeset
40 if (not sym) and (len(reposet) != 2):
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
41 print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
42 print(("Found %d repositories when I should have found 2"
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
43 % (len(reposet),)))
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
44 sub1set = frozenset((pjoin(b'.', b'sub1'),
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
45 pjoin(b'.', b'circle', b'subdir', b'sub1')))
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
46 if len(sub1set & reposet) != 1:
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
47 print("sub1set = %r" % (sub1set,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
48 print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
49 print("sub1set and reposet should have exactly one path in common.")
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
50 sub2set = frozenset((pjoin(b'.', b'subsub1'),
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
51 pjoin(b'.', b'subsubdir', b'subsub1')))
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
52 if len(sub2set & reposet) != 1:
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
53 print("sub2set = %r" % (sub2set,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
54 print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
55 print("sub2set and reposet should have exactly one path in common.")
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
56 sub3 = pjoin(b'.', b'circle', b'top1')
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
57 if sym and sub3 not in reposet:
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
58 print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
59 print("Symbolic links are supported and %s is not in reposet" % (sub3,))
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
60
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
61 runtest()
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
62 if sym:
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
63 # Simulate not having symlinks.
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
64 del os.path.samestat
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
65 sym = False
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
66 runtest()