summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Heppenstall <jamie.heppenstall@mongodb.com>2020-05-12 15:51:19 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-05-14 13:45:36 +0000
commitc6f6dc29665d8609f040c66c7107c270b813bc95 (patch)
tree7fba922c8919df1316fa5e1b1034395722d05925
parenta43435615c07d5174054cbdef1796f4c568c20ab (diff)
downloadmongo-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.cpp15
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;