• Kenton Varda's avatar
    CapabilityServerSet::getLocalServer() must wait for stream queue. · 4a4fe65c
    Kenton Varda authored
    Consider a capnp streaming type that wraps a kj::AsyncOutputStream.
    
    KJ streams require the caller to avoid doing multiple writes at once. Capnp streaming conveniently guarantees only one streaming call will be delivered at a time. This is great because it means the app does not have to do its own queuing of writes.
    
    However, the app may want to use a CapabilityServerSet to unwrap the capability and get at the underlying KJ stream to optimize by writing to it directly. However, before it can issue a direct write, it has to wait for all RPC writes to complete. These RPC writes were probably issued by the same caller, before it realized it was talking to a local cap. Unfortunately, it can't just wait for those calls it issued to complete, because streaming flow control may have made them appear to complete long ago, when they're actually still in the server's queue. How does the app make sure that the directly-issued writes don't overlap with RPC writes?
    
    We can solve this by making CapabilityServerSet::getLocalServer() delay until all in-flight stream calls are complete before unwrapping.
    
    Now, the app can simply make sure that any requests it issued over RPC in the past completed before it starts issuing direct requests.
    4a4fe65c
layout.c++ 149 KB