diff options
author | Antonin Kral <a.kral@bobek.cz> | 2012-05-10 06:57:54 +0200 |
---|---|---|
committer | Antonin Kral <a.kral@bobek.cz> | 2012-05-10 06:57:54 +0200 |
commit | 61619b3142c1de8f60f91964ff2656054d4f11a6 (patch) | |
tree | d3aaf9d1e70cac8efa0856e5b5ba39e2fb9dc526 /client/dbclient_rs.h | |
parent | eaaa7b30c99b89b5483e0a372bb73fe8c8695185 (diff) | |
download | mongodb-61619b3142c1de8f60f91964ff2656054d4f11a6.tar.gz |
Imported Upstream version 2.0.5
Diffstat (limited to 'client/dbclient_rs.h')
-rw-r--r-- | client/dbclient_rs.h | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/client/dbclient_rs.h b/client/dbclient_rs.h index b68af29..bf91f09 100644 --- a/client/dbclient_rs.h +++ b/client/dbclient_rs.h @@ -107,6 +107,13 @@ namespace mongo { */ ReplicaSetMonitor( const string& name , const vector<HostAndPort>& servers ); + /** + * Checks all connections from the host list and sets the current + * master. + * + * @param checkAllSecondaries if set to false, stop immediately when + * the master is found or when _master is not -1. + */ void _check( bool checkAllSecondaries ); /** @@ -125,25 +132,50 @@ namespace mongo { /** * Updates host list. - * @param c the connection to check + * Invariant: if nodesOffset is >= 0, _nodes[nodesOffset].conn should be + * equal to conn. + * + * @param conn the connection to check * @param maybePrimary OUT * @param verbose * @param nodesOffset - offset into _nodes array, -1 for not in it - * @return if the connection is good + * + * @return true if the connection is good or false if invariant + * is broken */ - bool _checkConnection( DBClientConnection * c , string& maybePrimary , bool verbose , int nodesOffset ); + bool _checkConnection( DBClientConnection* conn, string& maybePrimary, + bool verbose, int nodesOffset ); string _getServerAddress_inlock() const; NodeDiff _getHostDiff_inlock( const BSONObj& hostList ); bool _shouldChangeHosts( const BSONObj& hostList, bool inlock ); - + /** + * @return the index to _nodes corresponding to the server address. + */ int _find( const string& server ) const ; int _find_inlock( const string& server ) const ; - int _find( const HostAndPort& server ) const ; - mutable mongo::mutex _lock; // protects _nodes + /** + * Checks whether the given connection matches the connection stored in _nodes. + * Mainly used for sanity checking to confirm that nodeOffset still + * refers to the right connection after releasing and reacquiring + * a mutex. + */ + bool _checkConnMatch_inlock( DBClientConnection* conn, size_t nodeOffset ) const; + + // protects _nodes and indices pointing to it (_master & _nextSlave) + mutable mongo::mutex _lock; + + /** + * "Synchronizes" the _checkConnection method. Should ideally be one mutex per + * connection object being used. The purpose of this lock is to make sure that + * the reply from the connection the lock holder got is the actual response + * to what it sent. + * + * Deadlock WARNING: never acquire this while holding _lock + */ mutable mongo::mutex _checkConnectionLock; string _name; |