MongoDB C++ Driver legacy-1.0.5
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 {
28 class BSONObj;
29 class ReplicaSetMonitor;
30 class TagSet;
31 struct ReadPreferenceSetting;
32 typedef boost::shared_ptr<ReplicaSetMonitor> ReplicaSetMonitorPtr;
33
39 MONGO_DISALLOW_COPYING(ReplicaSetMonitor);
40 public:
41 class Refresher;
42
43 typedef stdx::function<void(const std::string& setName,
44 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
129 static void createIfNeeded(const std::string& name , const std::set<HostAndPort>& servers);
130
136 static ReplicaSetMonitorPtr get(const std::string& name, bool createFromSeed = false);
137
141 static std::set<std::string> getAllTrackedSets();
142
148 static void remove(const std::string& name, bool clearSeedCache = false);
149
159 static void setConfigChangeHook(ConfigChangeHook hook);
160
168
179 static Status shutdown(int gracePeriodMillis = 0);
180
187
188 //
189 // internal types (defined in replica_set_monitor_internal.h)
190 //
191
192 struct IsMasterReply;
193 struct ScanState;
194 struct SetState;
195 typedef boost::shared_ptr<ScanState> ScanStatePtr;
196 typedef boost::shared_ptr<SetState> SetStatePtr;
197
198 //
199 // FOR TESTING ONLY
200 //
201
205 explicit ReplicaSetMonitor(const SetStatePtr& initialState)
206 : _state(initialState)
207 {}
208
215
216 private:
217 const SetStatePtr _state; // never NULL
218 };
219
232 public:
240 return _refreshUntilMatches(&criteria);
241 };
242
249 void refreshAll() { _refreshUntilMatches(NULL); }
250
251 //
252 // Remaining methods are only for testing and internal use.
253 // Callers are responsible for holding SetState::mutex before calling any of these methods.
254 //
255
261 explicit Refresher(const SetStatePtr& setState);
262
263 struct NextStep {
264 enum StepKind {
265 CONTACT_HOST,
268 };
269
270 explicit NextStep(StepKind step, const HostAndPort& host=HostAndPort())
271 : step(step)
272 , host(host)
273 {}
274
275 StepKind step;
276 HostAndPort host;
277 };
278
286
291 void receivedIsMaster(const HostAndPort& from, int64_t latencyMicros, const BSONObj& reply);
292
296 void failedHost(const HostAndPort& host);
297
301 bool startedNewScan() const { return _startedNewScan; }
302
306 static ScanStatePtr startNewScan(const SetState* set);
307
308 private:
309
319 bool receivedIsMasterFromMaster(const IsMasterReply& reply);
320
326 void receivedIsMasterBeforeFoundMaster(const IsMasterReply& reply);
327
333 HostAndPort _refreshUntilMatches(const ReadPreferenceSetting* criteria);
334
335 // Both pointers are never NULL
336 SetStatePtr _set;
337 ScanStatePtr _scan; // May differ from _set->currentScan if a new scan has started.
338 bool _startedNewScan;
339 };
340}
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:231
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:239
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:249
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:301
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:205
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.
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:214
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:186
the main MongoDB namespace
Definition bulk_operation_builder.h:24
MONGO_CLIENT_API Status(MONGO_CLIENT_FUNC *saslClientAuthenticate)(DBClientWithCommands *client
Attempts to authenticate "client" using the SASL protocol.
Name of a process on the network.
Definition hostandport.h:36
Definition dbclient_rs.h:316
Definition replica_set_monitor_internal.h:93
Definition replica_set_monitor.h:263
StepKind
Definition replica_set_monitor.h:264
@ DONE
Wait on condition variable and try again.
Definition replica_set_monitor.h:267
@ WAIT
Contact the returned host.
Definition replica_set_monitor.h:266
Definition replica_set_monitor_internal.h:231
Definition replica_set_monitor_internal.h:123