summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/repl_set_html_summary.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/repl/repl_set_html_summary.cpp')
-rw-r--r--src/mongo/db/repl/repl_set_html_summary.cpp306
1 files changed, 150 insertions, 156 deletions
diff --git a/src/mongo/db/repl/repl_set_html_summary.cpp b/src/mongo/db/repl/repl_set_html_summary.cpp
index e0d95a6e8db..821e8258d2e 100644
--- a/src/mongo/db/repl/repl_set_html_summary.cpp
+++ b/src/mongo/db/repl/repl_set_html_summary.cpp
@@ -42,181 +42,175 @@
namespace mongo {
namespace repl {
- ReplSetHtmlSummary::ReplSetHtmlSummary() : _selfIndex(-1), _primaryIndex(-1), _selfUptime(0) {}
+ReplSetHtmlSummary::ReplSetHtmlSummary() : _selfIndex(-1), _primaryIndex(-1), _selfUptime(0) {}
namespace {
- /**
- * Turns an unsigned int representing a duration of time in milliseconds and turns it into
- * a human readable time string representation.
- */
- std::string ago(unsigned int duration) {
- std::stringstream s;
- if( duration < 180 ) {
- s << duration << " sec";
- if( duration != 1 ) s << 's';
- }
- else if( duration < 3600 ) {
- s.precision(2);
- s << duration / 60.0 << " mins";
- }
- else {
- s.precision(2);
- s << duration / 3600.0 << " hrs";
- }
- return s.str();
+/**
+ * Turns an unsigned int representing a duration of time in milliseconds and turns it into
+ * a human readable time string representation.
+ */
+std::string ago(unsigned int duration) {
+ std::stringstream s;
+ if (duration < 180) {
+ s << duration << " sec";
+ if (duration != 1)
+ s << 's';
+ } else if (duration < 3600) {
+ s.precision(2);
+ s << duration / 60.0 << " mins";
+ } else {
+ s.precision(2);
+ s << duration / 3600.0 << " hrs";
}
+ return s.str();
+}
- unsigned int timeDifference(Date_t now, Date_t past) {
- return static_cast<unsigned int>(past != Date_t() ? durationCount<Seconds>(now - past) : 0);
- }
+unsigned int timeDifference(Date_t now, Date_t past) {
+ return static_cast<unsigned int>(past != Date_t() ? durationCount<Seconds>(now - past) : 0);
+}
- std::string stateAsHtml(const MemberState& s) {
- using namespace html;
-
- if( s.s == MemberState::RS_STARTUP )
- return a("",
- "server still starting up, or still trying to initiate the set",
- "STARTUP");
- if( s.s == MemberState::RS_PRIMARY )
- return a("", "this server thinks it is primary", "PRIMARY");
- if( s.s == MemberState::RS_SECONDARY )
- return a("", "this server thinks it is a secondary (slave mode)", "SECONDARY");
- if( s.s == MemberState::RS_RECOVERING )
- return a("",
- "recovering/resyncing; after recovery usually auto-transitions to secondary",
- "RECOVERING");
- if( s.s == MemberState::RS_STARTUP2 )
- return a("", "loaded config, still determining who is primary", "STARTUP2");
- if( s.s == MemberState::RS_ARBITER )
- return a("", "this server is an arbiter only", "ARBITER");
- if( s.s == MemberState::RS_DOWN )
- return a("", "member is down, slow, or unreachable", "DOWN");
- if( s.s == MemberState::RS_ROLLBACK )
- return a("", "rolling back operations to get in sync", "ROLLBACK");
- if( s.s == MemberState::RS_UNKNOWN)
- return a("", "we do not know what state this node is in", "UNKNOWN");
- if( s.s == MemberState::RS_REMOVED)
- return a("", "this server has been removed from the replica set config", "ROLLBACK");
- return "";
- }
+std::string stateAsHtml(const MemberState& s) {
+ using namespace html;
+
+ if (s.s == MemberState::RS_STARTUP)
+ return a("", "server still starting up, or still trying to initiate the set", "STARTUP");
+ if (s.s == MemberState::RS_PRIMARY)
+ return a("", "this server thinks it is primary", "PRIMARY");
+ if (s.s == MemberState::RS_SECONDARY)
+ return a("", "this server thinks it is a secondary (slave mode)", "SECONDARY");
+ if (s.s == MemberState::RS_RECOVERING)
+ return a("",
+ "recovering/resyncing; after recovery usually auto-transitions to secondary",
+ "RECOVERING");
+ if (s.s == MemberState::RS_STARTUP2)
+ return a("", "loaded config, still determining who is primary", "STARTUP2");
+ if (s.s == MemberState::RS_ARBITER)
+ return a("", "this server is an arbiter only", "ARBITER");
+ if (s.s == MemberState::RS_DOWN)
+ return a("", "member is down, slow, or unreachable", "DOWN");
+ if (s.s == MemberState::RS_ROLLBACK)
+ return a("", "rolling back operations to get in sync", "ROLLBACK");
+ if (s.s == MemberState::RS_UNKNOWN)
+ return a("", "we do not know what state this node is in", "UNKNOWN");
+ if (s.s == MemberState::RS_REMOVED)
+ return a("", "this server has been removed from the replica set config", "ROLLBACK");
+ return "";
+}
}
- const std::string ReplSetHtmlSummary::toHtmlString() const {
- using namespace html;
+const std::string ReplSetHtmlSummary::toHtmlString() const {
+ using namespace html;
- std::stringstream s;
+ std::stringstream s;
- if (!_config.isInitialized()) {
- s << p("Still starting up, or else replset is not yet initiated.");
- return s.str();
- }
- if (_selfIndex < 0) {
- s << p("This node is not a member of its replica set configuration, it most likely was"
- " removed recently");
- return s.str();
- }
+ if (!_config.isInitialized()) {
+ s << p("Still starting up, or else replset is not yet initiated.");
+ return s.str();
+ }
+ if (_selfIndex < 0) {
+ s << p(
+ "This node is not a member of its replica set configuration, it most likely was"
+ " removed recently");
+ return s.str();
+ }
- int votesUp = 0;
- int totalVotes = 0;
- // Build table of node information.
- std::stringstream memberTable;
- const char *h[] =
- {"Member",
- "<a title=\"member id in the replset config\">id</a>",
- "Up",
- "<a title=\"length of time we have been continuously connected to the other member "
- "with no reconnects (for self, shows uptime)\">cctime</a>",
- "<a title=\"when this server last received a heartbeat response - includes error code "
- "responses\">Last heartbeat</a>",
- "Votes",
- "Priority",
- "State",
- "Messages",
- "<a title=\"how up to date this server is. this value polled every few seconds so "
- "actually lag is typically lower than value shown here.\">optime</a>",
- 0
- };
- memberTable << table(h);
-
- for (int i = 0; i < _config.getNumMembers(); ++i) {
- const MemberConfig& memberConfig = _config.getMemberAt(i);
- const MemberHeartbeatData& memberHB = _hbData[i];
- bool isSelf = _selfIndex == i;
- bool up = memberHB.getHealth() > 0;
-
- totalVotes += memberConfig.getNumVotes();
- if (up || isSelf) {
- votesUp += memberConfig.getNumVotes();
- }
+ int votesUp = 0;
+ int totalVotes = 0;
+ // Build table of node information.
+ std::stringstream memberTable;
+ const char* h[] = {
+ "Member",
+ "<a title=\"member id in the replset config\">id</a>",
+ "Up",
+ "<a title=\"length of time we have been continuously connected to the other member "
+ "with no reconnects (for self, shows uptime)\">cctime</a>",
+ "<a title=\"when this server last received a heartbeat response - includes error code "
+ "responses\">Last heartbeat</a>",
+ "Votes",
+ "Priority",
+ "State",
+ "Messages",
+ "<a title=\"how up to date this server is. this value polled every few seconds so "
+ "actually lag is typically lower than value shown here.\">optime</a>",
+ 0};
+ memberTable << table(h);
+
+ for (int i = 0; i < _config.getNumMembers(); ++i) {
+ const MemberConfig& memberConfig = _config.getMemberAt(i);
+ const MemberHeartbeatData& memberHB = _hbData[i];
+ bool isSelf = _selfIndex == i;
+ bool up = memberHB.getHealth() > 0;
+
+ totalVotes += memberConfig.getNumVotes();
+ if (up || isSelf) {
+ votesUp += memberConfig.getNumVotes();
+ }
- memberTable << tr();
- if (isSelf) {
- memberTable << td(memberConfig.getHostAndPort().toString() + " (me)");
- memberTable << td(memberConfig.getId());
- memberTable << td("1"); // up
- memberTable << td(ago(_selfUptime));
- memberTable << td(""); // last heartbeat
- memberTable << td(std::to_string(memberConfig.getNumVotes()));
- memberTable << td(std::to_string(memberConfig.getPriority()));
- memberTable << td(stateAsHtml(_selfState) +
- (memberConfig.isHidden() ? " (hidden)" : ""));
- memberTable << td(_selfHeartbeatMessage);
- memberTable << td(_selfOptime.toString());
+ memberTable << tr();
+ if (isSelf) {
+ memberTable << td(memberConfig.getHostAndPort().toString() + " (me)");
+ memberTable << td(memberConfig.getId());
+ memberTable << td("1"); // up
+ memberTable << td(ago(_selfUptime));
+ memberTable << td(""); // last heartbeat
+ memberTable << td(std::to_string(memberConfig.getNumVotes()));
+ memberTable << td(std::to_string(memberConfig.getPriority()));
+ memberTable << td(stateAsHtml(_selfState) +
+ (memberConfig.isHidden() ? " (hidden)" : ""));
+ memberTable << td(_selfHeartbeatMessage);
+ memberTable << td(_selfOptime.toString());
+ } else {
+ std::stringstream link;
+ link << "http://" << memberConfig.getHostAndPort().host() << ':'
+ << (memberConfig.getHostAndPort().port() + 1000) << "/_replSet";
+ memberTable << td(a(link.str(), "", memberConfig.getHostAndPort().toString()));
+ memberTable << td(memberConfig.getId());
+ memberTable << td(red(str::stream() << memberHB.getHealth(), !up));
+ const unsigned int uptime = timeDifference(_now, memberHB.getUpSince());
+ memberTable << td(ago(uptime));
+ if (memberHB.getLastHeartbeat() == Date_t()) {
+ memberTable << td("never");
+ } else {
+ memberTable << td(ago(timeDifference(_now, memberHB.getLastHeartbeat())));
}
- else {
- std::stringstream link;
- link << "http://" << memberConfig.getHostAndPort().host() << ':' <<
- (memberConfig.getHostAndPort().port() + 1000) << "/_replSet";
- memberTable << td( a(link.str(), "", memberConfig.getHostAndPort().toString()) );
- memberTable << td(memberConfig.getId());
- memberTable << td(red(str::stream() << memberHB.getHealth(), !up));
- const unsigned int uptime = timeDifference(_now, memberHB.getUpSince());
- memberTable << td(ago(uptime));
- if (memberHB.getLastHeartbeat() == Date_t()) {
- memberTable << td("never");
- }
- else {
- memberTable << td(ago(timeDifference(_now, memberHB.getLastHeartbeat())));
- }
- memberTable << td(std::to_string(memberConfig.getNumVotes()));
- memberTable << td(std::to_string(memberConfig.getPriority()));
- std::string state = memberHB.getState().toString() +
- (memberConfig.isHidden() ? " (hidden)" : "");
- if (up) {
- memberTable << td(state);
- }
- else {
- memberTable << td( grey(str::stream() << "(was " << state << ')', true) );
- }
- memberTable << td(grey(memberHB.getLastHeartbeatMsg(), !up));
- // TODO(dannenberg): change timestamp to optime in V1
- memberTable << td(memberHB.getLastHeartbeat() == Date_t() ?
- "?" : memberHB.getOpTime().toString());
+ memberTable << td(std::to_string(memberConfig.getNumVotes()));
+ memberTable << td(std::to_string(memberConfig.getPriority()));
+ std::string state =
+ memberHB.getState().toString() + (memberConfig.isHidden() ? " (hidden)" : "");
+ if (up) {
+ memberTable << td(state);
+ } else {
+ memberTable << td(grey(str::stream() << "(was " << state << ')', true));
}
- memberTable << _tr();
+ memberTable << td(grey(memberHB.getLastHeartbeatMsg(), !up));
+ // TODO(dannenberg): change timestamp to optime in V1
+ memberTable << td(
+ memberHB.getLastHeartbeat() == Date_t() ? "?" : memberHB.getOpTime().toString());
}
- memberTable << _table();
+ memberTable << _tr();
+ }
+ memberTable << _table();
- s << table(0, false);
- s << tr("Set name:", _config.getReplSetName());
- bool majorityUp = votesUp * 2 > totalVotes;
- s << tr("Majority up:", majorityUp ? "yes" : "no" );
+ s << table(0, false);
+ s << tr("Set name:", _config.getReplSetName());
+ bool majorityUp = votesUp * 2 > totalVotes;
+ s << tr("Majority up:", majorityUp ? "yes" : "no");
- const MemberConfig& selfConfig = _config.getMemberAt(_selfIndex);
+ const MemberConfig& selfConfig = _config.getMemberAt(_selfIndex);
- if (_primaryIndex >= 0 && _primaryIndex != _selfIndex && !selfConfig.isArbiter()) {
- int lag = _hbData[_primaryIndex].getOpTime().getTimestamp().getSecs() -
- _selfOptime.getTimestamp().getSecs();
- s << tr("Lag: ", str::stream() << lag << " secs");
- }
+ if (_primaryIndex >= 0 && _primaryIndex != _selfIndex && !selfConfig.isArbiter()) {
+ int lag = _hbData[_primaryIndex].getOpTime().getTimestamp().getSecs() -
+ _selfOptime.getTimestamp().getSecs();
+ s << tr("Lag: ", str::stream() << lag << " secs");
+ }
- s << _table();
+ s << _table();
- s << memberTable.str();
+ s << memberTable.str();
- return s.str();
- }
+ return s.str();
+}
-} // namespace repl
-} // namespace mongo
+} // namespace repl
+} // namespace mongo