@@ -41,7 +41,7 @@ public DBTCPConnector( Mongo m , ServerAddress addr )
41
41
if ( addr .isPaired () ){
42
42
_allHosts = new ArrayList <ServerAddress >( addr .explode () );
43
43
_rsStatus = new ReplicaSetStatus ( m , _allHosts );
44
- _createLogger .info ( "switching to replica set mode : " + _allHosts + " -> " + _curMaster );
44
+ _createLogger .info ( "switching to replica set mode : " + _allHosts + " -> " + getAddress () );
45
45
}
46
46
else {
47
47
_set ( addr );
@@ -64,7 +64,7 @@ public DBTCPConnector( Mongo m , List<ServerAddress> all )
64
64
_allHosts = new ArrayList <ServerAddress >( all ); // make a copy so it can't be modified
65
65
_rsStatus = new ReplicaSetStatus ( m , _allHosts );
66
66
67
- _createLogger .info ( all + " -> " + _curMaster );
67
+ _createLogger .info ( all + " -> " + getAddress () );
68
68
}
69
69
70
70
private static ServerAddress _checkAddress ( ServerAddress addr ){
@@ -245,7 +245,8 @@ public Response call( DB db , DBCollection coll , OutMessage m , ServerAddress h
245
245
}
246
246
247
247
public ServerAddress getAddress (){
248
- return _curMaster ;
248
+ DBPortPool pool = _masterPortPool ;
249
+ return pool != null ? pool .getServerAddress () : null ;
249
250
}
250
251
251
252
/**
@@ -264,17 +265,21 @@ public List<ServerAddress> getAllAddress() {
264
265
public List <ServerAddress > getServerAddressList () {
265
266
if (_rsStatus != null ) {
266
267
return _rsStatus .getServerAddressList ();
267
- } else if (_curMaster != null ) {
268
+ }
269
+
270
+ ServerAddress master = getAddress ();
271
+ if (master != null ) {
268
272
// single server
269
273
List <ServerAddress > list = new ArrayList <ServerAddress >();
270
- list .add (_curMaster );
274
+ list .add (master );
271
275
return list ;
272
276
}
273
277
return null ;
274
278
}
275
279
276
280
public String getConnectPoint (){
277
- return _curMaster .toString ();
281
+ ServerAddress master = getAddress ();
282
+ return master != null ? master .toString () : null ;
278
283
}
279
284
280
285
boolean _error ( Throwable t , boolean slaveOk )
@@ -292,89 +297,85 @@ DBPort get( boolean keep , boolean slaveOk , ServerAddress hostNeeded ){
292
297
293
298
if ( hostNeeded != null ){
294
299
// asked for a specific host
295
- _pool = _portHolder .get ( hostNeeded );
296
- return _pool .get ();
300
+ return _portHolder .get ( hostNeeded ).get ();
297
301
}
298
302
299
- if ( _port != null ){
300
- // we are within a request, should stick to same port
301
- if ( _pool == _masterPortPool ) {
302
- return _port ;
303
+ if ( _requestPort != null ){
304
+ // we are within a request, and have a port, should stick to it
305
+ if ( _requestPort .getPool () == _masterPortPool || !keep ) {
306
+ // if keep is false, it's a read, so we use port even if master changed
307
+ return _requestPort ;
303
308
}
304
- // master has changed
305
- _pool .done ( _port );
306
- _port = null ;
307
- _pool = null ;
309
+
310
+ // it's write and master has changed
311
+ // we fall back on new master and try to go on with request
312
+ // this may not be best behavior if spec of request is to stick with same server
313
+ _requestPort .getPool ().done (_requestPort );
314
+ _requestPort = null ;
308
315
}
309
316
310
317
if ( slaveOk && _rsStatus != null ){
311
318
// if slaveOk, try to use a secondary
312
319
ServerAddress slave = _rsStatus .getASecondary ();
313
320
if ( slave != null ){
314
- _pool = _portHolder .get ( slave );
315
- return _pool .get ();
321
+ return _portHolder .get ( slave ).get ();
316
322
}
317
323
}
318
324
319
325
// use master
320
- _pool = _masterPortPool ;
321
- DBPort p = _pool .get ();
326
+ DBPort p = _masterPortPool .get ();
322
327
if ( keep && _inRequest ) {
323
328
// if within request, remember port to stick to same server
324
- _port = p ;
329
+ _requestPort = p ;
325
330
}
326
331
327
332
return p ;
328
333
}
329
334
330
335
void done ( DBPort p ){
331
- if ( p != _port ){
332
- _pool .done ( p );
333
- _pool = null ;
334
- _slave = null ;
336
+ // keep request port
337
+ if ( p != _requestPort ){
338
+ p .getPool ().done (p );
335
339
}
336
-
337
340
}
338
341
342
+ /**
343
+ * call this method when there is an IOException or other low level error on port.
344
+ * @param p
345
+ * @param e
346
+ */
339
347
void error ( DBPort p , Exception e ){
340
- _pool .done ( p );
348
+ p . getPool () .done ( p );
341
349
p .close ();
342
350
343
- _port = null ;
344
- _pool = null ;
345
-
351
+ _requestPort = null ;
346
352
_logger .log ( Level .SEVERE , "MyPort.error called" , e );
347
353
}
348
354
349
355
void requestEnsureConnection (){
350
356
if ( ! _inRequest )
351
357
return ;
352
358
353
- if ( _port != null )
359
+ if ( _requestPort != null )
354
360
return ;
355
361
356
- if ( _pool == null )
357
- _pool = _masterPortPool ;
358
-
359
- _port = _pool .get ();
362
+ _requestPort = _masterPortPool .get ();
360
363
}
361
364
362
365
void requestStart (){
363
366
_inRequest = true ;
364
367
}
365
368
366
369
void requestDone (){
367
- if ( _port != null )
368
- _pool .done ( _port );
369
- _port = null ;
370
- _pool = null ;
370
+ if ( _requestPort != null )
371
+ _requestPort .getPool ().done ( _requestPort );
372
+ _requestPort = null ;
371
373
_inRequest = false ;
372
374
}
373
375
374
- DBPort _port ;
375
- DBPortPool _pool ;
376
+ DBPort _requestPort ;
377
+ // DBPortPool _requestPool ;
376
378
boolean _inRequest ;
377
- ServerAddress _slave ; // slave used for last read if any
378
379
}
379
380
380
381
void checkMaster ( boolean force , boolean failIfNoMaster )
@@ -409,19 +410,18 @@ void testMaster()
409
410
}
410
411
411
412
private boolean _set ( ServerAddress addr ){
412
- if ( _curMaster == addr && _masterPortPool != null )
413
- return false ;
414
- _curMaster = addr ;
415
413
_masterPortPool = _portHolder .get ( addr );
416
414
return true ;
417
415
}
418
416
419
417
public String debugString (){
420
418
StringBuilder buf = new StringBuilder ( "DBTCPConnector: " );
421
- if ( _allHosts != null )
419
+ if ( _rsStatus != null ) {
422
420
buf .append ( "replica set : " ).append ( _allHosts );
423
- else
424
- buf .append ( _curMaster ).append ( " " ).append ( _curMaster ._addr );
421
+ } else {
422
+ ServerAddress master = getAddress ();
423
+ buf .append ( master ).append ( " " ).append ( master != null ? master ._addr : null );
424
+ }
425
425
426
426
return buf .toString ();
427
427
}
@@ -440,7 +440,7 @@ public boolean isOpen(){
440
440
}
441
441
442
442
private Mongo _mongo ;
443
- private ServerAddress _curMaster ;
443
+ // private ServerAddress _curMaster;
444
444
private DBPortPool _masterPortPool ;
445
445
private DBPortPool .Holder _portHolder ;
446
446
private final List <ServerAddress > _allHosts ;
0 commit comments