void ShardingStateRecovery::endMetadataOp(OperationContext* opCtx) { Status status = modifyRecoveryDocument(opCtx, RecoveryDocument::Decrement, WriteConcernOptions()); if (!status.isOK()) { warning() << "Failed to decrement minOpTimeUpdaters due to " << redact(status); } }
Status ShardingStateRecovery::startMetadataOp(OperationContext* opCtx) { Status upsertStatus = modifyRecoveryDocument(opCtx, RecoveryDocument::Increment, kMajorityWriteConcern); if (upsertStatus == ErrorCodes::WriteConcernFailed) { // Couldn't wait for the replication to complete, but the local write was performed. Clear // it up fast (without any waiting for journal or replication) and still treat it as // failure. modifyRecoveryDocument(opCtx, RecoveryDocument::Decrement, WriteConcernOptions()); } return upsertStatus; }
Status waitForLinearizableReadConcern(OperationContext* txn) { repl::ReplicationCoordinator* replCoord = repl::ReplicationCoordinator::get(txn->getClient()->getServiceContext()); { ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock lk(txn->lockState(), "local", MODE_IX); Lock::CollectionLock lock(txn->lockState(), "local.oplog.rs", MODE_IX); if (!replCoord->canAcceptWritesForDatabase("admin")) { return {ErrorCodes::NotMaster, "No longer primary when waiting for linearizable read concern"}; } MONGO_WRITE_CONFLICT_RETRY_LOOP_BEGIN { WriteUnitOfWork uow(txn); txn->getClient()->getServiceContext()->getOpObserver()->onOpMessage( txn, BSON("msg" << "linearizable read")); uow.commit(); } MONGO_WRITE_CONFLICT_RETRY_LOOP_END( txn, "waitForLinearizableReadConcern", "local.rs.oplog"); } WriteConcernOptions wc = WriteConcernOptions( WriteConcernOptions::kMajority, WriteConcernOptions::SyncMode::UNSET, 0); repl::OpTime lastOpApplied = repl::ReplClientInfo::forClient(txn->getClient()).getLastOp(); auto awaitReplResult = replCoord->awaitReplication(txn, lastOpApplied, wc); if (awaitReplResult.status == ErrorCodes::WriteConcernFailed) { return Status(ErrorCodes::LinearizableReadConcernError, "Failed to confirm that read was linearizable."); } return awaitReplResult.status; }
StatusWith<SettingsType> SettingsType::fromBSON(const BSONObj& source) { SettingsType settings; { std::string settingsKey; Status status = bsonExtractStringField(source, key.name(), &settingsKey); if (!status.isOK()) return status; settings._key = settingsKey; } if (settings._key == ChunkSizeDocKey) { long long settingsChunkSizeMB; Status status = bsonExtractIntegerField(source, chunkSizeMB.name(), &settingsChunkSizeMB); if (!status.isOK()) return status; settings._chunkSizeMB = settingsChunkSizeMB; } else if (settings._key == BalancerDocKey) { { bool settingsBalancerStopped; Status status = bsonExtractBooleanFieldWithDefault( source, balancerStopped.name(), false, &settingsBalancerStopped); if (!status.isOK()) return status; settings._balancerStopped = settingsBalancerStopped; } { BSONElement settingsBalancerActiveWindowElem; Status status = bsonExtractTypedField( source, balancerActiveWindow.name(), Object, &settingsBalancerActiveWindowElem); if (status != ErrorCodes::NoSuchKey) { if (!status.isOK()) return status; StatusWith<BoostTimePair> timePairResult = settings._parseBalancingWindow(settingsBalancerActiveWindowElem.Obj()); if (!timePairResult.isOK()) return timePairResult.getStatus(); settings._balancerActiveWindow = timePairResult.getValue(); } } { BSONElement settingsMigrationWriteConcernElem; Status status = bsonExtractTypedField( source, migrationWriteConcern.name(), Object, &settingsMigrationWriteConcernElem); if (status == ErrorCodes::TypeMismatch) { bool settingsSecondaryThrottle; status = bsonExtractBooleanFieldWithDefault( source, deprecated_secondaryThrottle.name(), true, &settingsSecondaryThrottle); if (!status.isOK()) return status; settings._secondaryThrottle = settingsSecondaryThrottle; } else if (status != ErrorCodes::NoSuchKey) { if (!status.isOK()) return status; settings._migrationWriteConcern = WriteConcernOptions(); status = settings._migrationWriteConcern->parse(settingsMigrationWriteConcernElem.Obj()); if (!status.isOK()) return status; } } { bool settingsWaitForDelete; Status status = bsonExtractBooleanField(source, waitForDelete.name(), &settingsWaitForDelete); if (status != ErrorCodes::NoSuchKey) { if (!status.isOK()) return status; settings._waitForDelete = settingsWaitForDelete; } } } return settings; }
WriteConcernOptions ReplicationCoordinatorMock::getGetLastErrorDefault() { return WriteConcernOptions(); }