RSocketRequester and RSocketResponder leak Reactor subscriptions when disconnecting
See original GitHub issueExpected Behavior
RSocketRequester and RSocketResponder should dispose of all associated resources when terminating.
Actual Behavior
RSocketRequester and RSocketResponder do not dispose of internal Flux subscriptions, creating a leak.
Steps to Reproduce
- Start a
RequesterResponderLeakReproducerServer
https://gist.github.com/mdindoffer/c0e65bd9075ca7bdc8b639ebbf2c0fde#file-requesterresponderleakreproducerserver-java - Start a
RequesterResponderLeakReproducerClient
https://gist.github.com/mdindoffer/c0e65bd9075ca7bdc8b639ebbf2c0fde#file-requesterresponderleakreproducerclient-java - Repeat step nr.2 ad lib
- Observe the number of active subscriptions increasing on the server side:
14-06-2022 15:05:02.337 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
14-06-2022 15:05:04.352 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
14-06-2022 15:05:06.363 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
14-06-2022 15:05:08.385 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketRequester.<init>(RSocketRequester.java:99)=2
io.rsocket.core.RSocketResponder.<init>(RSocketResponder.java:87)=2
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
14-06-2022 15:05:10.415 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketRequester.<init>(RSocketRequester.java:99)=2
io.rsocket.core.RSocketResponder.<init>(RSocketResponder.java:87)=2
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
14-06-2022 15:05:12.459 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketRequester.<init>(RSocketRequester.java:99)=2
io.rsocket.core.RSocketResponder.<init>(RSocketResponder.java:87)=2
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
14-06-2022 15:05:14.475 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketRequester.<init>(RSocketRequester.java:97)=1
io.rsocket.core.RSocketRequester.<init>(RSocketRequester.java:99)=3
io.rsocket.core.RSocketResponder.<init>(RSocketResponder.java:87)=3
io.rsocket.core.RSocketResponder.<init>(RSocketResponder.java:91)=1
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
io.rsocket.internal.BaseDuplexConnection.<init>(BaseDuplexConnection.java:30)=2
io.rsocket.keepalive.KeepAliveHandler$DefaultKeepAliveHandler.start(KeepAliveHandler.java:30)=1
io.rsocket.keepalive.KeepAliveSupport.start(KeepAliveSupport.java:72)=1
io.rsocket.transport.netty.TcpDuplexConnection.<init>(TcpDuplexConnection.java:52)=4
io.rsocket.transport.netty.server.TcpServerTransport.lambda$start$0(TcpServerTransport.java:115)=6
io.rsocket.transport.netty.server.TcpServerTransport.lambda$start$0(TcpServerTransport.java:119)=5
14-06-2022 15:05:16.495 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketRequester.<init>(RSocketRequester.java:99)=4
io.rsocket.core.RSocketResponder.<init>(RSocketResponder.java:87)=4
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
14-06-2022 15:05:18.509 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketRequester.<init>(RSocketRequester.java:99)=4
io.rsocket.core.RSocketResponder.<init>(RSocketResponder.java:87)=4
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
14-06-2022 15:05:20.553 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketRequester.<init>(RSocketRequester.java:99)=6
io.rsocket.core.RSocketResponder.<init>(RSocketResponder.java:87)=6
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
14-06-2022 15:05:22.573 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketRequester.<init>(RSocketRequester.java:99)=6
io.rsocket.core.RSocketResponder.<init>(RSocketResponder.java:87)=6
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
14-06-2022 15:05:24.592 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketRequester.<init>(RSocketRequester.java:99)=6
io.rsocket.core.RSocketResponder.<init>(RSocketResponder.java:87)=6
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
14-06-2022 15:05:26.636 [main] INFO RequesterResponderLeakReproducerServer - Active Reactor subscriptions:
io.rsocket.core.RSocketRequester.<init>(RSocketRequester.java:99)=8
io.rsocket.core.RSocketResponder.<init>(RSocketResponder.java:87)=8
io.rsocket.core.RSocketServer$2.lambda$get$2(RSocketServer.java:317)=1
Possible Solution
Calling dispose on the Disposable when terminating.
Your Environment
- JDK 17
- RSocket 1.1.2
Issue Analytics
- State:
- Created a year ago
- Comments:7 (5 by maintainers)
Top Results From Across the Web
Issues · rsocket/rsocket-java - GitHub
Ability to store session object inside RSocketRequester chain ... RSocketRequester and RSocketResponder leak Reactor subscriptions when disconnecting.
Read more >Correct usage of LoadbalanceRSocketClient with Spring's ...
Builder is autowired by Spring boot RSocketRequester requester ... such RSocket will be disconnected, we will not be trying to subscribe to ...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
@mdindoffer as it turned out, the issue it selves is related to reactor netty and should be fixed with #2441 and 1.1.3 release
this is still to be fixed