diff options
author | David Hows <howsdav@gmail.com> | 2016-05-26 11:19:09 +1000 |
---|---|---|
committer | David Hows <howsdav@gmail.com> | 2016-06-24 12:27:17 +1000 |
commit | ba5fe233b5915d535a7b73da911b6b9fe132c035 (patch) | |
tree | 2c02b035a4baec74d1cff745971608849971d710 | |
parent | 26f52430045628626deef0bfc0444dd3f2c45c3a (diff) | |
download | mongo-ba5fe233b5915d535a7b73da911b6b9fe132c035.tar.gz |
SERVER-24194 - Backport, change the dropAllQueued loop to avoid duplicating work over many threads
3 files changed, 36 insertions, 36 deletions
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp index 23db7e6b14a..26406288303 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp @@ -532,8 +532,8 @@ bool WiredTigerKVEngine::_drop(StringData ident) { WiredTigerSession session(_conn); - int ret = - session.getSession()->drop(session.getSession(), uri.c_str(), "force,lock_wait=false"); + int ret = session.getSession()->drop( + session.getSession(), uri.c_str(), "force,checkpoint_wait=false"); LOG(1) << "WT drop of " << uri << " res " << ret; if (ret == 0) { @@ -545,7 +545,7 @@ bool WiredTigerKVEngine::_drop(StringData ident) { // this is expected, queue it up { stdx::lock_guard<stdx::mutex> lk(_identToDropMutex); - _identToDrop.insert(uri); + _identToDrop.push(uri); } _sessionCache->closeAll(); return false; @@ -565,7 +565,7 @@ bool WiredTigerKVEngine::haveDropsQueued() const { } // We only want to check the queue max once per second or we'll thrash - // This is done in haveDropsQueued, not dropAllQueued so we skip the mutex + // This is done in haveDropsQueued, not dropSomeQueuedIdents so we skip the mutex if (delta < Milliseconds(1000)) return false; @@ -574,41 +574,40 @@ bool WiredTigerKVEngine::haveDropsQueued() const { return !_identToDrop.empty(); } -void WiredTigerKVEngine::dropAllQueued() { - set<string> mine; - { - stdx::lock_guard<stdx::mutex> lk(_identToDropMutex); - mine = _identToDrop; - } +void WiredTigerKVEngine::dropSomeQueuedIdents() { + int numInQueue; - set<string> deleted; + WiredTigerSession session(_conn); { - WiredTigerSession session(_conn); - for (set<string>::const_iterator it = mine.begin(); it != mine.end(); ++it) { - string uri = *it; - int ret = session.getSession()->drop( - session.getSession(), uri.c_str(), "force,lock_wait=false"); - LOG(1) << "WT queued drop of " << uri << " res " << ret; - - if (ret == 0) { - deleted.insert(uri); - continue; - } + stdx::lock_guard<stdx::mutex> lk(_identToDropMutex); + numInQueue = _identToDrop.size(); + } - if (ret == EBUSY) { - // leave in qeuue - continue; - } + int numToDelete = 10; + int tenPercentQueue = numInQueue * 0.1; + if (tenPercentQueue > 10) + numToDelete = tenPercentQueue; - invariantWTOK(ret); + LOG(1) << "WT Queue is: " << numInQueue << " attempting to drop: " << numToDelete << " tables"; + for (int i = 0; i < numToDelete; i++) { + string uri; + { + stdx::lock_guard<stdx::mutex> lk(_identToDropMutex); + if (_identToDrop.empty()) + break; + uri = _identToDrop.front(); + _identToDrop.pop(); } - } + int ret = session.getSession()->drop( + session.getSession(), uri.c_str(), "force,checkpoint_wait=false"); + LOG(1) << "WT queued drop of " << uri << " res " << ret; - { - stdx::lock_guard<stdx::mutex> lk(_identToDropMutex); - for (set<string>::const_iterator it = deleted.begin(); it != deleted.end(); ++it) { - _identToDrop.erase(*it); + if (ret == EBUSY) { + stdx::lock_guard<stdx::mutex> lk(_identToDropMutex); + _identToDrop.push(uri); + } else { + invariantWTOK(ret); } } } diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h index 9028970123b..8c5a54f6bb4 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h @@ -31,7 +31,7 @@ #pragma once -#include <set> +#include <queue> #include <string> #include <wiredtiger.h> @@ -132,7 +132,7 @@ public: WT_CONNECTION* getConnection() { return _conn; } - void dropAllQueued(); + void dropSomeQueuedIdents(); bool haveDropsQueued() const; void syncSizeInfo(bool sync) const; @@ -175,8 +175,9 @@ private: std::string _rsOptions; std::string _indexOptions; + mutable stdx::mutex _dropAllQueuesMutex; mutable stdx::mutex _identToDropMutex; - std::set<std::string> _identToDrop; + std::queue<std::string> _identToDrop; mutable Date_t _previousCheckedDropsQueued; diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp index 6f27a7bb6d9..6619ce01865 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp @@ -288,7 +288,7 @@ void WiredTigerSessionCache::releaseSession(WiredTigerSession* session) { delete session; if (_engine && _engine->haveDropsQueued()) - _engine->dropAllQueued(); + _engine->dropSomeQueuedIdents(); } void WiredTigerSessionCache::setJournalListener(JournalListener* jl) { |