mirror of https://gitee.com/bigwinds/arangodb
issue 485.1: reduce scope of lock in FlushFeature (#6943)
This commit is contained in:
parent
34d5afc734
commit
46ee6d94b0
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue