summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaloian Manassiev <kaloian.manassiev@mongodb.com>2015-11-20 12:15:50 -0500
committerKaloian Manassiev <kaloian.manassiev@mongodb.com>2015-11-23 11:37:44 -0500
commit18f6662ca5e2ceabb38d69e3c5e99ee5b53ff4e4 (patch)
tree81760299409fb4bfdbdf77ea7fa86dea2bc28094
parentd91c4c047197a408628a09f89c2489380b0e1f77 (diff)
downloadmongo-18f6662ca5e2ceabb38d69e3c5e99ee5b53ff4e4.tar.gz
SERVER-21571 Do not leak ChunkManager object on error
-rw-r--r--src/mongo/s/config.cpp34
-rw-r--r--src/mongo/s/config.h2
2 files changed, 15 insertions, 21 deletions
diff --git a/src/mongo/s/config.cpp b/src/mongo/s/config.cpp
index 4566aeb0db8..f8b2076b96d 100644
--- a/src/mongo/s/config.cpp
+++ b/src/mongo/s/config.cpp
@@ -67,34 +67,30 @@ CollectionInfo::CollectionInfo(OperationContext* txn,
: _configOpTime(std::move(opTime)) {
_dropped = coll.getDropped();
- shard(txn, new ChunkManager(coll));
- _dirty = false;
-}
-
-CollectionInfo::~CollectionInfo() {}
-
-void CollectionInfo::resetCM(ChunkManager* cm) {
- invariant(cm);
- invariant(_cm);
-
- _cm.reset(cm);
-}
-
-void CollectionInfo::shard(OperationContext* txn, ChunkManager* manager) {
// Do this *first* so we're invisible to everyone else
+ std::unique_ptr<ChunkManager> manager(stdx::make_unique<ChunkManager>(coll));
manager->loadExistingRanges(txn, nullptr);
- // Collections with no chunks are unsharded, no matter what the collections entry says
- // This helps prevent errors when dropping in a different process
- //
-
+ // Collections with no chunks are unsharded, no matter what the collections entry says. This
+ // helps prevent errors when dropping in a different process.
if (manager->numChunks() != 0) {
- useChunkManager(ChunkManagerPtr(manager));
+ useChunkManager(std::move(manager));
} else {
warning() << "no chunks found for collection " << manager->getns()
<< ", assuming unsharded";
unshard();
}
+
+ _dirty = false;
+}
+
+CollectionInfo::~CollectionInfo() = default;
+
+void CollectionInfo::resetCM(ChunkManager* cm) {
+ invariant(cm);
+ invariant(_cm);
+
+ _cm.reset(cm);
}
void CollectionInfo::unshard() {
diff --git a/src/mongo/s/config.h b/src/mongo/s/config.h
index 4eb80b3001d..ad179958c91 100644
--- a/src/mongo/s/config.h
+++ b/src/mongo/s/config.h
@@ -62,8 +62,6 @@ struct CollectionInfo {
void resetCM(ChunkManager* cm);
- void shard(OperationContext* txn, ChunkManager* cm);
-
void unshard();
bool isDirty() const {