From 56c76ceb86a4e3c72e5cbde516d55db41f1633a9 Mon Sep 17 00:00:00 2001 From: Mike Copley Date: Tue, 14 Dec 2010 14:58:52 +0000 Subject: [PATCH] Added support for ping ceiling to ReplicaSetStatus --- src/main/com/mongodb/DBTCPConnector.java | 4 ++-- src/main/com/mongodb/MongoOptions.java | 8 ++++++++ src/main/com/mongodb/ReplicaSetStatus.java | 9 +++++---- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/com/mongodb/DBTCPConnector.java b/src/main/com/mongodb/DBTCPConnector.java index a5e64ef..7aff8bc 100644 --- a/src/main/com/mongodb/DBTCPConnector.java +++ b/src/main/com/mongodb/DBTCPConnector.java @@ -39,7 +39,7 @@ class DBTCPConnector implements DBConnector { if ( addr.isPaired() ){ _allHosts = new ArrayList( addr.explode() ); - _rsStatus = new ReplicaSetStatus( _allHosts ); + _rsStatus = new ReplicaSetStatus( _allHosts, m._options ); _createLogger.info( "switching to replica set mode : " + _allHosts + " -> " + _curMaster ); } else { @@ -61,7 +61,7 @@ class DBTCPConnector implements DBConnector { _checkAddress( all ); _allHosts = new ArrayList( all ); // make a copy so it can't be modified - _rsStatus = new ReplicaSetStatus( _allHosts ); + _rsStatus = new ReplicaSetStatus( _allHosts, m._options ); _createLogger.info( all + " -> " + _curMaster ); } diff --git a/src/main/com/mongodb/MongoOptions.java b/src/main/com/mongodb/MongoOptions.java index b8a0d3d..6cc9b2b 100644 --- a/src/main/com/mongodb/MongoOptions.java +++ b/src/main/com/mongodb/MongoOptions.java @@ -36,6 +36,7 @@ public class MongoOptions { connectTimeout = 0; socketTimeout = 0; autoConnectRetry = false; + slaveRandomSelectionPingCeiling = 200; } /** @@ -72,6 +73,12 @@ public class MongoOptions { */ public boolean autoConnectRetry; + /** + The max ping time, in milliseconds, a slave can have to be randomly selected when using slaveOK. Defaults to 200ms. + A slave above this ceiling will still be used if no other slave node has a quicker ping time. + */ + public long slaveRandomSelectionPingCeiling; + public String toString(){ StringBuilder buf = new StringBuilder(); buf.append( "connectionsPerHost: " ).append( connectionsPerHost ).append( " " ); @@ -80,6 +87,7 @@ public class MongoOptions { buf.append( "connectTimeout: " ).append( connectTimeout ).append( " " ); buf.append( "socketTimeout: " ).append( socketTimeout ).append( " " ); buf.append( "autoConnectRetry: " ).append( autoConnectRetry ).append( " " ); + buf.append( "slaveRandomSelectionPingCeiling: " ).append( slaveRandomSelectionPingCeiling ).append( " " ); return buf.toString(); } diff --git a/src/main/com/mongodb/ReplicaSetStatus.java b/src/main/com/mongodb/ReplicaSetStatus.java index dc41895..c368d0b 100644 --- a/src/main/com/mongodb/ReplicaSetStatus.java +++ b/src/main/com/mongodb/ReplicaSetStatus.java @@ -21,8 +21,8 @@ class ReplicaSetStatus { static final Logger _rootLogger = Logger.getLogger( "com.mongodb.ReplicaSetStatus" ); - ReplicaSetStatus( List initial ){ - + ReplicaSetStatus( List initial, MongoOptions options ){ + _options = options; _all = Collections.synchronizedList( new ArrayList() ); for ( ServerAddress addr : initial ){ _all.add( new Node( addr ) ); @@ -91,7 +91,7 @@ class ReplicaSetStatus { long diff = best._pingTime - n._pingTime; if ( diff > 15 || // this is a complex way to make sure we get a random distribution of slaves - ( ( badBeforeBest - mybad ) / ( _all.size() - 1 ) ) > _random.nextDouble() ) + ( diff < _options.slaveRandomSelectionPingCeiling && ( ( badBeforeBest - mybad ) / ( _all.size() - 1 ) ) > _random.nextDouble() ) ) { best = n; badBeforeBest = mybad; @@ -324,6 +324,7 @@ class ReplicaSetStatus { } + final MongoOptions _options; final List _all; Updater _updater; String _setName = null; // null until init @@ -350,7 +351,7 @@ class ReplicaSetStatus { Mongo m = new Mongo( addrs ); - ReplicaSetStatus status = new ReplicaSetStatus( addrs ); + ReplicaSetStatus status = new ReplicaSetStatus( addrs, m._options ); System.out.println( status.ensureMaster()._addr ); while ( true ){ -- 1.7.3.2