void BackgroundSync::_producerThread(executor::TaskExecutor* taskExecutor) { const MemberState state = _replCoord->getMemberState(); // we want to pause when the state changes to primary if (_replCoord->isWaitingForApplierToDrain() || state.primary()) { if (!isPaused()) { stop(); } sleepsecs(1); return; } // TODO(spencer): Use a condition variable to await loading a config. if (state.startup()) { // Wait for a config to be loaded sleepsecs(1); return; } // We need to wait until initial sync has started. if (_replCoord->getMyLastOptime().isNull()) { sleepsecs(1); return; } // we want to unpause when we're no longer primary // start() also loads _lastOpTimeFetched, which we know is set from the "if" OperationContextImpl txn; if (isPaused()) { start(&txn); } _produce(&txn, taskExecutor); }
void BackgroundSync::_runProducer() { if (getState() == ProducerState::Stopped) { sleepsecs(1); return; } // TODO(spencer): Use a condition variable to await loading a config. // TODO(siyuan): Control bgsync with producer state. if (_replCoord->getMemberState().startup()) { // Wait for a config to be loaded sleepsecs(1); return; } invariant(!_replCoord->getMemberState().rollback()); // We need to wait until initial sync has started. if (_replCoord->getMyLastAppliedOpTime().isNull()) { sleepsecs(1); return; } // we want to start when we're no longer primary // start() also loads _lastOpTimeFetched, which we know is set from the "if" auto opCtx = cc().makeOperationContext(); if (getState() == ProducerState::Starting) { start(opCtx.get()); } _produce(opCtx.get()); }
void BackgroundSync::_producerThread() { const MemberState state = _replCoord->getMemberState(); // we want to pause when the state changes to primary if (_replCoord->isWaitingForApplierToDrain() || state.primary()) { if (!isPaused()) { stop(); } if (_replCoord->isWaitingForApplierToDrain()) { // Signal to consumers that we have entered the paused state if the signal isn't already // in the queue. const boost::optional<BSONObj> lastObjectPushed = _buffer.lastObjectPushed(); if (!lastObjectPushed || !lastObjectPushed->isEmpty()) { const BSONObj sentinelDoc; _buffer.pushEvenIfFull(sentinelDoc); bufferCountGauge.increment(); bufferSizeGauge.increment(sentinelDoc.objsize()); } } sleepsecs(1); return; } // TODO(spencer): Use a condition variable to await loading a config. if (state.startup()) { // Wait for a config to be loaded sleepsecs(1); return; } // We need to wait until initial sync has started. if (_replCoord->getMyLastOptime().isNull()) { sleepsecs(1); return; } // we want to unpause when we're no longer primary // start() also loads _lastOpTimeFetched, which we know is set from the "if" OperationContextImpl txn; if (isPaused()) { start(&txn); } _produce(&txn); }
void BackgroundSync::_runProducer() { const MemberState state = _replCoord->getMemberState(); // Stop when the state changes to primary. // // TODO(siyuan) Drain mode should imply we're the primary. Fix this condition and the one below // after fixing step-down during drain mode. if (!_replCoord->isCatchingUp() && (_replCoord->isWaitingForApplierToDrain() || state.primary())) { if (!isStopped()) { stop(); } if (_replCoord->isWaitingForApplierToDrain()) { auto txn = cc().makeOperationContext(); _signalNoNewDataForApplier(txn.get()); } sleepsecs(1); return; } // TODO(spencer): Use a condition variable to await loading a config. if (state.startup()) { // Wait for a config to be loaded sleepsecs(1); return; } // We need to wait until initial sync has started. if (_replCoord->getMyLastAppliedOpTime().isNull()) { sleepsecs(1); return; } // we want to start when we're no longer primary // start() also loads _lastOpTimeFetched, which we know is set from the "if" auto txn = cc().makeOperationContext(); if (isStopped()) { start(txn.get()); } _produce(txn.get()); }
void BackgroundSync::_producerThread( ReplicationCoordinatorExternalState* replicationCoordinatorExternalState) { const MemberState state = _replCoord->getMemberState(); // Stop when the state changes to primary. if (_replCoord->isWaitingForApplierToDrain() || state.primary()) { if (!isStopped()) { stop(); } if (_replCoord->isWaitingForApplierToDrain()) { _signalNoNewDataForApplier(); } sleepsecs(1); return; } // TODO(spencer): Use a condition variable to await loading a config. if (state.startup()) { // Wait for a config to be loaded sleepsecs(1); return; } // We need to wait until initial sync has started. if (_replCoord->getMyLastAppliedOpTime().isNull()) { sleepsecs(1); return; } // we want to start when we're no longer primary // start() also loads _lastOpTimeFetched, which we know is set from the "if" const ServiceContext::UniqueOperationContext txnPtr = cc().makeOperationContext(); OperationContext& txn = *txnPtr; if (isStopped()) { start(&txn); } _produce(&txn, replicationCoordinatorExternalState); }