diff options
author | John Ericson <John.Ericson@Obsidian.Systems> | 2023-04-17 12:14:15 -0400 |
---|---|---|
committer | John Ericson <John.Ericson@Obsidian.Systems> | 2023-07-24 09:17:01 -0400 |
commit | 13269ba93b7453def7084b00eb4a34ad787a7c45 (patch) | |
tree | 19df8cfd983804a07a186de756d1a24035ebde7c /src/libstore/remote-store-connection.hh | |
parent | 0a30b072779aa605b92f1961fe94218ccd183669 (diff) |
Make `RemoteStore::ConnectionHandle` part of class and expose
Will need to do subclass-specific implementations in the next commit.
This isn't because there will be multiple variations of the daemon
protocol (whew!) but because different clients pick and choose different
parts to use.
Diffstat (limited to 'src/libstore/remote-store-connection.hh')
-rw-r--r-- | src/libstore/remote-store-connection.hh | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/libstore/remote-store-connection.hh b/src/libstore/remote-store-connection.hh index d32d91a60..ce4740a9c 100644 --- a/src/libstore/remote-store-connection.hh +++ b/src/libstore/remote-store-connection.hh @@ -1,5 +1,6 @@ #include "remote-store.hh" #include "worker-protocol.hh" +#include "pool.hh" namespace nix { @@ -94,4 +95,34 @@ struct RemoteStore::Connection std::exception_ptr processStderr(Sink * sink = 0, Source * source = 0, bool flush = true); }; +/** + * A wrapper around Pool<RemoteStore::Connection>::Handle that marks + * the connection as bad (causing it to be closed) if a non-daemon + * exception is thrown before the handle is closed. Such an exception + * causes a deviation from the expected protocol and therefore a + * desynchronization between the client and daemon. + */ +struct RemoteStore::ConnectionHandle +{ + Pool<RemoteStore::Connection>::Handle handle; + bool daemonException = false; + + ConnectionHandle(Pool<RemoteStore::Connection>::Handle && handle) + : handle(std::move(handle)) + { } + + ConnectionHandle(ConnectionHandle && h) + : handle(std::move(h.handle)) + { } + + ~ConnectionHandle(); + + RemoteStore::Connection & operator * () { return *handle; } + RemoteStore::Connection * operator -> () { return &*handle; } + + void processStderr(Sink * sink = 0, Source * source = 0, bool flush = true); + + void withFramedSink(std::function<void(Sink & sink)> fun); +}; + } |