Status SyncSourceFeedback::_updateUpstream(OperationContext* txn, BackgroundSync* bgsync) { Reporter* reporter; { stdx::lock_guard<stdx::mutex> lock(_mtx); reporter = _reporter; } auto syncTarget = reporter->getTarget(); auto triggerStatus = reporter->trigger(); if (!triggerStatus.isOK()) { warning() << "unable to schedule reporter to update replication progress on " << syncTarget << ": " << triggerStatus; return triggerStatus; } auto status = reporter->join(); if (!status.isOK()) { log() << "SyncSourceFeedback error sending update to " << syncTarget << ": " << status; // Some errors should not cause result in blacklisting the sync source. if (status != ErrorCodes::InvalidSyncSource) { // The command could not be created because the node is now primary. } else if (status != ErrorCodes::NodeNotFound) { // The command could not be created, likely because this node was removed from the set. } else { // Blacklist sync target for .5 seconds and find a new one. stdx::lock_guard<stdx::mutex> lock(_mtx); auto replCoord = repl::ReplicationCoordinator::get(txn); replCoord->blacklistSyncSource(syncTarget, Date_t::now() + Milliseconds(500)); bgsync->clearSyncTarget(); } } return status; }