summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@oath.com>2018-06-14 11:34:31 +0200
committerHenning Baldersheim <balder@oath.com>2018-06-14 12:13:27 +0200
commit4e40b383f9e8fae5789d25ffa406231e33f8c536 (patch)
treee1aff2de7fb284813a1fe643e40b78b4156d4d52 /searchcore
parent23ccc915f80a2612f4c6d04de2647b1a9e62a42e (diff)
Catch explicit known exceptions and return correct error code.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp16
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h49
2 files changed, 39 insertions, 26 deletions
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 <vespa/metrics/loadmetric.h>
#include <vespa/vespalib/stllike/hash_set.h>
#include <vespa/document/fieldvalue/document.h>
+#include <vespa/document/datatype/documenttype.h>
#include <vespa/document/update/documentupdate.h>
+#include <vespa/document/base/exceptions.h>
#include <vespa/log/log.h>
@@ -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<std::shared_timed_mutex> 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<document::Document>&, Context&) override;
- virtual RemoveResult remove(const Bucket&, Timestamp, const document::DocumentId&, Context&) override;
- virtual UpdateResult update(const Bucket&, Timestamp,
- const std::shared_ptr<document::DocumentUpdate>&, 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<document::Document>&, Context&) override;
+ RemoveResult remove(const Bucket&, Timestamp, const document::DocumentId&, Context&) override;
+ UpdateResult update(const Bucket&, Timestamp,
+ const std::shared_ptr<document::DocumentUpdate>&, 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);