1
0
Fork 0

issue 485.1: reduce scope of lock in FlushFeature (#6943)

This commit is contained in:
Vasiliy 2018-10-17 14:33:48 +03:00 committed by Andrey Abramov
parent 34d5afc734
commit 46ee6d94b0
2 changed files with 36 additions and 12 deletions

View File

@ -2037,11 +2037,33 @@ void IResearchView::registerFlushCallback() {
return; return;
} }
flush->registerCallback(this, [this]() noexcept { auto viewSelf = self();
return IResearchView::FlushTransactionPtr(
this, flush->registerCallback(this, [viewSelf]() noexcept {
[](arangodb::FlushTransaction*){} // empty deleter static struct NoopFlushTransaction: arangodb::FlushTransaction {
NoopFlushTransaction(): FlushTransaction("ArangoSearchNoop") {}
virtual arangodb::Result commit() override {
return arangodb::Result(TRI_ERROR_ARANGO_DATA_SOURCE_NOT_FOUND);
}
} noopFlushTransaction;
SCOPED_LOCK_NAMED(viewSelf->mutex(), lock);
if (!*viewSelf) {
return arangodb::FlushFeature::FlushTransactionPtr(
&noopFlushTransaction, [](arangodb::FlushTransaction*)->void {}
);
}
auto trx = arangodb::FlushFeature::FlushTransactionPtr(
viewSelf->get(),
[](arangodb::FlushTransaction* trx)->void {
ADOPT_SCOPED_LOCK_NAMED(static_cast<IResearchView*>(trx)->self()->mutex(), lock);
}
); );
lock.release(); // unlocked in distructor above
return trx;
}); });
// noexcept // noexcept

View File

@ -154,15 +154,17 @@ bool FlushFeature::unregisterCallback(void* ptr) {
void FlushFeature::executeCallbacks() { void FlushFeature::executeCallbacks() {
std::vector<FlushTransactionPtr> transactions; std::vector<FlushTransactionPtr> transactions;
READ_LOCKER(locker, _callbacksLock); {
transactions.reserve(_callbacks.size()); READ_LOCKER(locker, _callbacksLock);
transactions.reserve(_callbacks.size());
// execute all callbacks. this will create as many transactions as // execute all callbacks. this will create as many transactions as
// there are callbacks // there are callbacks
for (auto const& cb : _callbacks) { for (auto const& cb: _callbacks) {
// copy elision, std::move(..) not required // copy elision, std::move(..) not required
LOG_TOPIC(TRACE, arangodb::Logger::FLUSH) << "executing flush callback"; LOG_TOPIC(TRACE, arangodb::Logger::FLUSH) << "executing flush callback";
transactions.emplace_back(cb.second()); transactions.emplace_back(cb.second());
}
} }
// TODO: make sure all data is synced // TODO: make sure all data is synced