diff options
author | Lingzhi Deng <lingzhi.deng@mongodb.com> | 2019-10-03 01:50:48 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2019-10-03 01:50:48 +0000 |
commit | ef5c6b85dd873b69a12d919932e54c7b6711b14d (patch) | |
tree | a6294552175df0dc291a3a19f40d004f4b7f6141 /src/mongo/db | |
parent | 14b7efe1c6b5a00eac88e12c42ad31730db18fec (diff) | |
download | mongo-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.cpp | 12 | ||||
-rw-r--r-- | src/mongo/db/repl/replication_coordinator_impl.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/s/chunk_move_write_concern_options.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/s/migration_destination_manager.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/write_concern.cpp | 7 | ||||
-rw-r--r-- | src/mongo/db/write_concern_options.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/write_concern_options.h | 2 |
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; |