diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-02-15 16:09:22 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-02-15 16:09:22 +0000 |
commit | 9b5ccc196b48ebb19a502c0ba4a22281939169f0 (patch) | |
tree | ec4ddcec6ff60319e7aaadddf1a230f44684bc18 /searchcore | |
parent | 20f84687ed1362a7f76404e2f20a6619fca05119 (diff) |
Since we are accessing the handler while under read/writer lock, there is no reason to use a shared_ptr.
Diffstat (limited to 'searchcore')
6 files changed, 37 insertions, 19 deletions
diff --git a/searchcore/src/tests/proton/persistenceengine/persistence_handler_map/persistence_handler_map_test.cpp b/searchcore/src/tests/proton/persistenceengine/persistence_handler_map/persistence_handler_map_test.cpp index 941628891fe..35590cc68f6 100644 --- a/searchcore/src/tests/proton/persistenceengine/persistence_handler_map/persistence_handler_map_test.cpp +++ b/searchcore/src/tests/proton/persistenceengine/persistence_handler_map/persistence_handler_map_test.cpp @@ -46,16 +46,24 @@ DummyPersistenceHandler::SP handler_c(std::make_shared<DummyPersistenceHandler>( DummyPersistenceHandler::SP handler_a_new(std::make_shared<DummyPersistenceHandler>()); + +void +assertHandler(const IPersistenceHandler::SP & lhs, const IPersistenceHandler * rhs) +{ + EXPECT_EQUAL(lhs.get(), rhs); +} + void assertHandler(const IPersistenceHandler::SP &lhs, const IPersistenceHandler::SP &rhs) { EXPECT_EQUAL(lhs.get(), rhs.get()); } +template <typename T> void -assertNullHandler(const IPersistenceHandler::SP &handler) +assertNullHandler(const T & handler) { - EXPECT_TRUE(handler.get() == nullptr); + EXPECT_TRUE(! handler); } void diff --git a/searchcore/src/vespa/searchcore/proton/common/handlermap.hpp b/searchcore/src/vespa/searchcore/proton/common/handlermap.hpp index c5363b7a9e1..02da71b464c 100644 --- a/searchcore/src/vespa/searchcore/proton/common/handlermap.hpp +++ b/searchcore/src/vespa/searchcore/proton/common/handlermap.hpp @@ -5,7 +5,6 @@ #include <vespa/vespalib/util/exceptions.h> #include <vespa/vespalib/util/sequence.h> #include <vespa/vespalib/stllike/string.h> -#include <vespa/vespalib/stllike/hash_map.h> #include <map> #include <vector> @@ -18,9 +17,8 @@ namespace proton { template <typename T> class HandlerMap { private: - typedef typename std::shared_ptr<T> HandlerSP; - typedef std::map<DocTypeName, HandlerSP> StdMap; - typedef typename StdMap::iterator MapIterator; + using HandlerSP = typename std::shared_ptr<T>; + using StdMap = std::map<DocTypeName, HandlerSP>; StdMap _handlers; @@ -83,7 +81,7 @@ public: putHandler(const DocTypeName &docTypeNameVer, const HandlerSP &handler) { - if (handler.get() == NULL) { + if ( ! handler) { throw vespalib::IllegalArgumentException(vespalib::make_string( "Handler is null for docType '%s'", docTypeNameVer.toString().c_str())); @@ -115,6 +113,20 @@ public: return HandlerSP(); } + /** + * Returns the handler for the given document type. If no handler was + * registered, this method returns an empty shared pointer. + * + * @param docType The document type whose handler to return. + * @return The registered handler, if any. + */ + T * + getHandlerPtr(const DocTypeName &docTypeNameVer) const + { + const_iterator it = _handlers.find(docTypeNameVer); + return (it != _handlers.end()) ? it->second.get() : nullptr; + } + bool hasHandler(const HandlerSP &handler) const { bool found = false; for (const auto &kv : _handlers) { diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.cpp b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.cpp index 7caccd33da9..10d42e3a905 100644 --- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.cpp +++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.cpp @@ -20,15 +20,15 @@ PersistenceHandlerMap::putHandler(document::BucketSpace bucketSpace, return _map[bucketSpace].putHandler(docType, handler); } -IPersistenceHandler::SP +IPersistenceHandler * PersistenceHandlerMap::getHandler(document::BucketSpace bucketSpace, const DocTypeName &docType) const { auto itr = _map.find(bucketSpace); if (itr != _map.end()) { - return itr->second.getHandler(docType); + return itr->second.getHandlerPtr(docType); } - return IPersistenceHandler::SP(); + return nullptr; } IPersistenceHandler::SP diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.h b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.h index 0c4440488e0..72be050b686 100644 --- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.h +++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.h @@ -55,10 +55,8 @@ public: PersistenceHandlerSP putHandler(document::BucketSpace bucketSpace, const DocTypeName &docType, const PersistenceHandlerSP &handler); - PersistenceHandlerSP removeHandler(document::BucketSpace bucketSpace, - const DocTypeName &docType); - PersistenceHandlerSP getHandler(document::BucketSpace bucketSpace, - const DocTypeName &docType) const; + PersistenceHandlerSP removeHandler(document::BucketSpace bucketSpace, const DocTypeName &docType); + IPersistenceHandler * getHandler(document::BucketSpace bucketSpace, const DocTypeName &docType) const; HandlerSnapshot getHandlerSnapshot() const; HandlerSnapshot getHandlerSnapshot(document::BucketSpace bucketSpace) const; }; diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp index a528519f3ae..2ede5d45f7e 100644 --- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp +++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp @@ -212,7 +212,7 @@ PersistenceEngine::putHandler(const WriteGuard &, document::BucketSpace bucketSp } -IPersistenceHandler::SP +IPersistenceHandler * PersistenceEngine::getHandler(const ReadGuard &, document::BucketSpace bucketSpace, const DocTypeName &docType) const { return _handlers.getHandler(bucketSpace, docType); @@ -338,7 +338,7 @@ PersistenceEngine::put(const Bucket& b, Timestamp t, const document::Document::S return Result(Result::ErrorType::PERMANENT_ERROR, make_string("Old id scheme not supported in elastic mode (%s)", doc->getId().toString().c_str())); } - IPersistenceHandler::SP handler = getHandler(rguard, b.getBucketSpace(), docType); + IPersistenceHandler * handler = getHandler(rguard, b.getBucketSpace(), docType); if (!handler) { return Result(Result::ErrorType::PERMANENT_ERROR, make_string("No handler for document type '%s'", docType.toString().c_str())); @@ -360,7 +360,7 @@ PersistenceEngine::remove(const Bucket& b, Timestamp t, const DocumentId& did, C make_string("Old id scheme not supported in elastic mode (%s)", did.toString().c_str())); } DocTypeName docType(did.getDocType()); - IPersistenceHandler::SP handler = getHandler(rguard, b.getBucketSpace(), docType); + IPersistenceHandler * handler = getHandler(rguard, b.getBucketSpace(), docType); if (!handler) { return RemoveResult(Result::ErrorType::PERMANENT_ERROR, make_string("No handler for document type '%s'", docType.toString().c_str())); @@ -414,7 +414,7 @@ PersistenceEngine::update(const Bucket& b, Timestamp t, const DocumentUpdate::SP return UpdateResult(Result::ErrorType::PERMANENT_ERROR, make_string("Update operation rejected due to bad id (%s, %s)", upd->getId().toString().c_str(), docType.getName().c_str())); } - IPersistenceHandler::SP handler = getHandler(rguard, b.getBucketSpace(), docType); + IPersistenceHandler * handler = getHandler(rguard, b.getBucketSpace(), docType); if (handler) { TransportLatch latch(1); diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h index a4a03f64db2..b0d4f1f4c53 100644 --- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h +++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h @@ -78,7 +78,7 @@ private: using ReadGuard = std::shared_lock<std::shared_timed_mutex>; using WriteGuard = std::unique_lock<std::shared_timed_mutex>; - IPersistenceHandler::SP getHandler(const ReadGuard & guard, document::BucketSpace bucketSpace, const DocTypeName &docType) const; + IPersistenceHandler * getHandler(const ReadGuard & guard, document::BucketSpace bucketSpace, const DocTypeName &docType) const; HandlerSnapshot getHandlerSnapshot(const WriteGuard & guard) const; HandlerSnapshot getHandlerSnapshot(const ReadGuard & guard, document::BucketSpace bucketSpace) const; HandlerSnapshot getHandlerSnapshot(const WriteGuard & guard, document::BucketSpace bucketSpace) const; |