00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00020 #pragma once
00021
00022 namespace mongo {
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 struct MemberState {
00034 enum MS {
00035 RS_STARTUP = 0,
00036 RS_PRIMARY = 1,
00037 RS_SECONDARY = 2,
00038 RS_RECOVERING = 3,
00039 RS_FATAL = 4,
00040 RS_STARTUP2 = 5,
00041 RS_UNKNOWN = 6,
00042 RS_ARBITER = 7,
00043 RS_DOWN = 8,
00044 RS_ROLLBACK = 9
00045 } s;
00046
00047 MemberState(MS ms = RS_UNKNOWN) : s(ms) { }
00048 explicit MemberState(int ms) : s((MS) ms) { }
00049
00050 bool primary() const { return s == RS_PRIMARY; }
00051 bool secondary() const { return s == RS_SECONDARY; }
00052 bool recovering() const { return s == RS_RECOVERING; }
00053 bool startup2() const { return s == RS_STARTUP2; }
00054 bool fatal() const { return s == RS_FATAL; }
00055 bool rollback() const { return s == RS_ROLLBACK; }
00056 bool readable() const { return s == RS_PRIMARY || s == RS_SECONDARY; }
00057
00058 string toString() const;
00059
00060 bool operator==(const MemberState& r) const { return s == r.s; }
00061 bool operator!=(const MemberState& r) const { return s != r.s; }
00062 };
00063
00064
00065
00066 class HeartbeatInfo {
00067 unsigned _id;
00068 public:
00069 HeartbeatInfo() : _id(0xffffffff),hbstate(MemberState::RS_UNKNOWN),health(-1.0),downSince(0),skew(INT_MIN) { }
00070 HeartbeatInfo(unsigned id);
00071 unsigned id() const { return _id; }
00072 MemberState hbstate;
00073 double health;
00074 time_t upSince;
00075 long long downSince;
00076 time_t lastHeartbeat;
00077 string lastHeartbeatMsg;
00078 OpTime opTime;
00079 int skew;
00080
00081 bool up() const { return health > 0; }
00082
00084 bool maybeUp() const { return health != 0; }
00085
00086 long long timeDown() const;
00087
00088
00089 bool changed(const HeartbeatInfo& old) const;
00090 };
00091
00092 inline HeartbeatInfo::HeartbeatInfo(unsigned id) : _id(id) {
00093 hbstate = MemberState::RS_UNKNOWN;
00094 health = -1.0;
00095 downSince = 0;
00096 lastHeartbeat = upSince = 0;
00097 skew = INT_MIN;
00098 }
00099
00100 inline bool HeartbeatInfo::changed(const HeartbeatInfo& old) const {
00101 return health != old.health ||
00102 hbstate != old.hbstate;
00103 }
00104
00105 }