diff options
Diffstat (limited to 'searchcore')
4 files changed, 37 insertions, 69 deletions
diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_change_handler/gid_to_lid_change_handler_test.cpp b/searchcore/src/tests/proton/reference/gid_to_lid_change_handler/gid_to_lid_change_handler_test.cpp index eb2052ef32f..2528834e898 100644 --- a/searchcore/src/tests/proton/reference/gid_to_lid_change_handler/gid_to_lid_change_handler_test.cpp +++ b/searchcore/src/tests/proton/reference/gid_to_lid_change_handler/gid_to_lid_change_handler_test.cpp @@ -99,16 +99,12 @@ public: struct Fixture { - vespalib::ThreadStackExecutor _masterExecutor; - ExecutorThreadService _master; std::vector<std::shared_ptr<ListenerStats>> _statss; std::shared_ptr<GidToLidChangeHandler> _handler; Fixture() - : _masterExecutor(1, 128 * 1024), - _master(_masterExecutor), - _statss(), - _handler(std::make_shared<GidToLidChangeHandler>(&_master)) + : _statss(), + _handler(std::make_shared<GidToLidChangeHandler>()) { } @@ -119,8 +115,7 @@ struct Fixture void close() { - _master.execute(makeLambdaTask([this]() { _handler->close(); })); - _master.sync(); + _handler->close(); } ListenerStats &addStats() { @@ -130,18 +125,15 @@ struct Fixture void addListener(std::unique_ptr<IGidToLidChangeListener> listener) { _handler->addListener(std::move(listener)); - _master.sync(); } void notifyGidToLidChange(GlobalId gid, uint32_t lid) { - _master.execute(makeLambdaTask([this, gid, lid]() { _handler->notifyGidToLidChange(gid, lid); })); - _master.sync(); + _handler->notifyGidToLidChange(gid, lid); } void removeListeners(const vespalib::string &docTypeName, const std::set<vespalib::string> &keepNames) { _handler->removeListeners(docTypeName, keepNames); - _master.sync(); } }; diff --git a/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_change_handler.cpp b/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_change_handler.cpp index e7b347c4c80..5992999bd69 100644 --- a/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_change_handler.cpp +++ b/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_change_handler.cpp @@ -12,23 +12,24 @@ using search::makeLambdaTask; namespace proton { -GidToLidChangeHandler::GidToLidChangeHandler(searchcorespi::index::IThreadService *master) +GidToLidChangeHandler::GidToLidChangeHandler() : _lock(), _listeners(), - _master(master) + _closed(false) { } GidToLidChangeHandler::~GidToLidChangeHandler() { - assert(_master == nullptr); + assert(_closed); assert(_listeners.empty()); } void GidToLidChangeHandler::notifyGidToLidChange(document::GlobalId gid, uint32_t lid) { + lock_guard guard(_lock); for (const auto &listener : _listeners) { listener->notifyGidToLidChange(gid, lid); } @@ -37,11 +38,11 @@ GidToLidChangeHandler::notifyGidToLidChange(document::GlobalId gid, uint32_t lid void GidToLidChangeHandler::close() { - lock_guard guard(_lock); - if (_master != nullptr) { - assert(_master->isCurrentThread()); - _master = nullptr; - _listeners.clear(); + Listeners deferredDelete; + { + lock_guard guard(_lock); + _closed = true; + _listeners.swap(deferredDelete); } } @@ -49,20 +50,7 @@ void GidToLidChangeHandler::addListener(std::unique_ptr<IGidToLidChangeListener> listener) { lock_guard guard(_lock); - if (_master) { - auto self(shared_from_this()); - _master->execute(makeLambdaTask([self,listener(std::move(listener))]() mutable { self->performAddListener(std::move(listener)); })); - } else { - assert(_listeners.empty()); - } -} - - -void -GidToLidChangeHandler::performAddListener(std::unique_ptr<IGidToLidChangeListener> listener) -{ - lock_guard guard(_lock); - if (_master) { + if (!_closed) { const vespalib::string &docTypeName = listener->getDocTypeName(); const vespalib::string &name = listener->getName(); for (const auto &oldlistener : _listeners) { @@ -77,19 +65,6 @@ GidToLidChangeHandler::performAddListener(std::unique_ptr<IGidToLidChangeListene } } -void -GidToLidChangeHandler::removeListeners(const vespalib::string &docTypeName, - const std::set<vespalib::string> &keepNames) -{ - lock_guard guard(_lock); - if (_master) { - auto self(shared_from_this()); - _master->execute(makeLambdaTask([self,docTypeName,keepNames]() mutable { self->performRemoveListener(docTypeName, keepNames); })); - } else { - assert(_listeners.empty()); - } -} - namespace { bool shouldRemoveListener(const IGidToLidChangeListener &listener, @@ -103,21 +78,25 @@ bool shouldRemoveListener(const IGidToLidChangeListener &listener, } void -GidToLidChangeHandler::performRemoveListener(const vespalib::string &docTypeName, - const std::set<vespalib::string> &keepNames) +GidToLidChangeHandler::removeListeners(const vespalib::string &docTypeName, + const std::set<vespalib::string> &keepNames) { - lock_guard guard(_lock); - if (_master) { - auto itr = _listeners.begin(); - while (itr != _listeners.end()) { - if (shouldRemoveListener(**itr, docTypeName, keepNames)) { - itr = _listeners.erase(itr); - } else { - ++itr; + Listeners deferredDelete; + { + lock_guard guard(_lock); + if (!_closed) { + auto itr = _listeners.begin(); + while (itr != _listeners.end()) { + if (shouldRemoveListener(**itr, docTypeName, keepNames)) { + deferredDelete.emplace_back(std::move(*itr)); + itr = _listeners.erase(itr); + } else { + ++itr; + } } + } else { + assert(_listeners.empty()); } - } else { - assert(_listeners.empty()); } } diff --git a/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_change_handler.h b/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_change_handler.h index 2197490b65e..8a569ed1c95 100644 --- a/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_change_handler.h +++ b/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_change_handler.h @@ -19,25 +19,22 @@ class GidToLidChangeHandler : public std::enable_shared_from_this<GidToLidChange public IGidToLidChangeHandler { using lock_guard = std::lock_guard<std::mutex>; + using Listeners = std::vector<std::unique_ptr<IGidToLidChangeListener>>; std::mutex _lock; - std::vector<std::unique_ptr<IGidToLidChangeListener>> _listeners; - searchcorespi::index::IThreadService *_master; + Listeners _listeners; + bool _closed; - void performAddListener(std::unique_ptr<IGidToLidChangeListener> listener); - void performRemoveListener(const vespalib::string &docTypeName, - const std::set<vespalib::string> &keepNames); public: - GidToLidChangeHandler(searchcorespi::index::IThreadService *master); + GidToLidChangeHandler(); virtual ~GidToLidChangeHandler(); /** - * Notify gid to lid mapping change. Called by master executor. + * Notify gid to lid mapping change. */ virtual void notifyGidToLidChange(document::GlobalId gid, uint32_t lid) override; /** - * Close handler, further notifications are blocked. Called by master - * executor. + * Close handler, further notifications are blocked. */ void close(); diff --git a/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp b/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp index 8eb36435ed5..e9e0120dac1 100644 --- a/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp @@ -49,7 +49,7 @@ SearchableDocSubDB::SearchableDocSubDB(const Config &cfg, const Context &ctx) getSubDbName(), ctx._fastUpdCtx._storeOnlyCtx._owner.getDistributionKey()), _numSearcherThreads(cfg._numSearcherThreads), _warmupExecutor(ctx._warmupExecutor), - _gidToLidChangeHandler(std::make_shared<GidToLidChangeHandler>(&_writeService.master())) + _gidToLidChangeHandler(std::make_shared<GidToLidChangeHandler>()) { } SearchableDocSubDB::~SearchableDocSubDB() |