[JAVA-1674] Address race conditions in InternalStreamConnection Created: 05/Mar/15  Updated: 03/Sep/15  Resolved: 24/Mar/15

Status: Closed
Project: Java Driver
Component/s: Connection Management
Affects Version/s: None
Fix Version/s: 3.0.0

Type: Bug Priority: Major - P3
Reporter: Jeffrey Yemin Assignee: Jeffrey Yemin
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Duplicate
is duplicated by JAVA-1694 Make Connection thread safe Closed

 Description   

Test: "com.mongodb.async.client.SmokeTestSpecification.should handle common administrative scenarios without error"

Here's one:

com.mongodb.MongoTimeoutException: Callback timed out
	at com.mongodb.async.FutureResultCallback.get(FutureResultCallback.java:74)
	at com.mongodb.async.client.SmokeTestSpecification.run(SmokeTestSpecification.groovy:177)
	at com.mongodb.async.client.SmokeTestSpecification.should handle common administrative scenarios without error(SmokeTestSpecification.groovy:108)

and another:

com.mongodb.MongoCommandException: Command failed with error 13140: 'exception: Don't recognize source or target DB' on server localhost:27018. The full response is { "code" : 13140, "ok" : 0.0, "errmsg" : "exception: Don't recognize source or target DB" }
	at com.mongodb.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:75)
	at com.mongodb.connection.CommandResultCallback.callCallback(CommandResultCallback.java:51)
	at com.mongodb.connection.CommandResultCallback.callCallback(CommandResultCallback.java:29)
	at com.mongodb.connection.CommandResultBaseCallback.callCallback(CommandResultBaseCallback.java:39)
	at com.mongodb.connection.ResponseCallback.onResult(ResponseCallback.java:48)
	at com.mongodb.connection.ResponseCallback.onResult(ResponseCallback.java:23)
	at com.mongodb.connection.DefaultConnectionPool$PooledConnection$2.onResult(DefaultConnectionPool.java:417)
	at com.mongodb.connection.DefaultConnectionPool$PooledConnection$2.onResult(DefaultConnectionPool.java:411)
	at com.mongodb.connection.UsageTrackingInternalConnection$3.onResult(UsageTrackingInternalConnection.java:127)
	at com.mongodb.connection.UsageTrackingInternalConnection$3.onResult(UsageTrackingInternalConnection.java:123)
	at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:53)
	at com.mongodb.connection.InternalStreamConnection.processPendingResults(InternalStreamConnection.java:528)
	at com.mongodb.connection.InternalStreamConnection.processPendingReads(InternalStreamConnection.java:424)
	at com.mongodb.connection.InternalStreamConnection.access$1300(InternalStreamConnection.java:55)
	at com.mongodb.connection.InternalStreamConnection$3.onResult(InternalStreamConnection.java:460)
	at com.mongodb.connection.InternalStreamConnection$3.onResult(InternalStreamConnection.java:449)
	at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.onSuccess(InternalStreamConnection.java:386)
	at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.access$900(InternalStreamConnection.java:341)
	at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback$ResponseBodyCallback.onResult(InternalStreamConnection.java:408)
	at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback$ResponseBodyCallback.onResult(InternalStreamConnection.java:392)
	at com.mongodb.connection.InternalStreamConnection$2.completed(InternalStreamConnection.java:273)
	at com.mongodb.connection.InternalStreamConnection$2.completed(InternalStreamConnection.java:270)
	at com.mongodb.connection.netty.NettyStream.readAsync(NettyStream.java:211)
	at com.mongodb.connection.InternalStreamConnection.fillAndFlipBuffer(InternalStreamConnection.java:270)
	at com.mongodb.connection.InternalStreamConnection.access$700(InternalStreamConnection.java:55)
	at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.onResult(InternalStreamConnection.java:364)
	at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.onResult(InternalStreamConnection.java:341)
	at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:53)
	at com.mongodb.connection.InternalStreamConnection$2.completed(InternalStreamConnection.java:273)
	at com.mongodb.connection.InternalStreamConnection$2.completed(InternalStreamConnection.java:270)
	at com.mongodb.connection.netty.NettyStream.readAsync(NettyStream.java:211)
	at com.mongodb.connection.netty.NettyStream.handleReadResponse(NettyStream.java:241)
	at com.mongodb.connection.netty.NettyStream.access$700(NettyStream.java:60)
	at com.mongodb.connection.netty.NettyStream$InboundBufferHandler.channelRead0(NettyStream.java:272)
	at com.mongodb.connection.netty.NettyStream$InboundBufferHandler.channelRead0(NettyStream.java:269)
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319)
	at io.netty.handler.timeout.ReadTimeoutHandler.channelRead(ReadTimeoutHandler.java:150)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:130)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
	at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
	at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
	at java.lang.Thread.run(Thread.java:662)



 Comments   
