void BackgroundSync::notifierThread() { Client::initThread("rsSyncNotifier"); replLocalAuth(); // This makes the initial connection to our sync source for oplog position notification. // It also sets the supportsUpdater flag so we know which method to use. // If this function fails, we ignore that situation because it will be taken care of // the first time markOplog() is called in the loop below. { boost::unique_lock<boost::mutex> oplogLockSSF(theReplSet->syncSourceFeedback.oplock); connectOplogNotifier(); } theReplSet->syncSourceFeedback.go(); while (!inShutdown()) { bool clearTarget = false; if (!theReplSet) { sleepsecs(5); continue; } MemberState state = theReplSet->state(); if (state.primary() || state.fatal() || state.startup()) { sleepsecs(5); continue; } try { { boost::unique_lock<boost::mutex> lock(_lastOpMutex); while (_consumedOpTime == theReplSet->lastOpTimeWritten) { _lastOpCond.wait(lock); } } markOplog(); } catch (DBException &e) { clearTarget = true; log() << "replset tracking exception: " << e.getInfo() << rsLog; sleepsecs(1); } catch (std::exception &e2) { clearTarget = true; log() << "replset tracking error" << e2.what() << rsLog; sleepsecs(1); } if (clearTarget) { boost::unique_lock<boost::mutex> lock(_mutex); _oplogMarkerTarget = NULL; } } cc().shutdown(); }
void BackgroundSync::notifierThread() { Client::initThread("rsSyncNotifier"); replLocalAuth(); theReplSet->syncSourceFeedback.go(); while (!inShutdown()) { bool clearTarget = false; if (!theReplSet) { sleepsecs(5); continue; } MemberState state = theReplSet->state(); if (state.primary() || state.fatal() || state.startup()) { sleepsecs(5); continue; } try { { boost::unique_lock<boost::mutex> lock(_lastOpMutex); while (_consumedOpTime == theReplSet->lastOpTimeWritten) { _lastOpCond.wait(lock); } } markOplog(); } catch (DBException &e) { clearTarget = true; log() << "replset tracking exception: " << e.getInfo() << rsLog; sleepsecs(1); } catch (std::exception &e2) { clearTarget = true; log() << "replset tracking error" << e2.what() << rsLog; sleepsecs(1); } if (clearTarget) { boost::unique_lock<boost::mutex> lock(_mutex); _oplogMarkerTarget = NULL; } } cc().shutdown(); }