Show More
@@ -196,6 +196,88 class ipeerlegacycommands(zi.Interface): | |||
|
196 | 196 | def changegroupsubset(bases, heads, kind): |
|
197 | 197 | pass |
|
198 | 198 | |
|
199 | class ipeercommandexecutor(zi.Interface): | |
|
200 | """Represents a mechanism to execute remote commands. | |
|
201 | ||
|
202 | This is the primary interface for requesting that wire protocol commands | |
|
203 | be executed. Instances of this interface are active in a context manager | |
|
204 | and have a well-defined lifetime. When the context manager exits, all | |
|
205 | outstanding requests are waited on. | |
|
206 | """ | |
|
207 | ||
|
208 | def callcommand(name, args): | |
|
209 | """Request that a named command be executed. | |
|
210 | ||
|
211 | Receives the command name and a dictionary of command arguments. | |
|
212 | ||
|
213 | Returns a ``concurrent.futures.Future`` that will resolve to the | |
|
214 | result of that command request. That exact value is left up to | |
|
215 | the implementation and possibly varies by command. | |
|
216 | ||
|
217 | Not all commands can coexist with other commands in an executor | |
|
218 | instance: it depends on the underlying wire protocol transport being | |
|
219 | used and the command itself. | |
|
220 | ||
|
221 | Implementations MAY call ``sendcommands()`` automatically if the | |
|
222 | requested command can not coexist with other commands in this executor. | |
|
223 | ||
|
224 | Implementations MAY call ``sendcommands()`` automatically when the | |
|
225 | future's ``result()`` is called. So, consumers using multiple | |
|
226 | commands with an executor MUST ensure that ``result()`` is not called | |
|
227 | until all command requests have been issued. | |
|
228 | """ | |
|
229 | ||
|
230 | def sendcommands(): | |
|
231 | """Trigger submission of queued command requests. | |
|
232 | ||
|
233 | Not all transports submit commands as soon as they are requested to | |
|
234 | run. When called, this method forces queued command requests to be | |
|
235 | issued. It will no-op if all commands have already been sent. | |
|
236 | ||
|
237 | When called, no more new commands may be issued with this executor. | |
|
238 | """ | |
|
239 | ||
|
240 | def close(): | |
|
241 | """Signal that this command request is finished. | |
|
242 | ||
|
243 | When called, no more new commands may be issued. All outstanding | |
|
244 | commands that have previously been issued are waited on before | |
|
245 | returning. This not only includes waiting for the futures to resolve, | |
|
246 | but also waiting for all response data to arrive. In other words, | |
|
247 | calling this waits for all on-wire state for issued command requests | |
|
248 | to finish. | |
|
249 | ||
|
250 | When used as a context manager, this method is called when exiting the | |
|
251 | context manager. | |
|
252 | ||
|
253 | This method may call ``sendcommands()`` if there are buffered commands. | |
|
254 | """ | |
|
255 | ||
|
256 | class ipeerrequests(zi.Interface): | |
|
257 | """Interface for executing commands on a peer.""" | |
|
258 | ||
|
259 | def commandexecutor(): | |
|
260 | """A context manager that resolves to an ipeercommandexecutor. | |
|
261 | ||
|
262 | The object this resolves to can be used to issue command requests | |
|
263 | to the peer. | |
|
264 | ||
|
265 | Callers should call its ``callcommand`` method to issue command | |
|
266 | requests. | |
|
267 | ||
|
268 | A new executor should be obtained for each distinct set of commands | |
|
269 | (possibly just a single command) that the consumer wants to execute | |
|
270 | as part of a single operation or round trip. This is because some | |
|
271 | peers are half-duplex and/or don't support persistent connections. | |
|
272 | e.g. in the case of HTTP peers, commands sent to an executor represent | |
|
273 | a single HTTP request. While some peers may support multiple command | |
|
274 | sends over the wire per executor, consumers need to code to the least | |
|
275 | capable peer. So it should be assumed that command executors buffer | |
|
276 | called commands until they are told to send them and that each | |
|
277 | command executor could result in a new connection or wire-level request | |
|
278 | being issued. | |
|
279 | """ | |
|
280 | ||
|
199 | 281 | class ipeerbase(ipeerconnection, ipeercapabilities, ipeercommands): |
|
200 | 282 | """Unified interface for peer repositories. |
|
201 | 283 |
General Comments 0
You need to be logged in to leave comments.
Login now