- From: Jeffrey Mogul <mogul@pa.dec.com>
- Date: Mon, 25 Sep 95 10:03:07 MDT
- To: Paul Leach <paulle@microsoft.com>
- Cc: http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com
Paul and I alternate (excerpts only): ] a. Send request ] b. Receive first buffer(s) of response; enough to see that no further ] negotiation (e.g., authentication) or other packet exchanges are ] required for this request. ] c. Send next request (perhaps based on the contents of the immediatelty ] or some other previous response) ] ] we skipped step (b). One can skip step b) if one can tell in advance that it won't be required, or that failure to wait when one should have can be recovered from safely. I take your "presumably" to mean that most of the time everything falls out because initial requests aren't typically pipelinable -- but I wouldn't want to depend on being able to omit step b) in all cases. An observation: the same potential problem arises for the "fire off N parallel connections at once" approach, right? That is, any form of pipelining suffers from the possibility of a fault. CPU designers know this; their pipelines know how to "squash" instructions in progress, restart them, insert bubbles, do "imprecise exceptions", etc. I suspect that in most cases, the worst thing that can happen is that one or more retrieval requests result in "soft" (retryable) error returns, in which case the client knows what to do. The only time this could be a real problem is if certain requests must be executed in a particular order, in which case pipelining is not advised. (In modern RISC machines, the solution is to insert "trap barriers" to force synchronization.) So, in order to make things robust, we'd either need to document some restrictions that make skipping b) always safe, or know in advance when it is safe to skip and handle the unsafe cases by waiting to complete the negotiation, or figuring out how to recover if the server gets a GET in response to a request to negotiate something -- maybe just draining the pipe until the client's request-aheads are all gone and the correct response to the negotiation arrives would work, and perform well if it doesn't happen very often. I think your last suggestion best fits the CPU-pipeline analogy. -Jeff
Received on Monday, 25 September 1995 10:30:17 UTC