diff options
author | Jamie Heppenstall <jamie.heppenstall@mongodb.com> | 2020-05-12 15:51:19 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-05-14 13:45:36 +0000 |
commit | c6f6dc29665d8609f040c66c7107c270b813bc95 (patch) | |
tree | 7fba922c8919df1316fa5e1b1034395722d05925 | |
parent | a43435615c07d5174054cbdef1796f4c568c20ab (diff) | |
download | mongo-c6f6dc29665d8609f040c66c7107c270b813bc95.tar.gz |
SERVER-45570 Add a ProgressMeter to the index build startup recovery code path
-rw-r--r-- | src/mongo/db/catalog/index_builds_manager.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/mongo/db/catalog/index_builds_manager.cpp b/src/mongo/db/catalog/index_builds_manager.cpp index f828df4106d..7614e02c465 100644 --- a/src/mongo/db/catalog/index_builds_manager.cpp +++ b/src/mongo/db/catalog/index_builds_manager.cpp @@ -43,6 +43,7 @@ #include "mongo/db/storage/write_unit_of_work.h" #include "mongo/logv2/log.h" #include "mongo/util/assert_util.h" +#include "mongo/util/progress_meter.h" #include "mongo/util/str.h" namespace mongo { @@ -145,6 +146,14 @@ StatusWith<std::pair<long long, long long>> IndexBuildsManager::startBuildingInd long long numRecords = 0; long long dataSize = 0; + const char* curopMessage = "Index Build: scanning collection"; + ProgressMeterHolder progressMeter; + { + stdx::unique_lock<Client> lk(*opCtx->getClient()); + progressMeter.set( + CurOp::get(opCtx)->setProgress_inlock(curopMessage, coll->numRecords(opCtx))); + } + auto cursor = rs->getCursor(opCtx); auto record = cursor->next(); while (record) { @@ -177,6 +186,9 @@ StatusWith<std::pair<long long, long long>> IndexBuildsManager::startBuildingInd "id"_attr = id, "error"_attr = redact(validStatus)); rs->deleteRecord(opCtx, id); + // Must reduce the progress meter's expected total after deleting an invalid + // document from the collection. + progressMeter->setTotalWhileRunning(coll->numRecords(opCtx)); } else { numRecords++; dataSize += data.size(); @@ -184,6 +196,7 @@ StatusWith<std::pair<long long, long long>> IndexBuildsManager::startBuildingInd if (!insertStatus.isOK()) { return insertStatus; } + progressMeter.hit(); } record = cursor->next(); } @@ -207,6 +220,8 @@ StatusWith<std::pair<long long, long long>> IndexBuildsManager::startBuildingInd } } + progressMeter.finished(); + Status status = builder->dumpInsertsFromBulk(opCtx); if (!status.isOK()) { return status; |