MongoDB C++ Driver legacy-1.1.2
Loading...
Searching...
No Matches
replica_set_monitor.h
1/* Copyright 2014 MongoDB Inc.
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#pragma once
17
18#include <boost/shared_ptr.hpp>
19#include <string>
20#include <set>
21
22#include "mongo/base/disallow_copying.h"
23#include "mongo/base/string_data.h"
24#include "mongo/stdx/functional.h"
25#include "mongo/util/net/hostandport.h"
26
27namespace mongo {
28class BSONObj;
29class ReplicaSetMonitor;
30class TagSet;
31struct ReadPreferenceSetting;
32typedef boost::shared_ptr<ReplicaSetMonitor> ReplicaSetMonitorPtr;
33
39 MONGO_DISALLOW_COPYING(ReplicaSetMonitor);
40
41public:
42 class Refresher;
43
44 typedef stdx::function<void(const std::string& setName, const std::string& newConnectionString)>
45 ConfigChangeHook;
46
52 ReplicaSetMonitor(StringData name, const std::set<HostAndPort>& seeds);
53
62
71
78
85 void failedHost(const HostAndPort& host);
86
91 bool isPrimary(const HostAndPort& host) const;
92
97 bool isHostUp(const HostAndPort& host) const;
98
104
108 std::string getName() const;
109
114 std::string getServerAddress() const;
115
119 bool contains(const HostAndPort& server) const;
120
125
130
134 static void createIfNeeded(const std::string& name, const std::set<HostAndPort>& servers);
135
141 static ReplicaSetMonitorPtr get(const std::string& name, bool createFromSeed = false);
142
146 static std::set<std::string> getAllTrackedSets();
147
153 static void remove(const std::string& name, bool clearSeedCache = false);
154
164 static void setConfigChangeHook(ConfigChangeHook hook);
165
173
184 static Status shutdown(int gracePeriodMillis = 0);
185
192
193 //
194 // internal types (defined in replica_set_monitor_internal.h)
195 //
196
197 struct IsMasterReply;
198 struct ScanState;
199 struct SetState;
200 typedef boost::shared_ptr<ScanState> ScanStatePtr;
201 typedef boost::shared_ptr<SetState> SetStatePtr;
202
203 //
204 // FOR TESTING ONLY
205 //
206
210 explicit ReplicaSetMonitor(const SetStatePtr& initialState) : _state(initialState) {}
211
218
219private:
220 const SetStatePtr _state; // never NULL
221};
222
235public:
243 return _refreshUntilMatches(&criteria);
244 };
245
252 void refreshAll() {
253 _refreshUntilMatches(NULL);
254 }
255
256 //
257 // Remaining methods are only for testing and internal use.
258 // Callers are responsible for holding SetState::mutex before calling any of these methods.
259 //
260
266 explicit Refresher(const SetStatePtr& setState);
267
268 struct NextStep {
269 enum StepKind {
270 CONTACT_HOST,
273 };
274
275 explicit NextStep(StepKind step, const HostAndPort& host = HostAndPort())
276 : step(step), host(host) {}
277
278 StepKind step;
279 HostAndPort host;
280 };
281
289
294 void receivedIsMaster(const HostAndPort& from, int64_t latencyMicros, const BSONObj& reply);
295
299 void failedHost(const HostAndPort& host);
300
304 bool startedNewScan() const {
305 return _startedNewScan;
306 }
307
311 static ScanStatePtr startNewScan(const SetState* set);
312
313private:
323 bool receivedIsMasterFromMaster(const IsMasterReply& reply);
324
330 void receivedIsMasterBeforeFoundMaster(const IsMasterReply& reply);
331
337 HostAndPort _refreshUntilMatches(const ReadPreferenceSetting* criteria);
338
339 // Both pointers are never NULL
340 SetStatePtr _set;
341 ScanStatePtr _scan; // May differ from _set->currentScan if a new scan has started.
342 bool _startedNewScan;
343};
344}
Utility for creating a BSONObj.
Definition bsonobjbuilder.h:53
C++ representation of a "BSON" object – that is, an extended JSON-style object in a binary representa...
Definition bsonobj.h:78
Refreshes the local view of a replica set.
Definition replica_set_monitor.h:234
HostAndPort refreshUntilMatches(const ReadPreferenceSetting &criteria)
Contact hosts in the set to refresh our view, but stop once a host matches criteria.
Definition replica_set_monitor.h:242
Refresher(const SetStatePtr &setState)
Any passed-in pointers are shared with caller.
static ScanStatePtr startNewScan(const SetState *set)
Starts a new scan over the hosts in set.
void receivedIsMaster(const HostAndPort &from, int64_t latencyMicros, const BSONObj &reply)
Call this if a host returned from getNextStep successfully replied to an isMaster call.
void refreshAll()
Refresh all hosts.
Definition replica_set_monitor.h:252
void failedHost(const HostAndPort &host)
Call this if a host returned from getNextStep failed to reply to an isMaster call.
bool startedNewScan() const
True if this Refresher started a new full scan rather than joining an existing one.
Definition replica_set_monitor.h:304
NextStep getNextStep()
Returns the next step to take.
Holds state about a replica set and provides a means to refresh the local view.
Definition replica_set_monitor.h:38
void failedHost(const HostAndPort &host)
Notifies this Monitor that a host has failed and should be considered down.
bool isPrimary(const HostAndPort &host) const
Returns true if this node is the master based ONLY on local data.
static void setConfigChangeHook(ConfigChangeHook hook)
Sets the hook to be called whenever the config of any replica set changes.
static void createIfNeeded(const std::string &name, const std::set< HostAndPort > &servers)
Creates a new ReplicaSetMonitor, if it doesn't already exist.
ReplicaSetMonitor(const SetStatePtr &initialState)
Allows tests to set initial conditions and introspect the current state.
Definition replica_set_monitor.h:210
static std::set< std::string > getAllTrackedSets()
Returns all the currently tracked replica set names.
std::string getName() const
The name of the set.
bool contains(const HostAndPort &server) const
Is server part of this set? Uses only cached information.
bool isKnownToHaveGoodPrimary() const
Returns true if the monitor knows a usable primary from it's interal view.
static Status shutdown(int gracePeriodMillis=0)
Permanently stops all monitoring on replica sets and clears all cached information as well.
void appendInfo(BSONObjBuilder &b) const
Writes information about our cached view of the set to a BSONObjBuilder.
int getConsecutiveFailedScans() const
How may times in a row have we tried to refresh without successfully contacting any hosts who claim t...
Refresher startOrContinueRefresh()
Returns a refresher object that can be used to update our view of the set.
HostAndPort getHostOrRefresh(const ReadPreferenceSetting &criteria)
Returns a host matching criteria or an empty HostAndPort if no host matches.
static ReplicaSetMonitorPtr get(const std::string &name, bool createFromSeed=false)
gets a cached Monitor per name.
bool isHostUp(const HostAndPort &host) const
Returns true if host is part of this set and is considered up (meaning it can accept queries).
static void remove(const std::string &name, bool clearSeedCache=false)
Removes the ReplicaSetMonitor for the given set name from _sets, which will delete it.
ReplicaSetMonitor(StringData name, const std::set< HostAndPort > &seeds)
Initializes local state.
static Status initialize()
Starts the ReplicaSetMonitorWatcher.
HostAndPort getMasterOrUassert()
Returns the host we think is the current master or uasserts.
std::string getServerAddress() const
Returns a string with the format name/server1,server2.
static bool useDeterministicHostSelection
Defaults to false, meaning that if multiple hosts meet a criteria we pick one at random.
Definition replica_set_monitor.h:217
static int maxConsecutiveFailedChecks
If a ReplicaSetMonitor has been refreshed more than this many times in a row without finding any live...
Definition replica_set_monitor.h:191
Status represents an error state or the absence thereof.
Definition status.h:50
A StringData object wraps a 'const string&' or a 'const char*' without copying its contents.
Definition string_data.h:43
Utility functions for parsing numbers from strings.
Definition compare_numbers.h:20
Name of a process on the network.
Definition hostandport.h:37
Definition dbclient_rs.h:363
Definition replica_set_monitor_internal.h:89
Definition replica_set_monitor.h:268
StepKind
Definition replica_set_monitor.h:269
@ DONE
Wait on condition variable and try again.
Definition replica_set_monitor.h:272
@ WAIT
Contact the returned host.
Definition replica_set_monitor.h:271
Definition replica_set_monitor_internal.h:223
Definition replica_set_monitor_internal.h:117