コード例 #1
0
void ShardingStateRecovery::endMetadataOp(OperationContext* opCtx) {
    Status status =
        modifyRecoveryDocument(opCtx, RecoveryDocument::Decrement, WriteConcernOptions());
    if (!status.isOK()) {
        warning() << "Failed to decrement minOpTimeUpdaters due to " << redact(status);
    }
}
コード例 #2
0
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;
}
コード例 #3
0
ファイル: read_concern.cpp プロジェクト: ksuarz/mongo
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;
}
コード例 #4
0
ファイル: type_settings.cpp プロジェクト: Andiry/mongo
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;
}
コード例 #5
0
ファイル: repl_coordinator_mock.cpp プロジェクト: 3rf/mongo
 WriteConcernOptions ReplicationCoordinatorMock::getGetLastErrorDefault() {
     return WriteConcernOptions();
 }