summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authorLingzhi Deng <lingzhi.deng@mongodb.com>2019-10-03 01:50:48 +0000
committerevergreen <evergreen@mongodb.com>2019-10-03 01:50:48 +0000
commitef5c6b85dd873b69a12d919932e54c7b6711b14d (patch)
treea6294552175df0dc291a3a19f40d004f4b7f6141 /src/mongo/db
parent14b7efe1c6b5a00eac88e12c42ad31730db18fec (diff)
downloadmongo-ef5c6b85dd873b69a12d919932e54c7b6711b14d.tar.gz
SERVER-43252: Only compute WriteConcernResult.writtenTo for CmdGetLastError
Diffstat (limited to 'src/mongo/db')
-rw-r--r--src/mongo/db/commands/get_last_error.cpp12
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl.cpp2
-rw-r--r--src/mongo/db/s/chunk_move_write_concern_options.cpp2
-rw-r--r--src/mongo/db/s/migration_destination_manager.cpp2
-rw-r--r--src/mongo/db/write_concern.cpp7
-rw-r--r--src/mongo/db/write_concern_options.cpp2
-rw-r--r--src/mongo/db/write_concern_options.h2
7 files changed, 18 insertions, 11 deletions
diff --git a/src/mongo/db/commands/get_last_error.cpp b/src/mongo/db/commands/get_last_error.cpp
index 1834aa60e63..2de7f05f169 100644
--- a/src/mongo/db/commands/get_last_error.cpp
+++ b/src/mongo/db/commands/get_last_error.cpp
@@ -279,6 +279,18 @@ public:
WriteConcernResult wcResult;
status = waitForWriteConcern(opCtx, lastOpTime, writeConcern, &wcResult);
+ // getLastError command returns a document that contains the writtenTo array. So we compute
+ // the writtenTo array here if we have waited for replication before. The call to
+ // getHostsWrittenTo needs to lock the ReplicationCoordinator mutex to guard against
+ // topology changes. Thus, we only compute this array here for the getLastError command
+ // (instead of in waitForWriteConcern for every single write) to avoid a serialization point
+ // for all writes.
+ if (!lastOpTime.isNull() && writeConcern.needToWaitForOtherNodes()) {
+ wcResult.writtenTo = replCoord->getHostsWrittenTo(
+ lastOpTime,
+ replCoord->populateUnsetWriteConcernOptionsSyncMode(writeConcern).syncMode ==
+ WriteConcernOptions::SyncMode::JOURNAL);
+ }
wcResult.appendTo(writeConcern, &result);
// For backward compatibility with 2.4, wtimeout returns ok : 1.0
diff --git a/src/mongo/db/repl/replication_coordinator_impl.cpp b/src/mongo/db/repl/replication_coordinator_impl.cpp
index 03e4e7d74cb..90a7900bd4f 100644
--- a/src/mongo/db/repl/replication_coordinator_impl.cpp
+++ b/src/mongo/db/repl/replication_coordinator_impl.cpp
@@ -1758,7 +1758,7 @@ SharedSemiFuture<void> ReplicationCoordinatorImpl::_startWaitingForReplication(
return Future<void>::makeReady(e.toStatus());
}
- if (!writeConcern.shouldWaitForOtherNodes() &&
+ if (!writeConcern.needToWaitForOtherNodes() &&
writeConcern.syncMode != WriteConcernOptions::SyncMode::JOURNAL) {
// We are only waiting for our own lastApplied, add this to _opTimeWaiterList instead. This
// is because waiters in _replicationWaiterList are not notified on self's lastApplied
diff --git a/src/mongo/db/s/chunk_move_write_concern_options.cpp b/src/mongo/db/s/chunk_move_write_concern_options.cpp
index 4eb662043cb..66966957437 100644
--- a/src/mongo/db/s/chunk_move_write_concern_options.cpp
+++ b/src/mongo/db/s/chunk_move_write_concern_options.cpp
@@ -96,7 +96,7 @@ StatusWith<WriteConcernOptions> ChunkMoveWriteConcernOptions::getEffectiveWriteC
writeConcern = getDefaultWriteConcernForMigration(opCtx);
}
- if (writeConcern.shouldWaitForOtherNodes() &&
+ if (writeConcern.needToWaitForOtherNodes() &&
writeConcern.wTimeout == WriteConcernOptions::kNoTimeout) {
// Don't allow no timeout
writeConcern.wTimeout = durationCount<Milliseconds>(kDefaultWriteTimeoutForMigration);
diff --git a/src/mongo/db/s/migration_destination_manager.cpp b/src/mongo/db/s/migration_destination_manager.cpp
index c8817889615..946e6575468 100644
--- a/src/mongo/db/s/migration_destination_manager.cpp
+++ b/src/mongo/db/s/migration_destination_manager.cpp
@@ -852,7 +852,7 @@ void MigrationDestinationManager::_migrateDriver(OperationContext* opCtx) {
batchNumCloned);
_clonedBytes += batchClonedBytes;
}
- if (_writeConcern.shouldWaitForOtherNodes()) {
+ if (_writeConcern.needToWaitForOtherNodes()) {
repl::ReplicationCoordinator::StatusAndDuration replStatus =
repl::ReplicationCoordinator::get(opCtx)->awaitReplication(
opCtx,
diff --git a/src/mongo/db/write_concern.cpp b/src/mongo/db/write_concern.cpp
index a1ea9c5bf92..70b9e22dbb3 100644
--- a/src/mongo/db/write_concern.cpp
+++ b/src/mongo/db/write_concern.cpp
@@ -218,8 +218,7 @@ Status waitForWriteConcern(OperationContext* opCtx,
}
// needed to avoid incrementing gleWtimeStats SERVER-9005
- if (writeConcernWithPopulatedSyncMode.wNumNodes <= 1 &&
- writeConcernWithPopulatedSyncMode.wMode.empty()) {
+ if (!writeConcernWithPopulatedSyncMode.needToWaitForOtherNodes()) {
// no desired replication check
return Status::OK();
}
@@ -233,10 +232,6 @@ Status waitForWriteConcern(OperationContext* opCtx,
result->wTimedOut = true;
}
- // Add stats
- result->writtenTo = replCoord->getHostsWrittenTo(replOpTime,
- writeConcernWithPopulatedSyncMode.syncMode ==
- WriteConcernOptions::SyncMode::JOURNAL);
gleWtimeStats.recordMillis(durationCount<Milliseconds>(replStatus.duration));
result->wTime = durationCount<Milliseconds>(replStatus.duration);
diff --git a/src/mongo/db/write_concern_options.cpp b/src/mongo/db/write_concern_options.cpp
index d92dbfed25c..1ad40acebfd 100644
--- a/src/mongo/db/write_concern_options.cpp
+++ b/src/mongo/db/write_concern_options.cpp
@@ -242,7 +242,7 @@ BSONObj WriteConcernOptions::toBSON() const {
return builder.obj();
}
-bool WriteConcernOptions::shouldWaitForOtherNodes() const {
+bool WriteConcernOptions::needToWaitForOtherNodes() const {
return !wMode.empty() || wNumNodes > 1;
}
diff --git a/src/mongo/db/write_concern_options.h b/src/mongo/db/write_concern_options.h
index 99a6bff9fc2..39025832ea0 100644
--- a/src/mongo/db/write_concern_options.h
+++ b/src/mongo/db/write_concern_options.h
@@ -93,7 +93,7 @@ public:
* Return true if the server needs to wait for other secondary nodes to satisfy this
* write concern setting. Errs on the false positive for non-empty wMode.
*/
- bool shouldWaitForOtherNodes() const;
+ bool needToWaitForOtherNodes() const;
void reset() {
syncMode = SyncMode::UNSET;