I post this in case it helps someone else -- I am using an Infinispan replicated cache with 2 members, using a custom JGroups config based on the Infinispan TCP config.
When using the async API, I was getting async org.infinispan.util.concurrent.TimeoutException on a regular basis, even though the key-value pair had in fact already been distributed to the other instance.
I figured out via git-bisect that if the JGroups TCP protocol setting oob_thread_pool.max_threads was 5 or less, I would get regular async timeouts, but if 6 or more than no timeouts would occur. I believe the Infinispan default is 8.
Since this value is so critical to Infinispan, it should probably check it on startup and complain if it is too low. On the other hand, this could simply be a bug in Infinispan.