From d5e6d8e12d93a7f70ab9a53c7acb3b205ae33add Mon Sep 17 00:00:00 2001 From: Jeremy Judeaux Date: Mon, 6 Feb 2012 10:21:39 +0100 Subject: [PATCH] Fix of leak in DBTCPConnector when redeploying on tomcat --- src/main/com/mongodb/DBTCPConnector.java | 36 +++++++++++++++--------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/main/com/mongodb/DBTCPConnector.java b/src/main/com/mongodb/DBTCPConnector.java index 621dafe5db8..62b691a0442 100644 --- a/src/main/com/mongodb/DBTCPConnector.java +++ b/src/main/com/mongodb/DBTCPConnector.java @@ -97,7 +97,12 @@ private static ServerAddress _checkAddress( List addrs ){ */ @Override public void requestStart(){ - _myPort.get().requestStart(); + MyPort myPort = _myPort.get(); + if (null == myPort){ + myPort = new MyPort(); + _myPort.set( myPort ); + } + myPort.requestStart(); } /** @@ -109,12 +114,16 @@ public void requestStart(){ */ @Override public void requestDone(){ - _myPort.get().requestDone(); + MyPort myPort = _myPort.get(); + if (null != myPort){ + myPort.requestDone(); + } + _myPort.remove(); } @Override public void requestEnsureConnection(){ - _myPort.get().requestEnsureConnection(); + getMyPort().requestEnsureConnection(); } void _checkClosed(){ @@ -124,8 +133,7 @@ void _checkClosed(){ WriteResult _checkWriteError( DB db , MyPort mp , DBPort port , WriteConcern concern ) throws MongoException, IOException { - CommandResult e = null; - e = port.runCommand( db , concern.getCommand() ); + CommandResult e = port.runCommand( db , concern.getCommand() ); if ( ! e.hasErr() ) return new WriteResult( e , concern ); @@ -147,7 +155,7 @@ public WriteResult say( DB db , OutMessage m , WriteConcern concern , ServerAddr _checkClosed(); checkMaster( false , true ); - MyPort mp = _myPort.get(); + MyPort mp = getMyPort(); DBPort port = mp.get( true , ReadPreference.PRIMARY, hostNeeded ); try { @@ -210,7 +218,7 @@ public Response call( DB db, DBCollection coll, OutMessage m, ServerAddress host _checkClosed(); checkMaster( false, !secondaryOk ); - final MyPort mp = _myPort.get(); + final MyPort mp = getMyPort(); final DBPort port = mp.get( false , readPref, hostNeeded ); Response res = null; @@ -562,9 +570,13 @@ public int getMaxBsonObjectSize() { return _maxBsonObjectSize.get(); } - // expose for unit testing + // also used for unit testing MyPort getMyPort() { - return _myPort.get(); + MyPort myPort = _myPort.get(); + if (null != myPort) + return myPort; + else + return new MyPort(); } private Mongo _mongo; @@ -577,10 +589,6 @@ MyPort getMyPort() { private final AtomicInteger _maxBsonObjectSize = new AtomicInteger(0); - private ThreadLocal _myPort = new ThreadLocal(){ - protected MyPort initialValue(){ - return new MyPort(); - } - }; + private ThreadLocal _myPort = new ThreadLocal(); }