# HG changeset patch # User Chris Cannam # Date 1484819878 0 # Node ID c4f841ccb2086c093dd2cab940b79d3491fabae1 # Parent 228a66adfb3074e7d58a5ee44adc9c8c910baa2f Allow the completeness checker to report failure (invalid message) as well as incompleteness diff -r 228a66adfb30 -r c4f841ccb208 vamp-client/CapnpRRClient.h --- a/vamp-client/CapnpRRClient.h Wed Jan 18 14:53:07 2017 +0000 +++ b/vamp-client/CapnpRRClient.h Thu Jan 19 09:57:58 2017 +0000 @@ -75,19 +75,38 @@ class CompletenessChecker : public MessageCompletenessChecker { public: - bool isComplete(const std::vector &message) const override { + State check(const std::vector &message) const override { + auto karr = toKJArray(message); size_t words = karr.size(); size_t expected = capnp::expectedSizeInWordsFromPrefix(karr); + + // Lacking a way to definitively check whether a message + // is valid or not, we would still like to trap obvious + // cases where a programming mistake results in garbage + // being returned from the server. We impose a limit on + // message size and, if a prefix is projected to exceed + // that limit, call it invalid. If an extractor wants to + // return a feature set greater than a gigaword in size, + // it'll just have to do it across multiple process calls. + size_t limit = size_t(1) << 30; + // cerr << "CompletenessChecker: message.size() = " << message.size() -// << ", words = " << words << ", expected = " << expected << endl; +// << ", words = " << words << ", limit = " << limit << ", expected = " << expected << endl; + if (words > expected) { std::cerr << "WARNING: obtained more data than expected (" << words << " " << sizeof(capnp::word) << "-byte words, expected " << expected << ")" << std::endl; + return Complete; + } else if (words == expected) { + return Complete; + } else if (expected > limit) { + return Invalid; + } else { + return Incomplete; } - return words >= expected; } }; diff -r 228a66adfb30 -r c4f841ccb208 vamp-client/ProcessQtTransport.h --- a/vamp-client/ProcessQtTransport.h Wed Jan 18 14:53:07 2017 +0000 +++ b/vamp-client/ProcessQtTransport.h Thu Jan 19 09:57:58 2017 +0000 @@ -187,7 +187,13 @@ size_t formerSize = buffer.size(); buffer.resize(formerSize + byteCount); m_process->read(buffer.data() + formerSize, byteCount); - complete = m_completenessChecker->isComplete(buffer); + switch (m_completenessChecker->check(buffer)) { + case MessageCompletenessChecker::Complete: complete = true; break; + case MessageCompletenessChecker::Incomplete: break; + case MessageCompletenessChecker::Invalid: + throw std::runtime_error + ("Invalid message received: corrupt stream from server?"); + } } } diff -r 228a66adfb30 -r c4f841ccb208 vamp-client/SynchronousTransport.h --- a/vamp-client/SynchronousTransport.h Wed Jan 18 14:53:07 2017 +0000 +++ b/vamp-client/SynchronousTransport.h Thu Jan 19 09:57:58 2017 +0000 @@ -46,8 +46,10 @@ class MessageCompletenessChecker // interface { public: + enum State { Complete, Incomplete, Invalid }; + virtual ~MessageCompletenessChecker() = default; - virtual bool isComplete(const std::vector &message) const = 0; + virtual State check(const std::vector &message) const = 0; }; class ServerCrashed : public std::runtime_error