diff options
author | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2015-11-20 12:15:50 -0500 |
---|---|---|
committer | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2015-11-23 11:37:44 -0500 |
commit | 18f6662ca5e2ceabb38d69e3c5e99ee5b53ff4e4 (patch) | |
tree | 81760299409fb4bfdbdf77ea7fa86dea2bc28094 | |
parent | d91c4c047197a408628a09f89c2489380b0e1f77 (diff) | |
download | mongo-18f6662ca5e2ceabb38d69e3c5e99ee5b53ff4e4.tar.gz |
SERVER-21571 Do not leak ChunkManager object on error
-rw-r--r-- | src/mongo/s/config.cpp | 34 | ||||
-rw-r--r-- | src/mongo/s/config.h | 2 |
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 { |