before I begin, a little introduction:
I lead the Infinispan project  which is an in-memory data grid
written in Java.
Infinispan stores data in memory in "caches" which are k/v data
structures where the "v" can either be a raw binary blob or a structured
object (we default to ProtoBuf).
Caches can be backed by a persistent store. We have a number of such
stores (file, rocksdb, database, etc).
I've been working on a Ceph cache store. The initial intention was to
use the rados-java client  but unfortunately this uses JNA. While JNA
is very convenient because it doesn't require building the additional
native bits that JNI requires, its performance overhead is ... terrible.
I have therefore started working on a JNI Rados client which is looking
quite promising. I hope to share my initial implementation with you
soon, including some benchmark comparisons against the JNA counterpart.
In the meantime, I need some insights into how librados handles the
"aio" set of functions, in particular related to whether there is any
blocking involved and how the threading model works (if there is any).