]
William Burns commented on ISPN-10073:
--------------------------------------
This is caused due to blocking the callback thread in the get invocation. The problem is
that the accept Consumer is invoked using the netty thread for the given channel, which
means the putIfAbsentAsync call here is not yet sent and thus the get will always block
forever. We need to isolate the callbacks to not be done on such important threads.
Nested async operations with HotRod client hang
-----------------------------------------------
Key: ISPN-10073
URL:
https://issues.jboss.org/browse/ISPN-10073
Project: Infinispan
Issue Type: Bug
Components: Hot Rod
Affects Versions: 9.4.10.Final
Reporter: Dejan Bosanac
Assignee: William Burns
Priority: Major
We noticed some issued with the HotRod client, when trying to use nested async calls.
Originally, this was discovered in the context of Vert.x tests, but below you can find the
smallest reproducer code that I could create (without any Vert.x dependencies).
{code:java}
//DefaultCacheManager cm = new DefaultCacheManager();
//Cache<String, String> cache = cm.createCache("default", new
ConfigurationBuilder().build());
RemoteCacheManager cm = new RemoteCacheManager();
RemoteCache<String, String> cache = cm.getCache("default");
final CompletableFuture put = new CompletableFuture();
cache.putIfAbsentAsync("A", "A").thenAccept(resultA -> {
final CompletableFuture nested = new CompletableFuture();
cache.putIfAbsentAsync("B", "B").thenAccept(resultB ->
{
nested.complete("B");
});
try {
nested.get();
} catch (Exception e) {
e.printStackTrace();
}
put.complete("B");
});
put.get();
{code}
This would basically hang and the nested operation would never receive response. What I
noticed in the original test is that response would become available after the framework
timeout the test.
Everything works as expected with embedded cache.