[ https://issues.apache.org/jira/browse/ARTEMIS-2945?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Francesco Nigro updated ARTEMIS-2945: ------------------------------------- Summary: Artemis native JNI code can be replaced by Java (was: Artemis native JNI code code be replaced by Java) > Artemis native JNI code can be replaced by Java > ----------------------------------------------- > > Key: ARTEMIS-2945 > URL: https://issues.apache.org/jira/browse/ARTEMIS-2945 > Project: ActiveMQ Artemis > Issue Type: Improvement > Components: Broker > Affects Versions: 2.15.0 > Reporter: Francesco Nigro > Assignee: Francesco Nigro > Priority: Major > > LibAIO JNI code could be rewritten in Java, while keeping the LibaioContext > and LibaioFile APIs the same. > > There are few benefits from this: > # simplification of C code logic to ease maintain it > # quicker development process (implement-try-test-debug cycle) for non-C > programmers, including simpler integration with Java test suites > # easier monitoring/telemetry integration > > As demonstrations/proofs of such benefits I would introduce several changes > into the Java version: > # using the libaio async fdatasync feature to allow the LibaioContext duty > cycle loop to free CPU resources in order to handle compaction reads without > being slowed down by an in-progress fdatasync > # use a lock-free high performance data structure to reuse iocbs instead of > a locked (using a mutex) one > # expose in-flight callbacks to allow future PRs to introduce Java-only > latency telemetry per-request or just error check/kill of "slow" in-flight > requests > > The possible drawbacks are: > # slower performance due to GC barriers cost (see the notes on the PR code) > # slower performance in case of JVM without Unsafe (that means very few) > The latter issue could be addressed by using the new/proper VarHandle > features when the Artemis min supported version will move from Java 8 or > using the same approach on other projects relying on it eg Netty. > A note about how to correctly benchmark this due to how I've implemented > async fdatasync: in order to save both LibaioContext and TimedBuffer to > perform fdatasync batching of writes, I've preferred to simplify the > LibaioContext: it means that the buffer timeout to be used on broker.xml > should be obtained by ./artemis perf-journal --sync-writes ie batching writes > at the speed of the measured fdatasync RTT latency. > This last behaviour could be changed used a more Apple-to-Apple approach > although I still think that the beauty of using is Java is exactly to bring > new features/logics in with a shorter development cycle :) > We're not in hurry to get this done so that perf-wise this feature could be > implemented improving performance over the original version too, if possible. > > > > -- This message was sent by Atlassian Jira (v8.3.4#803005)