summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/member_data.cpp
diff options
context:
space:
mode:
authorMatthew Russotto <matthew.russotto@10gen.com>2017-05-17 16:54:47 -0400
committerMatthew Russotto <matthew.russotto@10gen.com>2017-05-17 19:10:29 -0400
commit2c8f21deb338a7482553dec6797356843156854b (patch)
tree123c510d93331bbb33bc5edf28feabcff1893064 /src/mongo/db/repl/member_data.cpp
parentf4c3c8d6e2874dc52cf4cee262d3839377651fc3 (diff)
downloadmongo-2c8f21deb338a7482553dec6797356843156854b.tar.gz
SERVER-29077 Rename MemberHeartbeatData in topology coordinator
Renamed MemberHeartbeatData to MemberData, renamed files to match, In topology coordinatory, renamed _hbData to _memberData. Renamed local memberHeartbeatData variables to memberData. Fixed a few files which unnecessarily included member_data.h.
Diffstat (limited to 'src/mongo/db/repl/member_data.cpp')
-rw-r--r--src/mongo/db/repl/member_data.cpp166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/mongo/db/repl/member_data.cpp b/src/mongo/db/repl/member_data.cpp
new file mode 100644
index 00000000000..c59eb1c6ce6
--- /dev/null
+++ b/src/mongo/db/repl/member_data.cpp
@@ -0,0 +1,166 @@
+/**
+* Copyright (C) 2014 MongoDB Inc.
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Affero General Public License, version 3,
+* as published by the Free Software Foundation.
+*
+* This program is distributed in the hope that it will be useful,b
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Affero General Public License for more details.
+*
+* You should have received a copy of the GNU Affero General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* As a special exception, the copyright holders give permission to link the
+* code of portions of this program with the OpenSSL library under certain
+* conditions as described in each individual source file and distribute
+* linked combinations including the program with the OpenSSL library. You
+* must comply with the GNU Affero General Public License in all respects for
+* all of the code used other than as permitted herein. If you modify file(s)
+* with this exception, you may extend this exception to your version of the
+* file(s), but you are not obligated to do so. If you do not wish to do so,
+* delete this exception statement from your version. If you delete this
+* exception statement from all source files in the program, then also delete
+* it in the license file.
+*/
+
+#define MONGO_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kReplication
+
+#include "mongo/platform/basic.h"
+
+#include <climits>
+
+#include "mongo/db/repl/member_data.h"
+#include "mongo/db/repl/rslog.h"
+#include "mongo/util/log.h"
+
+namespace mongo {
+namespace repl {
+
+MemberData::MemberData() : _health(-1), _authIssue(false), _configIndex(-1), _isSelf(false) {
+ _lastResponse.setState(MemberState::RS_UNKNOWN);
+ _lastResponse.setElectionTime(Timestamp());
+ _lastResponse.setAppliedOpTime(OpTime());
+}
+
+bool MemberData::setUpValues(Date_t now, ReplSetHeartbeatResponse&& hbResponse) {
+ _health = 1;
+ if (_upSince == Date_t()) {
+ _upSince = now;
+ }
+ _authIssue = false;
+ _lastHeartbeat = now;
+ _lastUpdate = now;
+ _lastUpdateStale = false;
+ _updatedSinceRestart = true;
+
+ if (!hbResponse.hasState()) {
+ hbResponse.setState(MemberState::RS_UNKNOWN);
+ }
+ if (!hbResponse.hasElectionTime()) {
+ hbResponse.setElectionTime(_lastResponse.getElectionTime());
+ }
+ if (!hbResponse.hasAppliedOpTime()) {
+ hbResponse.setAppliedOpTime(_lastResponse.getAppliedOpTime());
+ }
+ // Log if the state changes
+ if (_lastResponse.getState() != hbResponse.getState()) {
+ log() << "Member " << _hostAndPort.toString() << " is now in state "
+ << hbResponse.getState().toString() << rsLog;
+ }
+
+ bool opTimeAdvanced = advanceLastAppliedOpTime(hbResponse.getAppliedOpTime(), now);
+ auto durableOpTime = hbResponse.hasDurableOpTime() ? hbResponse.getDurableOpTime() : OpTime();
+ opTimeAdvanced = advanceLastDurableOpTime(durableOpTime, now) || opTimeAdvanced;
+ _lastResponse = std::move(hbResponse);
+ return opTimeAdvanced;
+}
+
+void MemberData::setDownValues(Date_t now, const std::string& heartbeatMessage) {
+ _health = 0;
+ _upSince = Date_t();
+ _lastHeartbeat = now;
+ _authIssue = false;
+ _updatedSinceRestart = true;
+
+ if (_lastResponse.getState() != MemberState::RS_DOWN) {
+ log() << "Member " << _hostAndPort.toString() << " is now in state RS_DOWN" << rsLog;
+ }
+
+ _lastResponse = ReplSetHeartbeatResponse();
+ _lastResponse.setState(MemberState::RS_DOWN);
+ _lastResponse.setElectionTime(Timestamp());
+ _lastResponse.setAppliedOpTime(OpTime());
+ _lastResponse.setHbMsg(heartbeatMessage);
+ _lastResponse.setSyncingTo(HostAndPort());
+
+ // The _lastAppliedOpTime/_lastDurableOpTime fields don't get cleared merely by missing a
+ // heartbeat.
+}
+
+void MemberData::setAuthIssue(Date_t now) {
+ _health = 0; // set health to 0 so that this doesn't count towards majority.
+ _upSince = Date_t();
+ _lastHeartbeat = now;
+ _authIssue = true;
+ _updatedSinceRestart = true;
+
+ if (_lastResponse.getState() != MemberState::RS_UNKNOWN) {
+ log() << "Member " << _hostAndPort.toString()
+ << " is now in state RS_UNKNOWN due to authentication issue." << rsLog;
+ }
+
+ _lastResponse = ReplSetHeartbeatResponse();
+ _lastResponse.setState(MemberState::RS_UNKNOWN);
+ _lastResponse.setElectionTime(Timestamp());
+ _lastResponse.setAppliedOpTime(OpTime());
+ _lastResponse.setHbMsg("");
+ _lastResponse.setSyncingTo(HostAndPort());
+}
+
+void MemberData::setLastAppliedOpTime(OpTime opTime, Date_t now) {
+ _lastUpdate = now;
+ _lastUpdateStale = false;
+ _lastAppliedOpTime = opTime;
+}
+
+void MemberData::setLastDurableOpTime(OpTime opTime, Date_t now) {
+ _lastUpdate = now;
+ _lastUpdateStale = false;
+ if (_lastAppliedOpTime < opTime) {
+ // TODO(russotto): We think this should never happen, rollback or no rollback. Make this an
+ // invariant and see what happens.
+ log() << "Durable progress (" << opTime << ") is ahead of the applied progress ("
+ << _lastAppliedOpTime << ". This is likely due to a "
+ "rollback."
+ << " memberid: " << _memberId << " rid: " << _rid << " host "
+ << _hostAndPort.toString() << " previous durable progress: " << _lastDurableOpTime;
+ } else {
+ _lastDurableOpTime = opTime;
+ }
+}
+
+bool MemberData::advanceLastAppliedOpTime(OpTime opTime, Date_t now) {
+ _lastUpdate = now;
+ _lastUpdateStale = false;
+ if (_lastAppliedOpTime < opTime) {
+ setLastAppliedOpTime(opTime, now);
+ return true;
+ }
+ return false;
+}
+
+bool MemberData::advanceLastDurableOpTime(OpTime opTime, Date_t now) {
+ _lastUpdate = now;
+ _lastUpdateStale = false;
+ if (_lastDurableOpTime < opTime) {
+ setLastDurableOpTime(opTime, now);
+ return true;
+ }
+ return false;
+}
+
+} // namespace repl
+} // namespace mongo