summaryrefslogtreecommitdiffstats
path: root/storage
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-08-20 22:27:03 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-08-20 22:27:12 +0000
commit6c6203e47bcca5309f0865c7e6c02855c6224a1c (patch)
treea4b85fd8e50ded46f91f2e9b83ddb503afff4f3b /storage
parent683a3309292109ad03e49d09629384d6528bb7c3 (diff)
Move exception handling to where we can give proper feedback to the user.
Diffstat (limited to 'storage')
-rw-r--r--storage/src/vespa/storage/persistence/persistencethread.cpp27
1 files changed, 25 insertions, 2 deletions
diff --git a/storage/src/vespa/storage/persistence/persistencethread.cpp b/storage/src/vespa/storage/persistence/persistencethread.cpp
index 2cdb6194b6d..223e2858203 100644
--- a/storage/src/vespa/storage/persistence/persistencethread.cpp
+++ b/storage/src/vespa/storage/persistence/persistencethread.cpp
@@ -8,6 +8,7 @@
#include <vespa/storage/common/bucketoperationlogger.h>
#include <vespa/document/fieldset/fieldsetrepo.h>
#include <vespa/document/update/documentupdate.h>
+#include <vespa/document/base/exceptions.h>
#include <vespa/vespalib/util/exceptions.h>
#include <vespa/vespalib/util/isequencedtaskexecutor.h>
#include <vespa/vespalib/stllike/hash_map.hpp>
@@ -15,6 +16,8 @@
#include <vespa/log/log.h>
LOG_SETUP(".persistence.thread");
+using vespalib::make_string;
+
namespace storage {
namespace {
@@ -277,6 +280,22 @@ spi::ReadConsistency api_read_consistency_to_spi(api::InternalReadConsistency co
}
}
+document::FieldSet::SP
+getFieldSet(const document::FieldSetRepo & repo, vespalib::stringref name, MessageTracker & tracker) {
+ try {
+ return repo.getFieldSet(name);
+ } catch (document::FieldNotFoundException & e) {
+ tracker.fail(storage::api::ReturnCode::ILLEGAL_PARAMETERS,
+ make_string("Field %s not found in fieldset %s",
+ e.getFieldName().c_str(), vespalib::string(name).c_str()));
+ } catch (const vespalib::Exception & e) {
+ tracker.fail(storage::api::ReturnCode::ILLEGAL_PARAMETERS,
+ make_string("Failed parsing fieldset %s with : %s",
+ vespalib::string(name).c_str(), e.getMessage().c_str()));
+ }
+ return document::FieldSet::SP();
+}
+
}
MessageTracker::UP
@@ -286,7 +305,9 @@ PersistenceThread::handleGet(api::GetCommand& cmd, MessageTracker::UP tracker)
tracker->setMetric(metrics);
metrics.request_size.addValue(cmd.getApproxByteSize());
- auto fieldSet = _env._component.getTypeRepo()->fieldSetRepo->getFieldSet(cmd.getFieldSet());
+ auto fieldSet = getFieldSet(*_env._component.getTypeRepo()->fieldSetRepo, cmd.getFieldSet(), *tracker);
+ if ( ! fieldSet) { return tracker; }
+
tracker->context().setReadConsistency(api_read_consistency_to_spi(cmd.internal_read_consistency()));
spi::GetResult result =
_spi.get(getBucket(cmd.getDocumentId(), cmd.getBucket()), *fieldSet, cmd.getDocumentId(), tracker->context());
@@ -455,7 +476,9 @@ MessageTracker::UP
PersistenceThread::handleCreateIterator(CreateIteratorCommand& cmd, MessageTracker::UP tracker)
{
tracker->setMetric(_env._metrics.createIterator);
- document::FieldSet::SP fieldSet = _env._component.getTypeRepo()->fieldSetRepo->getFieldSet(cmd.getFields());
+ auto fieldSet = getFieldSet(*_env._component.getTypeRepo()->fieldSetRepo, cmd.getFields(), *tracker);
+ if ( ! fieldSet) { return tracker; }
+
tracker->context().setReadConsistency(cmd.getReadConsistency());
spi::CreateIteratorResult result(_spi.createIterator(
spi::Bucket(cmd.getBucket(), spi::PartitionId(_env._partition)),