From 4e40b383f9e8fae5789d25ffa406231e33f8c536 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Thu, 14 Jun 2018 11:34:31 +0200 Subject: Catch explicit known exceptions and return correct error code. --- .../proton/persistenceengine/persistenceengine.cpp | 16 ++++++- .../proton/persistenceengine/persistenceengine.h | 49 +++++++++++----------- 2 files changed, 39 insertions(+), 26 deletions(-) (limited to 'searchcore') diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp index f774c953af4..6475efdaabb 100644 --- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp +++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp @@ -6,7 +6,9 @@ #include #include #include +#include #include +#include #include @@ -25,6 +27,7 @@ using storage::spi::Result; using vespalib::IllegalStateException; using vespalib::Sequence; using vespalib::make_string; +using std::make_unique; using namespace std::chrono_literals; @@ -377,7 +380,18 @@ PersistenceEngine::update(const Bucket& b, Timestamp t, const DocumentUpdate::SP upd->getId().toString().c_str(), state.message().c_str())); } } - upd->eagerDeserialize(); + try { + upd->eagerDeserialize(); + } catch (document::FieldNotFoundException & e) { + return UpdateResult(Result::TRANSIENT_ERROR, + make_string("Update operation rejected for document '%s' of type '%s': 'Field not found'", + upd->getId().toString().c_str(), upd->getType().getName().c_str())); + } catch (document::DocumentTypeNotFoundException & e) { + return UpdateResult(Result::TRANSIENT_ERROR, + make_string("Update operation rejected for document '%s' of type '%s'.", + upd->getId().toString().c_str(), e.getDocumentTypeName().c_str())); + + } std::shared_lock rguard(_rwMutex); DocTypeName docType(upd->getType()); LOG(spam, "update(%s, %" PRIu64 ", (\"%s\", \"%s\"), createIfNonExistent='%s')", diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h index f2ab35e0ccf..a6c696d08fb 100644 --- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h +++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h @@ -87,37 +87,36 @@ public: PersistenceEngine(IPersistenceEngineOwner &owner, const IResourceWriteFilter &writeFilter, ssize_t defaultSerializedSize, bool ignoreMaxBytes); - ~PersistenceEngine(); + ~PersistenceEngine() override; IPersistenceHandler::SP putHandler(document::BucketSpace bucketSpace, const DocTypeName &docType, const IPersistenceHandler::SP &handler); IPersistenceHandler::SP removeHandler(document::BucketSpace bucketSpace, const DocTypeName &docType); // Implements PersistenceProvider - virtual Result initialize() override; - virtual PartitionStateListResult getPartitionStates() const override; - virtual BucketIdListResult listBuckets(BucketSpace bucketSpace, PartitionId) const override; - virtual Result setClusterState(BucketSpace bucketSpace, const ClusterState& calc) override; - virtual Result setActiveState(const Bucket& bucket, BucketInfo::ActiveState newState) override; - virtual BucketInfoResult getBucketInfo(const Bucket&) const override; - virtual Result put(const Bucket&, Timestamp, const std::shared_ptr&, Context&) override; - virtual RemoveResult remove(const Bucket&, Timestamp, const document::DocumentId&, Context&) override; - virtual UpdateResult update(const Bucket&, Timestamp, - const std::shared_ptr&, Context&) override; - virtual GetResult get(const Bucket&, const document::FieldSet&, - const document::DocumentId&, Context&) const override; - virtual CreateIteratorResult createIterator(const Bucket&, const document::FieldSet&, const Selection&, - IncludedVersions, Context&) override; - virtual IterateResult iterate(IteratorId, uint64_t maxByteSize, Context&) const override; - virtual Result destroyIterator(IteratorId, Context&) override; - - virtual Result createBucket(const Bucket &bucketId, Context &) override ; - virtual Result deleteBucket(const Bucket&, Context&) override; - virtual BucketIdListResult getModifiedBuckets(BucketSpace bucketSpace) const override; - virtual Result split(const Bucket& source, const Bucket& target1, const Bucket& target2, Context&) override; - virtual Result join(const Bucket& source1, const Bucket& source2, const Bucket& target, Context&) override; - - virtual Result maintain(const Bucket&, MaintenanceLevel) override; + Result initialize() override; + PartitionStateListResult getPartitionStates() const override; + BucketIdListResult listBuckets(BucketSpace bucketSpace, PartitionId) const override; + Result setClusterState(BucketSpace bucketSpace, const ClusterState& calc) override; + Result setActiveState(const Bucket& bucket, BucketInfo::ActiveState newState) override; + BucketInfoResult getBucketInfo(const Bucket&) const override; + Result put(const Bucket&, Timestamp, const std::shared_ptr&, Context&) override; + RemoveResult remove(const Bucket&, Timestamp, const document::DocumentId&, Context&) override; + UpdateResult update(const Bucket&, Timestamp, + const std::shared_ptr&, Context&) override; + GetResult get(const Bucket&, const document::FieldSet&, const document::DocumentId&, Context&) const override; + CreateIteratorResult createIterator(const Bucket&, const document::FieldSet&, const Selection&, + IncludedVersions, Context&) override; + IterateResult iterate(IteratorId, uint64_t maxByteSize, Context&) const override; + Result destroyIterator(IteratorId, Context&) override; + + Result createBucket(const Bucket &bucketId, Context &) override ; + Result deleteBucket(const Bucket&, Context&) override; + BucketIdListResult getModifiedBuckets(BucketSpace bucketSpace) const override; + Result split(const Bucket& source, const Bucket& target1, const Bucket& target2, Context&) override; + Result join(const Bucket& source1, const Bucket& source2, const Bucket& target, Context&) override; + + Result maintain(const Bucket&, MaintenanceLevel) override; void destroyIterators(); void propagateSavedClusterState(BucketSpace bucketSpace, IPersistenceHandler &handler); -- cgit v1.2.3