-
Type: Bug
-
Resolution: Fixed
-
Priority: Minor - P4
-
Affects Version/s: 3.0.0
-
Component/s: Connection Management
-
None
Hello,
The test below is failed :
AsyncStreamTimeoutsSpecification should throw a MongoSocketOpenException when the AsynchronousSocket Stream fails to open
Expected exception of type 'com.mongodb.MongoSocketOpenException', but got 'com.mongodb.MongoException' at org.spockframework.lang.SpecInternals.checkExceptionThrown(SpecInternals.java:85) at org.spockframework.lang.SpecInternals.thrownImpl(SpecInternals.java:72) at com.mongodb.connection.AsyncStreamTimeoutsSpecification.should throw a MongoSocketOpenException when the AsynchronousSocket Stream fails to open(AsyncStreamTimeoutsSpecification.groovy:57) Caused by: com.mongodb.MongoException: java.io.IOException: Le délai de temporisation de sémaphore a expiré. at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:136) at com.mongodb.connection.AsyncStreamTimeoutsSpecification.should throw a MongoSocketOpenException when the AsynchronousSocket Stream fails to open(AsyncStreamTimeoutsSpecification.groovy:54) Caused by: java.io.IOException: Le délai de temporisation de sémaphore a expiré. at sun.nio.ch.Iocp.translateErrorToIOException(Iocp.java:309) at sun.nio.ch.Iocp.access$700(Iocp.java:46) at sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:399) at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748)
InternalStreamConnection.open() catch an exception of type java.io.IOException (Throwable t)
and transform it to MongoException.
But test expect a MongoSocketOpenException.
And MongoException is not an instance of MongoSocketOpenException.
(the opposite is true).
So the test is failed.
class InternalStreamConnection public void open() { isTrue("Open already called", stream == null); stream = streamFactory.create(serverId.getAddress()); try { stream.open(); description = connectionInitializer.initialize(this); opened.set(true); sendCompressor = findSendCompressor(description); LOGGER.info(format("Opened connection [%s] to %s", getId(), serverId.getAddress())); } catch (Throwable t) { close(); if (t instanceof MongoException) { throw (MongoException) t; } else { throw new MongoException(t.toString(), t); } } }
A possible solution :
The IOException is throw by stream.open();
So, AsynchronousSocketChannelStream.open() must catch the IOException and transform it to MongoSocketOpenException
(like SocketChannelStream.open() do ):
@Override public void open() throws IOException { try { FutureAsyncCompletionHandler<Void> handler = new FutureAsyncCompletionHandler<Void>(); openAsync(handler); handler.getOpen(); } catch (IOException e) { close(); throw new MongoSocketOpenException("Exception opening socket", getAddress(), e); } }
Farès