diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-08-20 22:27:03 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-08-20 22:27:12 +0000 |
commit | 6c6203e47bcca5309f0865c7e6c02855c6224a1c (patch) | |
tree | a4b85fd8e50ded46f91f2e9b83ddb503afff4f3b /storage | |
parent | 683a3309292109ad03e49d09629384d6528bb7c3 (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.cpp | 27 |
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)), |