summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Hows <howsdav@gmail.com>2016-05-26 11:19:09 +1000
committerDavid Hows <howsdav@gmail.com>2016-06-24 12:27:17 +1000
commitba5fe233b5915d535a7b73da911b6b9fe132c035 (patch)
tree2c02b035a4baec74d1cff745971608849971d710
parent26f52430045628626deef0bfc0444dd3f2c45c3a (diff)
downloadmongo-ba5fe233b5915d535a7b73da911b6b9fe132c035.tar.gz
SERVER-24194 - Backport, change the dropAllQueued loop to avoid duplicating work over many threads
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp63
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h7
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp2
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) {