Show More
@@ -41,6 +41,14 b' class batcher(object):' | |||||
41 | def submit(self): |
|
41 | def submit(self): | |
42 | raise NotImplementedError() |
|
42 | raise NotImplementedError() | |
43 |
|
43 | |||
|
44 | class iterbatcher(batcher): | |||
|
45 | ||||
|
46 | def submit(self): | |||
|
47 | raise NotImplementedError() | |||
|
48 | ||||
|
49 | def results(self): | |||
|
50 | raise NotImplementedError() | |||
|
51 | ||||
44 | class localbatch(batcher): |
|
52 | class localbatch(batcher): | |
45 | '''performs the queued calls directly''' |
|
53 | '''performs the queued calls directly''' | |
46 | def __init__(self, local): |
|
54 | def __init__(self, local): | |
@@ -50,6 +58,19 b' class localbatch(batcher):' | |||||
50 | for name, args, opts, resref in self.calls: |
|
58 | for name, args, opts, resref in self.calls: | |
51 | resref.set(getattr(self.local, name)(*args, **opts)) |
|
59 | resref.set(getattr(self.local, name)(*args, **opts)) | |
52 |
|
60 | |||
|
61 | class localiterbatcher(iterbatcher): | |||
|
62 | def __init__(self, local): | |||
|
63 | super(iterbatcher, self).__init__() | |||
|
64 | self.local = local | |||
|
65 | ||||
|
66 | def submit(self): | |||
|
67 | # submit for a local iter batcher is a noop | |||
|
68 | pass | |||
|
69 | ||||
|
70 | def results(self): | |||
|
71 | for name, args, opts, resref in self.calls: | |||
|
72 | yield getattr(self.local, name)(*args, **opts) | |||
|
73 | ||||
53 | def batchable(f): |
|
74 | def batchable(f): | |
54 | '''annotation for batchable methods |
|
75 | '''annotation for batchable methods | |
55 |
|
76 | |||
@@ -91,6 +112,14 b' class peerrepository(object):' | |||||
91 | def batch(self): |
|
112 | def batch(self): | |
92 | return localbatch(self) |
|
113 | return localbatch(self) | |
93 |
|
114 | |||
|
115 | def iterbatch(self): | |||
|
116 | """Batch requests but allow iterating over the results. | |||
|
117 | ||||
|
118 | This is to allow interleaving responses with things like | |||
|
119 | progress updates for clients. | |||
|
120 | """ | |||
|
121 | return localiterbatcher(self) | |||
|
122 | ||||
94 | def capable(self, name): |
|
123 | def capable(self, name): | |
95 | '''tell whether repo supports named capability. |
|
124 | '''tell whether repo supports named capability. | |
96 | return False if not supported. |
|
125 | return False if not supported. |
@@ -114,6 +114,25 b' class remotebatch(peer.batcher):' | |||||
114 | encresref.set(encres) |
|
114 | encresref.set(encres) | |
115 | resref.set(batchable.next()) |
|
115 | resref.set(batchable.next()) | |
116 |
|
116 | |||
|
117 | class remoteiterbatcher(peer.iterbatcher): | |||
|
118 | def __init__(self, remote): | |||
|
119 | super(remoteiterbatcher, self).__init__() | |||
|
120 | self._remote = remote | |||
|
121 | ||||
|
122 | def submit(self): | |||
|
123 | """Break the batch request into many patch calls and pipeline them. | |||
|
124 | ||||
|
125 | This is mostly valuable over http where request sizes can be | |||
|
126 | limited, but can be used in other places as well. | |||
|
127 | """ | |||
|
128 | rb = self._remote.batch() | |||
|
129 | rb.calls = self.calls | |||
|
130 | rb.submit() | |||
|
131 | ||||
|
132 | def results(self): | |||
|
133 | for name, args, opts, resref in self.calls: | |||
|
134 | yield resref.value | |||
|
135 | ||||
117 | # Forward a couple of names from peer to make wireproto interactions |
|
136 | # Forward a couple of names from peer to make wireproto interactions | |
118 | # slightly more sensible. |
|
137 | # slightly more sensible. | |
119 | batchable = peer.batchable |
|
138 | batchable = peer.batchable | |
@@ -193,6 +212,9 b' class wirepeer(peer.peerrepository):' | |||||
193 | def _submitone(self, op, args): |
|
212 | def _submitone(self, op, args): | |
194 | return self._call(op, **args) |
|
213 | return self._call(op, **args) | |
195 |
|
214 | |||
|
215 | def iterbatch(self): | |||
|
216 | return remoteiterbatcher(self) | |||
|
217 | ||||
196 | @batchable |
|
218 | @batchable | |
197 | def lookup(self, key): |
|
219 | def lookup(self, key): | |
198 | self.requirecap('lookup', _('look up remote revision')) |
|
220 | self.requirecap('lookup', _('look up remote revision')) |
General Comments 0
You need to be logged in to leave comments.
Login now