summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mongo/db/commands/dbcheck.cpp32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/mongo/db/commands/dbcheck.cpp b/src/mongo/db/commands/dbcheck.cpp
index 98f7d6ef9f7..1cd320d9860 100644
--- a/src/mongo/db/commands/dbcheck.cpp
+++ b/src/mongo/db/commands/dbcheck.cpp
@@ -198,9 +198,12 @@ protected:
tc.get()->setSystemOperationKillable(lk);
}
+ auto uniqueOpCtx = tc->makeOperationContext();
+ auto opCtx = uniqueOpCtx.get();
+
for (const auto& coll : *_run) {
try {
- _doCollection(coll);
+ _doCollection(opCtx, coll);
} catch (const DBException& e) {
auto logEntry = dbCheckErrorHealthLogEntry(
coll.nss, "dbCheck failed", OplogEntriesEnum::Batch, e.toStatus());
@@ -216,7 +219,7 @@ protected:
}
private:
- void _doCollection(const DbCheckCollectionInfo& info) {
+ void _doCollection(OperationContext* opCtx, const DbCheckCollectionInfo& info) {
// The collection was confirmed as existing in singleCollectionRun().
// runBatch() will handle the case of the collection having been dropped since then.
@@ -224,6 +227,18 @@ private:
return;
}
+ const std::string curOpMessage = "Scanning namespace " + info.nss.toString();
+ ProgressMeterHolder progress;
+ {
+ AutoGetCollection autoColl(opCtx, info.nss, MODE_IS);
+ auto coll = autoColl.getCollection();
+ if (coll) {
+ stdx::unique_lock<Client> lk(*opCtx->getClient());
+ progress.set(CurOp::get(opCtx)->setProgress_inlock(StringData(curOpMessage),
+ coll->numRecords(opCtx)));
+ }
+ }
+
// Parameters for the hasher.
auto start = info.start;
bool reachedEnd = false;
@@ -246,7 +261,8 @@ private:
docsInCurrentInterval = 0;
}
- auto result = _runBatch(info, start, info.maxDocsPerBatch, info.maxBytesPerBatch);
+ auto result =
+ _runBatch(opCtx, info, start, info.maxDocsPerBatch, info.maxBytesPerBatch);
if (_done) {
return;
@@ -306,6 +322,7 @@ private:
totalDocsSeen += stats.nDocs;
totalBytesSeen += stats.nBytes;
docsInCurrentInterval += stats.nDocs;
+ progress.get()->hit(stats.nDocs);
// Check if we've exceeded any limits.
bool reachedLast = stats.lastKey >= info.end;
@@ -321,6 +338,8 @@ private:
stdx::this_thread::sleep_for(timesExceeded * 1s - (Clock::now() - lastStart));
}
} while (!reachedEnd);
+
+ progress.finished();
}
/**
@@ -339,14 +358,11 @@ private:
std::string _dbName;
std::unique_ptr<DbCheckRun> _run;
- StatusWith<BatchStats> _runBatch(const DbCheckCollectionInfo& info,
+ StatusWith<BatchStats> _runBatch(OperationContext* opCtx,
+ const DbCheckCollectionInfo& info,
const BSONKey& first,
int64_t batchDocs,
int64_t batchBytes) {
- // New OperationContext for each batch.
- auto uniqueOpCtx = Client::getCurrent()->makeOperationContext();
- auto opCtx = uniqueOpCtx.get();
-
BatchStats result;
auto timeoutMs = Milliseconds(gDbCheckCollectionTryLockTimeoutMillis.load());
const auto initialBackoffMs =