aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-03-22 00:57:02 +0100
committereldritch horrors <pennae@lix.systems>2024-03-31 16:42:40 +0000
commit45623f077fdd53eb227bfee94f061835e86742ff (patch)
tree423756e3f51e2df9161f89996a3c6151ab8b0083
parentf402c45cfa7d683fb90824cd6f6809184ed88225 (diff)
libutil: drop Fs{Source,Sink}::good
setting this only on exceptions caused by actual fd access is not sufficient to diagnose all errors (such as SerialisationError) in some cases. this usually does not have any negative effects since those errors will end up killing the process in another way. this is not a reliable assumption though and we should be using proper error handling (and closing connections more often, preferring to close over keeping something open that might be in a weird state) Change-Id: I1b792cd7ad8ba9ff0f6bd174945ab2575ff2208e
-rw-r--r--src/libstore/remote-store.cc8
-rw-r--r--src/libutil/serialise.cc23
-rw-r--r--src/libutil/serialise.hh11
3 files changed, 8 insertions, 34 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 2373bbdc7..2ce047acd 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -39,9 +39,7 @@ RemoteStore::RemoteStore(const Params & params)
},
[this](const ref<Connection> & r) {
return
- r->to.good()
- && r->from.good()
- && std::chrono::duration_cast<std::chrono::seconds>(
+ std::chrono::duration_cast<std::chrono::seconds>(
std::chrono::steady_clock::now() - r->startTime).count() < maxConnectionAge;
}
))
@@ -180,6 +178,10 @@ void RemoteStore::ConnectionHandle::processStderr(Sink * sink, Source * source,
m.find("Derive([") != std::string::npos)
throw Error("%s, this might be because the daemon is too old to understand dependencies on dynamic derivations. Check to see if the raw derivation is in the form '%s'", std::move(m), "DrvWithVersion(..)");
}
+ // the daemon can still handle more requests, so the connection itself
+ // is still valid. the current *handle* however should be considered a
+ // lost cause and abandoned entirely.
+ handle.release();
throw;
}
}
diff --git a/src/libutil/serialise.cc b/src/libutil/serialise.cc
index 692144b75..6450a9651 100644
--- a/src/libutil/serialise.cc
+++ b/src/libutil/serialise.cc
@@ -52,18 +52,7 @@ FdSink::~FdSink()
void FdSink::writeUnbuffered(std::string_view data)
{
written += data.size();
- try {
- writeFull(fd, data);
- } catch (SysError & e) {
- _good = false;
- throw;
- }
-}
-
-
-bool FdSink::good()
-{
- return _good;
+ writeFull(fd, data);
}
@@ -128,19 +117,13 @@ size_t FdSource::readUnbuffered(char * data, size_t len)
checkInterrupt();
n = ::read(fd, data, len);
} while (n == -1 && errno == EINTR);
- if (n == -1) { _good = false; throw SysError("reading from file"); }
- if (n == 0) { _good = false; throw EndOfFile(std::string(*endOfFileError)); }
+ if (n == -1) { throw SysError("reading from file"); }
+ if (n == 0) { throw EndOfFile(std::string(*endOfFileError)); }
read += n;
return n;
}
-bool FdSource::good()
-{
- return _good;
-}
-
-
size_t StringSource::read(char * data, size_t len)
{
if (pos == s.size()) throw EndOfFile("end of string reached");
diff --git a/src/libutil/serialise.hh b/src/libutil/serialise.hh
index d1c791823..e6290a652 100644
--- a/src/libutil/serialise.hh
+++ b/src/libutil/serialise.hh
@@ -18,7 +18,6 @@ struct Sink
{
virtual ~Sink() { }
virtual void operator () (std::string_view data) = 0;
- virtual bool good() { return true; }
};
/**
@@ -80,8 +79,6 @@ struct Source
*/
virtual size_t read(char * data, size_t len) = 0;
- virtual bool good() { return true; }
-
void drainInto(Sink & sink);
std::string drain();
@@ -136,11 +133,6 @@ struct FdSink : BufferedSink
~FdSink();
void writeUnbuffered(std::string_view data) override;
-
- bool good() override;
-
-private:
- bool _good = true;
};
@@ -165,11 +157,8 @@ struct FdSource : BufferedSource
return *this;
}
- bool good() override;
protected:
size_t readUnbuffered(char * data, size_t len) override;
-private:
- bool _good = true;
};