summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-02-15 16:09:22 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-02-15 16:09:22 +0000
commit9b5ccc196b48ebb19a502c0ba4a22281939169f0 (patch)
treeec4ddcec6ff60319e7aaadddf1a230f44684bc18 /searchcore
parent20f84687ed1362a7f76404e2f20a6619fca05119 (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')
-rw-r--r--searchcore/src/tests/proton/persistenceengine/persistence_handler_map/persistence_handler_map_test.cpp12
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/handlermap.hpp22
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.cpp6
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.h6
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp8
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h2
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;