Comment by Jeffrey Yemin [ 31/Mar/15 ]

Closing all resolved 3.0.0 issues, as 3.0.0 has been tagged and released.

Comment by Githook User [ 24/Mar/15 ]

Author:

{u'username': u'jyemin', u'name': u'Jeff Yemin', u'email': u'jeff.yemin@10gen.com'}

Message: Removed race conditions in InternalStreamConnection by simplifying the requirements and then simplifying the synchronization.
Now that Connection interface is divided into sync and async variants, we can guarantee that at any given time an instance
of InternalStreamConnection is being using only synchronously or only asynchronously. By doing that receiveMessage and
receiveMessageAsync no longer need to coordinate their activities. The same for sendMessage and sendMessageAsync

JAVA-1674
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/073e013d78ba8d2048229fcaf1c02ead91b339d0

Comment by Githook User [ 18/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Improved trace logging

Moved calling of the passed callback in openAsync to the end of the open callback

JAVA-1674 JAVA-1694
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/d1019e4b910b8229b5c2c83934a91a4dbd9dcb2a

Comment by Githook User [ 18/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Added try catch to streamFactory.create

JAVA-1674 JAVA-1694
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/0b3ec2c4a41f19c6d5abb448b4f46c5835ac8a28

Comment by Githook User [ 18/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: InternalConnectionStream Logging improvements

Fixed open logging message order
Improved message when a read message is received and pending

JAVA-1674 JAVA-1694
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/619379bfd6005a06b6d7ff66849900fb0cd2d5bf

Comment by Githook User [ 18/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Added callbacks to assertions

So callbacks can use the assertion errors.

JAVA-1674 JAVA-1694
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/b0b5280d8c3c64e8d38dbb86c69033437ec7c342

Comment by Githook User [ 18/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Updated test timeouts for async operations

So that we capture the default MongoClientSettings timeout configurations.

JAVA-1674 JAVA-1694
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/a636b416ebfbe6de2d867fc2b122aa7fdb689f03

Comment by Githook User [ 18/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Improved connection logging

JAVA-1674 JAVA-1694
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/71b130acf8409b1227b4d16be998bb09e399bcf9

Comment by Githook User [ 18/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Reverted InternalStreamConnection

Made opened and isClosed atomic boolean
Updated opened before callback is called

JAVA-1674 JAVA-1694
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/6601e07129825afdcd661fd552af7b0079e65bd7

Comment by Githook User [ 17/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Simplified InternalConnectionStream

Now assumes exclusive use of the stream. The plan is for multithread use again in the future.
JAVA-1674
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/e5fd0e58d0b55eaeb6ee314ad1556ddab942e894

Comment by Githook User [ 13/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Reverting changes to InternalStreamConnection

Reverting 7164f701ca0cdb578b11e7c750b947396984ff98 2e69b2afbeefea40bc17fc0992c4b200afd10a76

JAVA-1674
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/8fbeb8bd5b28a4d57df01d90deb9e34ba434fba9

Comment by Githook User [ 13/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Always process any pending results immediately.

No need for the reading lock to process them
Improved readability of processPendingResults
JAVA-1674
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/2e69b2afbeefea40bc17fc0992c4b200afd10a76

Comment by Githook User [ 12/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Identified race condition in InternalStreamConnection

JAVA-1674
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/7164f701ca0cdb578b11e7c750b947396984ff98

Comment by Githook User [ 12/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Added more trace logging to InternalStreamConnection

Related to JAVA-1674
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/72e489a47724ce64f3c2e288a4e0aabafa5944f4

Comment by Githook User [ 12/Mar/15 ]

Author:

{u'username': u'rozza', u'name': u'Ross Lawley', u'email': u'ross.lawley@gmail.com'}

Message: Added extra test debugging

Related to JAVA-1674
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/fd523de465649b6b4ecfee745bdeca79c06d4075

Generated at Thu Feb 08 08:55:13 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.