diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-02-15 13:43:11 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-02-15 13:43:11 +0000 |
commit | 82921e349d0d1189754c483a663958eb5a9c6b70 (patch) | |
tree | aa8010051ac891a5d4e6423b1823cbe801fcb803 /searchcore | |
parent | 92723e64844664b21f4bfe0b7f88a2bc230ca530 (diff) |
The snapshot has 2 lightweight members only and hence does not need another indirection.
Diffstat (limited to 'searchcore')
6 files changed, 64 insertions, 65 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 ef12b694187..941628891fe 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 @@ -59,10 +59,10 @@ assertNullHandler(const IPersistenceHandler::SP &handler) } void -assertSnapshot(const std::vector<IPersistenceHandler::SP> &exp, const HandlerSnapshot::UP &snapshot) +assertSnapshot(const std::vector<IPersistenceHandler::SP> &exp, HandlerSnapshot snapshot) { - EXPECT_EQUAL(exp.size(), snapshot->size()); - auto &sequence = snapshot->handlers(); + EXPECT_EQUAL(exp.size(), snapshot.size()); + auto &sequence = snapshot.handlers(); for (size_t i = 0; i < exp.size() && sequence.valid(); ++i, sequence.next()) { EXPECT_EQUAL(exp[i].get(), sequence.get()); } diff --git a/searchcore/src/vespa/searchcore/proton/common/handlermap.hpp b/searchcore/src/vespa/searchcore/proton/common/handlermap.hpp index bddbfed371f..c5363b7a9e1 100644 --- a/searchcore/src/vespa/searchcore/proton/common/handlermap.hpp +++ b/searchcore/src/vespa/searchcore/proton/common/handlermap.hpp @@ -164,7 +164,7 @@ public: std::unique_ptr<Snapshot> snapshot() const { - return std::unique_ptr<Snapshot>(new Snapshot(_handlers)); + return std::make_unique<Snapshot>(_handlers); } // we want to use snapshots rather than direct iteration to reduce locking; 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 06969167ab3..7caccd33da9 100644 --- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.cpp +++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.cpp @@ -42,7 +42,7 @@ PersistenceHandlerMap::removeHandler(document::BucketSpace bucketSpace, return IPersistenceHandler::SP(); } -HandlerSnapshot::UP +HandlerSnapshot PersistenceHandlerMap::getHandlerSnapshot() const { std::vector<IPersistenceHandler::SP> handlers; @@ -52,7 +52,7 @@ PersistenceHandlerMap::getHandlerSnapshot() const } } size_t handlersSize = handlers.size(); - return std::make_unique<HandlerSnapshot> + return HandlerSnapshot (std::make_unique<DocTypeToHandlerMap::Snapshot>(std::move(handlers)), handlersSize); } @@ -68,14 +68,14 @@ struct EmptySequence : public vespalib::Sequence<IPersistenceHandler *> { } -HandlerSnapshot::UP +HandlerSnapshot PersistenceHandlerMap::getHandlerSnapshot(document::BucketSpace bucketSpace) const { auto itr = _map.find(bucketSpace); if (itr != _map.end()) { - return std::make_unique<HandlerSnapshot>(itr->second.snapshot(), itr->second.size()); + return HandlerSnapshot(itr->second.snapshot(), itr->second.size()); } - return std::make_unique<HandlerSnapshot>(EmptySequence::make(), 0); + return HandlerSnapshot(EmptySequence::make(), 0); } namespace { 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 003c378d6a7..0c4440488e0 100644 --- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.h +++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.h @@ -28,7 +28,6 @@ public: PersistenceHandlerSequence::UP _handlers; size_t _size; public: - using UP = std::unique_ptr<HandlerSnapshot>; HandlerSnapshot(PersistenceHandlerSequence::UP handlers_, size_t size_) : _handlers(std::move(handlers_)), _size(size_) @@ -60,8 +59,8 @@ public: const DocTypeName &docType); PersistenceHandlerSP getHandler(document::BucketSpace bucketSpace, const DocTypeName &docType) const; - HandlerSnapshot::UP getHandlerSnapshot() const; - HandlerSnapshot::UP getHandlerSnapshot(document::BucketSpace bucketSpace) 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 9d40cbae633..a528519f3ae 100644 --- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp +++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp @@ -163,19 +163,19 @@ BucketInfoResultHandler::~BucketInfoResultHandler() = default; } -PersistenceEngine::HandlerSnapshot::UP +PersistenceEngine::HandlerSnapshot PersistenceEngine::getHandlerSnapshot(const WriteGuard &) const { return _handlers.getHandlerSnapshot(); } -PersistenceEngine::HandlerSnapshot::UP +PersistenceEngine::HandlerSnapshot PersistenceEngine::getHandlerSnapshot(const ReadGuard &, document::BucketSpace bucketSpace) const { return _handlers.getHandlerSnapshot(bucketSpace); } -PersistenceEngine::HandlerSnapshot::UP +PersistenceEngine::HandlerSnapshot PersistenceEngine::getHandlerSnapshot(const WriteGuard &, document::BucketSpace bucketSpace) const { return _handlers.getHandlerSnapshot(bucketSpace); @@ -232,9 +232,9 @@ PersistenceEngine::initialize() { std::unique_lock<std::shared_timed_mutex> wguard(getWLock()); LOG(debug, "Begin initializing persistence handlers"); - HandlerSnapshot::UP snap = getHandlerSnapshot(wguard); - for (; snap->handlers().valid(); snap->handlers().next()) { - IPersistenceHandler *handler = snap->handlers().get(); + HandlerSnapshot snap = getHandlerSnapshot(wguard); + for (; snap.handlers().valid(); snap.handlers().next()) { + IPersistenceHandler *handler = snap.handlers().get(); handler->initialize(); } LOG(debug, "Done initializing persistence handlers"); @@ -260,10 +260,10 @@ PersistenceEngine::listBuckets(BucketSpace bucketSpace, PartitionId id) const BucketIdListResult::List emptyList; return BucketIdListResult(emptyList); } - HandlerSnapshot::UP snap = getHandlerSnapshot(rguard, bucketSpace); + HandlerSnapshot snap = getHandlerSnapshot(rguard, bucketSpace); BucketIdListResultHandler resultHandler; - for (; snap->handlers().valid(); snap->handlers().next()) { - IPersistenceHandler *handler = snap->handlers().get(); + for (; snap.handlers().valid(); snap.handlers().next()) { + IPersistenceHandler *handler = snap.handlers().get(); handler->handleListBuckets(resultHandler); } return resultHandler.getResult(); @@ -275,10 +275,10 @@ PersistenceEngine::setClusterState(BucketSpace bucketSpace, const ClusterState & { std::shared_lock<std::shared_timed_mutex> rguard(_rwMutex); saveClusterState(bucketSpace, calc); - HandlerSnapshot::UP snap = getHandlerSnapshot(rguard, bucketSpace); - GenericResultHandler resultHandler(snap->size()); - for (; snap->handlers().valid(); snap->handlers().next()) { - IPersistenceHandler *handler = snap->handlers().get(); + HandlerSnapshot snap = getHandlerSnapshot(rguard, bucketSpace); + GenericResultHandler resultHandler(snap.size()); + for (; snap.handlers().valid(); snap.handlers().next()) { + IPersistenceHandler *handler = snap.handlers().get(); handler->handleSetClusterState(calc, resultHandler); } resultHandler.await(); @@ -292,10 +292,10 @@ PersistenceEngine::setActiveState(const Bucket& bucket, storage::spi::BucketInfo::ActiveState newState) { std::shared_lock<std::shared_timed_mutex> rguard(_rwMutex); - HandlerSnapshot::UP snap = getHandlerSnapshot(rguard, bucket.getBucketSpace()); - GenericResultHandler resultHandler(snap->size()); - for (; snap->handlers().valid(); snap->handlers().next()) { - IPersistenceHandler *handler = snap->handlers().get(); + HandlerSnapshot snap = getHandlerSnapshot(rguard, bucket.getBucketSpace()); + GenericResultHandler resultHandler(snap.size()); + for (; snap.handlers().valid(); snap.handlers().next()) { + IPersistenceHandler *handler = snap.handlers().get(); handler->handleSetActiveState(bucket, newState, resultHandler); } resultHandler.await(); @@ -309,10 +309,10 @@ PersistenceEngine::getBucketInfo(const Bucket& b) const // Runs in SPI thread. // No handover to write threads in persistence handlers. std::shared_lock<std::shared_timed_mutex> rguard(_rwMutex); - HandlerSnapshot::UP snap = getHandlerSnapshot(rguard, b.getBucketSpace()); + HandlerSnapshot snap = getHandlerSnapshot(rguard, b.getBucketSpace()); BucketInfoResultHandler resultHandler; - for (; snap->handlers().valid(); snap->handlers().next()) { - IPersistenceHandler *handler = snap->handlers().get(); + for (; snap.handlers().valid(); snap.handlers().next()) { + IPersistenceHandler *handler = snap.handlers().get(); handler->handleGetBucketInfo(b, resultHandler); } return resultHandler.getResult(); @@ -432,9 +432,9 @@ PersistenceEngine::GetResult PersistenceEngine::get(const Bucket& b, const document::FieldSet& fields, const DocumentId& did, Context& context) const { std::shared_lock<std::shared_timed_mutex> rguard(_rwMutex); - HandlerSnapshot::UP snapshot = getHandlerSnapshot(rguard, b.getBucketSpace()); + HandlerSnapshot snapshot = getHandlerSnapshot(rguard, b.getBucketSpace()); - for (PersistenceHandlerSequence & handlers = snapshot->handlers(); handlers.valid(); handlers.next()) { + for (PersistenceHandlerSequence & handlers = snapshot.handlers(); handlers.valid(); handlers.next()) { BucketGuard::UP bucket_guard = handlers.get()->lockBucket(b); IPersistenceHandler::RetrieversSP retrievers = handlers.get()->getDocumentRetrievers(context.getReadConsistency()); for (size_t i = 0; i < retrievers->size(); ++i) { @@ -462,19 +462,19 @@ PersistenceEngine::createIterator(const Bucket &bucket, const document::FieldSet IncludedVersions versions, Context & context) { std::shared_lock<std::shared_timed_mutex> rguard(_rwMutex); - HandlerSnapshot::UP snapshot = getHandlerSnapshot(rguard, bucket.getBucketSpace()); + HandlerSnapshot snapshot = getHandlerSnapshot(rguard, bucket.getBucketSpace()); auto entry = std::make_unique<IteratorEntry>(context.getReadConsistency(), bucket, fields, selection, versions, _defaultSerializedSize, _ignoreMaxBytes); - entry->bucket_guards.reserve(snapshot->size()); - for (PersistenceHandlerSequence & handlers = snapshot->handlers(); handlers.valid(); handlers.next()) { + entry->bucket_guards.reserve(snapshot.size()); + for (PersistenceHandlerSequence & handlers = snapshot.handlers(); handlers.valid(); handlers.next()) { entry->bucket_guards.push_back(handlers.get()->lockBucket(bucket)); IPersistenceHandler::RetrieversSP retrievers = handlers.get()->getDocumentRetrievers(context.getReadConsistency()); for (size_t i = 0; i < retrievers->size(); ++i) { entry->it.add((*retrievers)[i]); } } - entry->handler_sequence = HandlerSnapshot::release(std::move(*snapshot)); + entry->handler_sequence = HandlerSnapshot::release(std::move(snapshot)); std::lock_guard<std::mutex> guard(_iterators_lock); static IteratorId id_counter(0); @@ -541,10 +541,10 @@ PersistenceEngine::createBucket(const Bucket &b, Context &) { std::shared_lock<std::shared_timed_mutex> rguard(_rwMutex); LOG(spam, "createBucket(%s)", b.toString().c_str()); - HandlerSnapshot::UP snap = getHandlerSnapshot(rguard, b.getBucketSpace()); - TransportLatch latch(snap->size()); - for (; snap->handlers().valid(); snap->handlers().next()) { - IPersistenceHandler *handler = snap->handlers().get(); + HandlerSnapshot snap = getHandlerSnapshot(rguard, b.getBucketSpace()); + TransportLatch latch(snap.size()); + for (; snap.handlers().valid(); snap.handlers().next()) { + IPersistenceHandler *handler = snap.handlers().get(); handler->handleCreateBucket(feedtoken::make(latch), b); } latch.await(); @@ -557,10 +557,10 @@ PersistenceEngine::deleteBucket(const Bucket& b, Context&) { std::shared_lock<std::shared_timed_mutex> rguard(_rwMutex); LOG(spam, "deleteBucket(%s)", b.toString().c_str()); - HandlerSnapshot::UP snap = getHandlerSnapshot(rguard, b.getBucketSpace()); - TransportLatch latch(snap->size()); - for (; snap->handlers().valid(); snap->handlers().next()) { - IPersistenceHandler *handler = snap->handlers().get(); + HandlerSnapshot snap = getHandlerSnapshot(rguard, b.getBucketSpace()); + TransportLatch latch(snap.size()); + for (; snap.handlers().valid(); snap.handlers().next()) { + IPersistenceHandler *handler = snap.handlers().get(); handler->handleDeleteBucket(feedtoken::make(latch), b); } latch.await(); @@ -578,10 +578,10 @@ PersistenceEngine::getModifiedBuckets(BucketSpace bucketSpace) const std::lock_guard<std::mutex> guard(_lock); extraModifiedBuckets.swap(_extraModifiedBuckets[bucketSpace]); } - HandlerSnapshot::UP snap = getHandlerSnapshot(rguard, bucketSpace); - SynchronizedBucketIdListResultHandler resultHandler(snap->size() + extraModifiedBuckets.size()); - for (; snap->handlers().valid(); snap->handlers().next()) { - IPersistenceHandler *handler = snap->handlers().get(); + HandlerSnapshot snap = getHandlerSnapshot(rguard, bucketSpace); + SynchronizedBucketIdListResultHandler resultHandler(snap.size() + extraModifiedBuckets.size()); + for (; snap.handlers().valid(); snap.handlers().next()) { + IPersistenceHandler *handler = snap.handlers().get(); handler->handleGetModifiedBuckets(resultHandler); } for (const auto & item : extraModifiedBuckets) { @@ -599,10 +599,10 @@ PersistenceEngine::split(const Bucket& source, const Bucket& target1, const Buck LOG(spam, "split(%s, %s, %s)", source.toString().c_str(), target1.toString().c_str(), target2.toString().c_str()); assert(source.getBucketSpace() == target1.getBucketSpace()); assert(source.getBucketSpace() == target2.getBucketSpace()); - HandlerSnapshot::UP snap = getHandlerSnapshot(rguard, source.getBucketSpace()); - TransportLatch latch(snap->size()); - for (; snap->handlers().valid(); snap->handlers().next()) { - IPersistenceHandler *handler = snap->handlers().get(); + HandlerSnapshot snap = getHandlerSnapshot(rguard, source.getBucketSpace()); + TransportLatch latch(snap.size()); + for (; snap.handlers().valid(); snap.handlers().next()) { + IPersistenceHandler *handler = snap.handlers().get(); handler->handleSplit(feedtoken::make(latch), source, target1, target2); } latch.await(); @@ -617,10 +617,10 @@ PersistenceEngine::join(const Bucket& source1, const Bucket& source2, const Buck LOG(spam, "join(%s, %s, %s)", source1.toString().c_str(), source2.toString().c_str(), target.toString().c_str()); assert(source1.getBucketSpace() == target.getBucketSpace()); assert(source2.getBucketSpace() == target.getBucketSpace()); - HandlerSnapshot::UP snap = getHandlerSnapshot(rguard, target.getBucketSpace()); - TransportLatch latch(snap->size()); - for (; snap->handlers().valid(); snap->handlers().next()) { - IPersistenceHandler *handler = snap->handlers().get(); + HandlerSnapshot snap = getHandlerSnapshot(rguard, target.getBucketSpace()); + TransportLatch latch(snap.size()); + for (; snap.handlers().valid(); snap.handlers().next()) { + IPersistenceHandler *handler = snap.handlers().get(); handler->handleJoin(feedtoken::make(latch), source1, source2, target); } latch.await(); @@ -724,16 +724,16 @@ public: void PersistenceEngine::populateInitialBucketDB(const WriteGuard & guard, BucketSpace bucketSpace, IPersistenceHandler &targetHandler) { - HandlerSnapshot::UP snap = getHandlerSnapshot(guard, bucketSpace); + HandlerSnapshot snap = getHandlerSnapshot(guard, bucketSpace); - size_t snapSize(snap->size()); + size_t snapSize(snap.size()); size_t flawed = 0; // handleListActiveBuckets() runs in SPI thread. // No handover to write threads in persistence handlers. ActiveBucketIdListResultHandler resultHandler; - for (; snap->handlers().valid(); snap->handlers().next()) { - IPersistenceHandler *handler = snap->handlers().get(); + for (; snap.handlers().valid(); snap.handlers().next()) { + IPersistenceHandler *handler = snap.handlers().get(); handler->handleListActiveBuckets(resultHandler); } typedef std::map<document::BucketId, size_t> BucketIdMap; diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h index 3f2cf92acb7..a4a03f64db2 100644 --- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h +++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.h @@ -79,9 +79,9 @@ private: using WriteGuard = std::unique_lock<std::shared_timed_mutex>; IPersistenceHandler::SP getHandler(const ReadGuard & guard, document::BucketSpace bucketSpace, const DocTypeName &docType) const; - HandlerSnapshot::UP getHandlerSnapshot(const WriteGuard & guard) const; - HandlerSnapshot::UP getHandlerSnapshot(const ReadGuard & guard, document::BucketSpace bucketSpace) const; - HandlerSnapshot::UP getHandlerSnapshot(const WriteGuard & guard, document::BucketSpace bucketSpace) 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; void saveClusterState(BucketSpace bucketSpace, const ClusterState &calc); ClusterState::SP savedClusterState(BucketSpace bucketSpace) const; |