@@ -139,7 +139,7 @@ public WriteResult say( DB db , OutMessage m , WriteConcern concern , ServerAddr
139139 checkMaster ( false , true );
140140
141141 MyPort mp = _myPort .get ();
142- DBPort port = mp .get ( true , false , hostNeeded );
142+ DBPort port = mp .get ( true , ReadPreference . PRIMARY , hostNeeded );
143143
144144 try {
145145 port .checkAuth ( db );
@@ -188,12 +188,17 @@ public Response call( DB db , DBCollection coll , OutMessage m , ServerAddress h
188188
189189 public Response call ( DB db , DBCollection coll , OutMessage m , ServerAddress hostNeeded , int retries )
190190 throws MongoException {
191- boolean slaveOk = m .hasOption ( Bytes .QUERYOPTION_SLAVEOK );
191+ ReadPreference readPref = m .getReadPreference ();
192+ if (readPref == ReadPreference .PRIMARY && m .hasOption ( Bytes .QUERYOPTION_SLAVEOK ))
193+ readPref = ReadPreference .SECONDARY ;
194+
195+ boolean secondaryOk = !(readPref == ReadPreference .PRIMARY );
196+
192197 _checkClosed ();
193- checkMaster ( false , !slaveOk );
198+ checkMaster ( false , !secondaryOk );
194199
195200 final MyPort mp = _myPort .get ();
196- final DBPort port = mp .get ( false , slaveOk , hostNeeded );
201+ final DBPort port = mp .get ( false , readPref , hostNeeded );
197202
198203 Response res = null ;
199204 boolean retry = false ;
@@ -206,7 +211,7 @@ public Response call( DB db , DBCollection coll , OutMessage m , ServerAddress h
206211 catch ( IOException ioe ){
207212 mp .error ( port , ioe );
208213 retry = retries > 0 && !coll ._name .equals ( "$cmd" )
209- && !(ioe instanceof SocketTimeoutException ) && _error ( ioe , slaveOk );
214+ && !(ioe instanceof SocketTimeoutException ) && _error ( ioe , secondaryOk );
210215 if ( !retry ){
211216 throw new MongoException .Network ( "can't call something : " + port .host () + "/" + db ,
212217 ioe );
@@ -282,11 +287,11 @@ public String getConnectPoint(){
282287 * This method is called in case of an IOException.
283288 * It will potentially trigger a checkMaster() to check the status of all servers.
284289 * @param t the exception thrown
285- * @param slaveOk slaveOk flag
290+ * @param secondaryOk secondaryOk flag
286291 * @return true if the request should be retried, false otherwise
287292 * @throws MongoException
288293 */
289- boolean _error ( Throwable t , boolean slaveOk )
294+ boolean _error ( Throwable t , boolean secondaryOk )
290295 throws MongoException {
291296 if (_rsStatus == null ) {
292297 // single server, no need to retry
@@ -297,14 +302,14 @@ boolean _error( Throwable t, boolean slaveOk )
297302 // if no server is up, we wont retry until the updater thread finds one
298303 // this is to cut down the volume of requests/errors when all servers are down
299304 if ( _rsStatus .hasServerUp () ){
300- checkMaster ( true , !slaveOk );
305+ checkMaster ( true , !secondaryOk );
301306 }
302307 return _rsStatus .hasServerUp ();
303308 }
304309
305310 class MyPort {
306311
307- DBPort get ( boolean keep , boolean slaveOk , ServerAddress hostNeeded ){
312+ DBPort get ( boolean keep , ReadPreference readPref , ServerAddress hostNeeded ){
308313
309314 if ( hostNeeded != null ){
310315 // asked for a specific host
@@ -325,8 +330,8 @@ DBPort get( boolean keep , boolean slaveOk , ServerAddress hostNeeded ){
325330 _requestPort = null ;
326331 }
327332
328- if ( slaveOk && _rsStatus != null ){
329- // if slaveOk , try to use a secondary
333+ if ( !( readPref == ReadPreference . PRIMARY ) && _rsStatus != null ){
334+ // if not a primary read set , try to use a secondary
330335 ServerAddress slave = _rsStatus .getASecondary ();
331336 if ( slave != null ){
332337 return _portHolder .get ( slave ).get ();
0 commit comments