[JAVA-3487] com.mongodb.MongoException: state should be: open when closing an change stream Created: 22/Oct/19  Updated: 28/Oct/23  Resolved: 15/Jan/20

Status: Closed
Project: Java Driver
Component/s: API
Affects Version/s: None
Fix Version/s: 3.12.1

Type: Bug Priority: Minor - P4
Reporter: Peter Assignee: Lamont Nelson
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

db version v4.0.8
git version: 9b00696ed75f65e1ebc8d635593bed79b290cfbb
allocator: tcmalloc
modules: none
build environment:
distmod: 2008plus-ssl
distarch: x86_64
target_arch: x86_64


Issue Links:
Related
related to JAVA-3938 Change stream connections not returned Closed

 Description   

When running this small main method i get an exception

 

public static void main(String[] args) throws InterruptedException {	
         MongoClient mongoClient = MongoClients.create("mongodb://localhost");
	MongoDatabase db = mongoClient.getDatabase("import");
	MongoCollection<Document> gameEntityCollection = db.getCollection("gameEnitites");
	gameEntityCollection.watch().subscribe(new Subscriber<ChangeStreamDocument<Document>>() {		@Override
		public void onSubscribe(Subscription s) {
			s.request(1);
			new Thread(() -> {
				try {
					Thread.sleep(100);
					s.cancel();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}).start();
		}		@Override
		public void onNext(ChangeStreamDocument<Document> t) {
		}		@Override
		public void onError(Throwable t) {
		}		@Override
		public void onComplete() {
		}
	});	Thread.sleep(10000);
}

com.mongodb.MongoException: state should be: open
	at com.mongodb.MongoException.fromThrowableNonNull(MongoException.java:79)
	at com.mongodb.async.client.AbstractSubscription.onError(AbstractSubscription.java:135)
	at com.mongodb.async.client.MongoIterableSubscription$2.onResult(MongoIterableSubscription.java:93)
	at com.mongodb.async.client.MongoIterableSubscription$2.onResult(MongoIterableSubscription.java:85)
	at com.mongodb.operation.AsyncChangeStreamBatchCursor$3.onResult(AsyncChangeStreamBatchCursor.java:133)
	at com.mongodb.operation.AsyncChangeStreamBatchCursor$3.onResult(AsyncChangeStreamBatchCursor.java:129)
	at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:49)
	at com.mongodb.operation.AsyncChangeStreamBatchCursor$4.onResult(AsyncChangeStreamBatchCursor.java:168)
	at com.mongodb.operation.AsyncChangeStreamBatchCursor$4.onResult(AsyncChangeStreamBatchCursor.java:159)
	at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:49)
	at com.mongodb.operation.AsyncQueryBatchCursor$CommandResultSingleResultCallback.onResult(AsyncQueryBatchCursor.java:331)
	at com.mongodb.operation.AsyncQueryBatchCursor$CommandResultSingleResultCallback.onResult(AsyncQueryBatchCursor.java:310)
	at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:49)
	at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor$2.onResult(DefaultServer.java:242)
	at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:49)
	at com.mongodb.internal.connection.CommandProtocolImpl$1.onResult(CommandProtocolImpl.java:83)
	at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection$1.onResult(DefaultConnectionPool.java:467)
	at com.mongodb.internal.connection.UsageTrackingInternalConnection$2.onResult(UsageTrackingInternalConnection.java:111)
	at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:49)
	at com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:401)
	at com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:376)
	at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:677)
	at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:644)
	at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:514)
	at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:511)
	at com.mongodb.internal.connection.AsynchronousChannelStream$BasicCompletionHandler.completed(AsynchronousChannelStream.java:220)
	at com.mongodb.internal.connection.AsynchronousChannelStream$BasicCompletionHandler.completed(AsynchronousChannelStream.java:203)
	at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:127)
	at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:282)
	at java.base/sun.nio.ch.WindowsAsynchronousSocketChannelImpl$ReadTask.completed(WindowsAsynchronousSocketChannelImpl.java:581)
	at java.base/sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:387)
	at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.lang.IllegalStateException: state should be: open
	at com.mongodb.assertions.Assertions.isTrue(Assertions.java:70)
	at com.mongodb.internal.session.BaseClientSessionImpl.advanceOperationTime(BaseClientSessionImpl.java:107)
	at com.mongodb.internal.session.ClientSessionContext.advanceOperationTime(ClientSessionContext.java:70)
	at com.mongodb.internal.connection.ClusterClockAdvancingSessionContext.advanceOperationTime(ClusterClockAdvancingSessionContext.java:76)
	at com.mongodb.internal.connection.InternalStreamConnection.updateSessionContext(InternalStreamConnection.java:537)
	at com.mongodb.internal.connection.InternalStreamConnection.access$800(InternalStreamConnection.java:76)
	at com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:385)
	... 15 common frames omitted

it seem to occour when in `AsyncChangeStreamBatchCursor.close`
`wrapped.close();` and `binding.release();` is called to fast one after the other. When i wait a bit with my debugger on `wrapped.close();` and then resume the exception does not occour.



 Comments   
Comment by Githook User [ 15/Jan/20 ]

Author:

{'name': 'John Stewart', 'email': 'john.stewart@mongodb.com', 'username': 'jstewart-mongo'}

Message: Delay close cursor in AsyncChangeStreamBatchCursor and
AsyncQueryBatchCursor while next/tryNext is in progress

JAVA-3487
Branch: 3.12.x
https://github.com/mongodb/mongo-java-driver/commit/612a2e1184981d857efba10895ccfd37991d0473

Comment by Githook User [ 15/Jan/20 ]

Author:

{'name': 'John Stewart', 'email': 'john.stewart@mongodb.com', 'username': 'jstewart-mongo'}

Message: Delay close cursor in AsyncChangeStreamBatchCursor and
AsyncQueryBatchCursor while next/tryNext is in progress

JAVA-3487
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/fb0ec0ef24c56dc1c4df1d7236b103b96e687b17

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