summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSpencer T Brody <spencer@10gen.com>2012-11-08 12:47:28 -0500
committerEric Milkie <milkie@10gen.com>2012-11-09 14:53:57 -0500
commit3cc3b033b4b8f9e969655128da3c5951a4e9fa33 (patch)
treeb64222082df765678f918b857f8324a79ea64000
parent39f9638a400a1189d9f00f89c5ece874b4acaf2a (diff)
downloadmongo-3cc3b033b4b8f9e969655128da3c5951a4e9fa33.tar.gz
SERVER-7460 Make sure connections never get version information associated with them from an old connection
-rw-r--r--src/mongo/client/dbclient.cpp2
-rw-r--r--src/mongo/client/dbclientinterface.h6
-rw-r--r--src/mongo/s/shard_version.cpp8
3 files changed, 11 insertions, 5 deletions
diff --git a/src/mongo/client/dbclient.cpp b/src/mongo/client/dbclient.cpp
index cb021da8d2d..1177cfd1172 100644
--- a/src/mongo/client/dbclient.cpp
+++ b/src/mongo/client/dbclient.cpp
@@ -36,6 +36,8 @@
namespace mongo {
+ AtomicInt64 DBClientBase::ConnectionIdSequence;
+
void ConnectionString::_fillServers( string s ) {
//
diff --git a/src/mongo/client/dbclientinterface.h b/src/mongo/client/dbclientinterface.h
index 64ab61d6650..9d295838895 100644
--- a/src/mongo/client/dbclientinterface.h
+++ b/src/mongo/client/dbclientinterface.h
@@ -921,13 +921,17 @@ namespace mongo {
*/
class DBClientBase : public DBClientWithCommands, public DBConnector {
protected:
+ static AtomicInt64 ConnectionIdSequence;
+ long long _connectionId; // unique connection id for this connection
WriteConcern _writeConcern;
-
public:
DBClientBase() {
_writeConcern = W_NORMAL;
+ _connectionId = ConnectionIdSequence.fetchAndAdd(1);
}
+ long long getConnectionId() const { return _connectionId; }
+
WriteConcern getWriteConcern() const { return _writeConcern; }
void setWriteConcern( WriteConcern w ) { _writeConcern = w; }
diff --git a/src/mongo/s/shard_version.cpp b/src/mongo/s/shard_version.cpp
index ee959795027..fbb60ad06bf 100644
--- a/src/mongo/s/shard_version.cpp
+++ b/src/mongo/s/shard_version.cpp
@@ -43,24 +43,24 @@ namespace mongo {
S getSequence( DBClientBase * conn , const string& ns ) {
scoped_lock lk( _mutex );
- return _map[conn][ns];
+ return _map[conn->getConnectionId()][ns];
}
void setSequence( DBClientBase * conn , const string& ns , const S& s ) {
scoped_lock lk( _mutex );
- _map[conn][ns] = s;
+ _map[conn->getConnectionId()][ns] = s;
}
void reset( DBClientBase * conn ) {
scoped_lock lk( _mutex );
- _map.erase( conn );
+ _map.erase( conn->getConnectionId() );
}
// protects _map
mongo::mutex _mutex;
// a map from a connection into ChunkManager's sequence number for each namespace
- map<DBClientBase*, map<string,unsigned long long> > _map;
+ unordered_map<unsigned long long, map<string,unsigned long long> > _map;
} connectionShardStatus;