aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@oath.com>2017-08-29 13:45:04 +0000
committerTor Egge <Tor.Egge@oath.com>2017-08-30 08:36:24 +0000
commitfa4b4ca55043c721cd752784202664d341c8d406 (patch)
treea6f75ba85918173a589e9d6a68245afb1ccd917e
parentc1a93692a89586ea6ed51e682cf18f9eafe7d89b (diff)
Prepare for gid to lid change notifications coming from different
threads.
-rw-r--r--searchcore/src/tests/proton/reference/gid_to_lid_change_handler/gid_to_lid_change_handler_test.cpp16
-rw-r--r--searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_change_handler.cpp73
-rw-r--r--searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_change_handler.h15
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp2
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()