diff options
-rw-r--r-- | src/mongo/db/collection_index_builds_tracker.cpp | 26 | ||||
-rw-r--r-- | src/mongo/db/collection_index_builds_tracker.h | 19 |
2 files changed, 37 insertions, 8 deletions
diff --git a/src/mongo/db/collection_index_builds_tracker.cpp b/src/mongo/db/collection_index_builds_tracker.cpp index 677aa17fa3a..2c81c638d62 100644 --- a/src/mongo/db/collection_index_builds_tracker.cpp +++ b/src/mongo/db/collection_index_builds_tracker.cpp @@ -68,9 +68,7 @@ void CollectionIndexBuildsTracker::removeIndexBuild( _buildStateByIndexName.erase(indexName); } - if (_buildStateByBuildUUID.empty()) { - _noIndexBuildsRemainCondVar.notify_all(); - } + _indexBuildFinishedCondVar.notify_all(); } std::shared_ptr<ReplIndexBuildState> CollectionIndexBuildsTracker::getIndexBuildState( @@ -88,6 +86,14 @@ bool CollectionIndexBuildsTracker::hasIndexBuildState(WithLock, StringData index return true; } +std::vector<UUID> CollectionIndexBuildsTracker::getIndexBuildUUIDs(WithLock) const { + std::vector<UUID> buildUUIDs; + for (const auto& state : _buildStateByBuildUUID) { + buildUUIDs.push_back(state.first); + } + return buildUUIDs; +} + void CollectionIndexBuildsTracker::runOperationOnAllBuilds( WithLock lk, IndexBuildsManager* indexBuildsManager, @@ -106,7 +112,7 @@ int CollectionIndexBuildsTracker::getNumberOfIndexBuilds(WithLock) const { } void CollectionIndexBuildsTracker::waitUntilNoIndexBuildsRemain(stdx::unique_lock<Latch>& lk) { - _noIndexBuildsRemainCondVar.wait(lk, [&] { + _indexBuildFinishedCondVar.wait(lk, [&] { if (_buildStateByBuildUUID.empty()) { return true; } @@ -122,4 +128,16 @@ void CollectionIndexBuildsTracker::waitUntilNoIndexBuildsRemain(stdx::unique_loc }); } +void CollectionIndexBuildsTracker::waitUntilIndexBuildFinished(stdx::unique_lock<Latch>& lk, + const UUID& buildUUID) { + log() << "Waiting until index build with UUID " << buildUUID << " is finished"; + + _indexBuildFinishedCondVar.wait(lk, [&] { + if (_buildStateByBuildUUID.find(buildUUID) == _buildStateByBuildUUID.end()) { + return true; + } + return false; + }); +} + } // namespace mongo diff --git a/src/mongo/db/collection_index_builds_tracker.h b/src/mongo/db/collection_index_builds_tracker.h index 81c25fe73d3..234e6ccfcb5 100644 --- a/src/mongo/db/collection_index_builds_tracker.h +++ b/src/mongo/db/collection_index_builds_tracker.h @@ -49,7 +49,9 @@ class IndexBuildsManager; * The owner of a CollectionIndexBuildsTracker instance must instantiate a mutex to use along with * the data structure to ensure it remains consistent across single or multiple function accesses. * - * This is intended to only be used by the IndexBuildsCoordinator class. + * This is intended to only be used by the IndexBuildsCoordinator class. Functions expecting a lock + * to be passed in as a parameter require an already locked IndexBuildsCoordinator::_mutex in this + * case. */ class CollectionIndexBuildsTracker { CollectionIndexBuildsTracker(const CollectionIndexBuildsTracker&) = delete; @@ -73,6 +75,8 @@ public: bool hasIndexBuildState(WithLock, StringData indexName) const; + std::vector<UUID> getIndexBuildUUIDs(WithLock) const; + /** * Runs the provided function operation on all this collection's index builds * @@ -98,15 +102,22 @@ public: */ void waitUntilNoIndexBuildsRemain(stdx::unique_lock<Latch>& lk); + /** + * Returns when the index build with the given build UUID is no longer active. When the build + * UUID does not correspond to an active index build, returns immediately. + */ + void waitUntilIndexBuildFinished(stdx::unique_lock<Latch>& lk, const UUID& buildUUID); + private: // Maps of index build states on the collection, by build UUID and index name. stdx::unordered_map<UUID, std::shared_ptr<ReplIndexBuildState>, UUID::Hash> _buildStateByBuildUUID; stdx::unordered_map<std::string, std::shared_ptr<ReplIndexBuildState>> _buildStateByIndexName; - // Condition variable that is signaled when there are no active index builds remaining on the - // collection. - stdx::condition_variable _noIndexBuildsRemainCondVar; + // Condition variable that is signaled when an index build has finished on the collection. The + // accompanying mutex for this condition variable comes from the owner managing this class + // instance. + stdx::condition_variable _indexBuildFinishedCondVar; }; } // namespace mongo |