summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Milkie <milkie@10gen.com>2013-01-22 11:43:52 -0500
committerEric Milkie <milkie@10gen.com>2013-01-22 11:43:52 -0500
commite351361ed10632a26ef8498e66014f746615b18d (patch)
tree1d6552c8dbd2caf5b7be058e5b00231897f263fd
parent8188ef72163de85f5a230e10e64a84c3fa606494 (diff)
downloadmongo-e351361ed10632a26ef8498e66014f746615b18d.tar.gz
SERVER-8266 fix deadlock between MongoFiles and DBRead lock
-rw-r--r--src/mongo/util/touch_pages.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/mongo/util/touch_pages.cpp b/src/mongo/util/touch_pages.cpp
index 8e2d3ffd7ad..19ef0f1853c 100644
--- a/src/mongo/util/touch_pages.cpp
+++ b/src/mongo/util/touch_pages.cpp
@@ -18,6 +18,7 @@
#include "mongo/util/touch_pages.h"
+#include <boost/scoped_ptr.h>
#include <fcntl.h>
#include <list>
#include <string>
@@ -39,9 +40,9 @@ namespace mongo {
void touchNs( const std::string& ns ) {
std::vector< touch_location > ranges;
- Client::ReadContext ctx(ns);
+ boost::scoped_ptr<LockMongoFilesShared> mongoFilesLock;
{
-
+ Client::ReadContext ctx(ns);
NamespaceDetails *nsd = nsdetails(ns);
uassert( 16154, "namespace does not exist", nsd );
@@ -56,10 +57,10 @@ namespace mongo {
ranges.push_back(tl);
}
-
+ mongoFilesLock.reset(new LockMongoFilesShared());
}
- LockMongoFilesShared lk;
- Lock::TempRelease tr;
+ // DB read lock is dropped; no longer needed after this point.
+
std::string progress_msg = "touch " + ns + " extents";
ProgressMeterHolder pm(cc().curop()->setMessage(progress_msg.c_str(),
"Touch Progress",