This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch branch-panama
in repository https://gitbox.apache.org/repos/asf/artemis-native.git

commit 4999a5b36389ddc27907fbfb5e0a4e5adf32ad6b
Author: mayankkunwar <[email protected]>
AuthorDate: Wed Apr 22 22:34:03 2026 +0100

    Adding JMH test and removed all loggers
---
 pom.xml                                            |  26 ++-
 .../artemis/nativo/jlibaio/ffm/AIORing.java        |   6 +-
 .../nativo/jlibaio/ffm/CallbackRegistry.java       |   4 +-
 .../nativo/jlibaio/ffm/FFMNativeHelper.java        | 200 ++++++++++-----------
 .../artemis/nativo/jlibaio/test/LibaioTest.java    |   4 +-
 .../test => test/ffm}/FFMNativeHelperTest.java     |   2 +-
 .../{ffm/test => test/ffm}/IOCBLayoutTest.java     |   2 +-
 .../{ffm/test => test/ffm}/IOControlTest.java      |   2 +-
 .../test/performance/jmh/AioCompareBenchmark.java  | 177 ++++++++++++++++++
 .../test/performance/jmh/BenchmarkRunner.java      |  11 ++
 10 files changed, 322 insertions(+), 112 deletions(-)

diff --git a/pom.xml b/pom.xml
index 3d049b6..ebb27aa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,6 +38,7 @@
         <version.org.jacoco.plugin>0.8.6</version.org.jacoco.plugin>
         <surefire.version>2.22.2</surefire.version>
         <junit.version>4.13.2</junit.version>
+        <jmh.version>1.37</jmh.version>
         <maven.bundle.plugin.version>5.1.2</maven.bundle.plugin.version>
         <exec-maven-plugin.version>3.0.0</exec-maven-plugin.version>
         <maven-enforcer-plugin.version>3.0.0</maven-enforcer-plugin.version>
@@ -110,6 +111,18 @@
             <version>5.10.2</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-core</artifactId>
+            <version>${jmh.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-generator-annprocess</artifactId>
+            <version>${jmh.version}</version>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.jacoco</groupId>
             <artifactId>org.jacoco.ant</artifactId>
@@ -431,6 +444,15 @@
                         </configuration>
                     </execution>
                 </executions>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>org.openjdk.jmh</groupId>
+                            <artifactId>jmh-generator-annprocess</artifactId>
+                            <version>${jmh.version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
             </plugin>
 
             <plugin>
@@ -439,8 +461,8 @@
                 <extensions>true</extensions>
                 <configuration>
                     <instructions>
-                        <!-- Adding Bundle-NativeCode to allow loading library 
from bundle. The asterisk at the end is important, so bundle resolves also 
without a matching library, e.g. on Windows. -->
-<!--                        
<Bundle-NativeCode>lib/linux-i686/libartemis-native-32.so; osname=Linux; 
processor=x86, lib/linux-x86_64/libartemis-native-64.so; osname=Linux; 
processor=x86-64, *</Bundle-NativeCode>-->
+                         Adding Bundle-NativeCode to allow loading library 
from bundle. The asterisk at the end is important, so bundle resolves also 
without a matching library, e.g. on Windows.
+                        
<Bundle-NativeCode>lib/linux-i686/libartemis-native-32.so; osname=Linux; 
processor=x86, lib/linux-x86_64/libartemis-native-64.so; osname=Linux; 
processor=x86-64, *</Bundle-NativeCode>
                     </instructions>
                 </configuration>
             </plugin>
diff --git 
a/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/AIORing.java 
b/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/AIORing.java
index 862b58e..4268e1f 100644
--- a/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/AIORing.java
+++ b/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/AIORing.java
@@ -30,7 +30,7 @@ import static 
org.apache.activemq.artemis.nativo.jlibaio.ffm.Constants.AIO_RING_
 import static 
org.apache.activemq.artemis.nativo.jlibaio.ffm.IOEvent.IO_EVENT_LAYOUT;
 
 public class AIORing {
-    private static final Logger logger = 
LoggerFactory.getLogger(AIORing.class);
+//    private static final Logger logger = 
LoggerFactory.getLogger(AIORing.class);
 
     /** There is no defined aio_ring anywhere in an include,
      This is an implementation detail, that is a binary contract.
@@ -70,7 +70,7 @@ public class AIORing {
         int magic = (int) AIO_RING_MAGIC_VH.getAcquire(header, 0L);
         int incompat = (int) AIO_RING_INCOMPAT_FEATURES_VH.getAcquire(header, 
0L);
         int nr = (int) AIO_RING_NR_VH.getAcquire(header, 0L);
-        logger.trace("nr={}, magic={}, incompat={}", nr, magic, incompat);
+//        logger.trace("nr={}, magic={}, incompat={}", nr, magic, incompat);
 
         return magic == AIO_RING_MAGIC
                 && incompat == AIO_RING_INCOMPAT_FEATURES
@@ -97,7 +97,7 @@ public class AIORing {
         try {
             fullSize = Math.addExact(AIO_RING_HEADER_SIZE, 
Math.multiplyExact((long) nr, eventBytesize));
         } catch (ArithmeticException e) {
-            logger.warn("toAioRing: overflow computing ring size (nr={}, 
eventBytes={})", nr, eventBytesize);
+//            logger.warn("toAioRing: overflow computing ring size (nr={}, 
eventBytes={})", nr, eventBytesize);
             return MemorySegment.NULL;
         }
 
diff --git 
a/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/CallbackRegistry.java
 
b/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/CallbackRegistry.java
index b60f2bc..8d86038 100644
--- 
a/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/CallbackRegistry.java
+++ 
b/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/CallbackRegistry.java
@@ -25,7 +25,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
 
 public class CallbackRegistry<Callback extends SubmitInfo> {
-    private static final Logger logger = 
LoggerFactory.getLogger(CallbackRegistry.class);
+//    private static final Logger logger = 
LoggerFactory.getLogger(CallbackRegistry.class);
     private final ConcurrentHashMap<Long, Callback> registry = new 
ConcurrentHashMap<>();
     private final AtomicLong idGenerator = new AtomicLong(0);
 
@@ -44,7 +44,7 @@ public class CallbackRegistry<Callback extends SubmitInfo> {
             id = idGenerator.incrementAndGet();
         } while (id == -1 || id == 0);
         registry.put(id, callback);
-        logger.debug("CallbackRegistry::register id = {}, callback = {}", id, 
callback);
+//        logger.debug("CallbackRegistry::register id = {}, callback = {}", 
id, callback);
         return id;
     }
 
diff --git 
a/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/FFMNativeHelper.java
 
b/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/FFMNativeHelper.java
index 61c6f2b..9101936 100644
--- 
a/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/FFMNativeHelper.java
+++ 
b/src/main/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/FFMNativeHelper.java
@@ -70,7 +70,7 @@ import static 
org.apache.activemq.artemis.nativo.jlibaio.ffm.IOEvent.IO_EVENT_LA
 import static org.apache.activemq.artemis.nativo.jlibaio.ffm.Stat.STAT_LAYOUT;
 
 public class FFMNativeHelper<Callback extends SubmitInfo> {
-    private static final Logger logger = 
LoggerFactory.getLogger(FFMNativeHelper.class);
+//    private static final Logger logger = 
LoggerFactory.getLogger(FFMNativeHelper.class);
 
     private static volatile MemorySegment oneMegaBuffer;
 
@@ -90,7 +90,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
         try {
             Integer fd = DUMB_FD.get();
             if(fd != null && fd >= 0) {
-                logger.trace("Dumb FD already initialized: {}", fd);
+//                logger.trace("Dumb FD already initialized: {}", fd);
                 return fd;
             }
             Path tempDir = Path.of(System.getProperty("java.io.tmpdir"));
@@ -108,7 +108,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
             }
 
             DUMB_FD.set(fd);
-            logger.debug("Dumb FD created: {}, path = {}", fd, DUMB_PATH);
+//            logger.debug("Dumb FD created: {}, path = {}", fd, DUMB_PATH);
             return fd;
         } catch (IOException e) {
             throw new RuntimeException(e);
@@ -125,9 +125,9 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
                         Path path = Path.of(DUMB_PATH);
                         Files.deleteIfExists(path);
                     }
-                    logger.debug("Dumb FD closed and file removed: fd={}, 
path={}", fd, DUMB_PATH);
+//                    logger.debug("Dumb FD closed and file removed: fd={}, 
path={}", fd, DUMB_PATH);
                 } catch (IOException e) {
-                    logger.warn("Failed to close/remove dumb FD {}: {}", fd, 
e.getMessage());
+//                    logger.warn("Failed to close/remove dumb FD {}: {}", fd, 
e.getMessage());
                 }
             }
         } finally {
@@ -148,30 +148,30 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
     // This implementation will look at the internal structure (aio_ring) and 
move along the memory result
     private int ringioGetEvents(MemorySegment aioCtxAddr, MemorySegment 
events, int min, int max, MemorySegment timeout) throws Throwable {
         if (aioCtxAddr == null || aioCtxAddr.address() == 0) {
-            logger.trace("ringioGetEvents: aioCtxAddr is null -> syscall");
+//            logger.trace("ringioGetEvents: aioCtxAddr is null -> syscall");
             return ioGetEvents(aioCtxAddr, events, min, max, timeout);
         }
 
         if (min < 0 || max <= 0 || min > max) {
-            logger.warn("ringioGetEvents: invalid parameters: min={}, max={}", 
min, max);
+//            logger.warn("ringioGetEvents: invalid parameters: min={}, 
max={}", min, max);
             return ioGetEvents(aioCtxAddr, events, min, max, timeout);
         }
 
         MemorySegment ring  = toAioRing(aioCtxAddr);
         if(ring.address() == 0) {
-            logger.trace("toAioRing failed -> syscall");
+//            logger.trace("toAioRing failed -> syscall");
             return ioGetEvents(aioCtxAddr, events, min, max, timeout);
         }
 
         //checks if it could be completed in user space, saving a sys call
         if(!(RING_REAPER && !isForceSyscall() && hasUsableRing(ring))) {
-            logger.trace("kernel not supporting ring buffer");
+//            logger.trace("kernel not supporting ring buffer");
             return ioGetEvents(aioCtxAddr, events, min, max, timeout);
         }
 
         int ringNr = (int) AIO_RING_NR_VH.getAcquire(ring, 0L);
         if (ringNr <= 0) {
-            logger.trace("ringioGetEvents: invalid ring size {} -> syscall", 
ringNr);
+//            logger.trace("ringioGetEvents: invalid ring size {} -> syscall", 
ringNr);
             return ioGetEvents(aioCtxAddr, events, min, max, timeout);
         }
 
@@ -185,7 +185,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
             available += ringNr;
         }
 
-        logger.trace("tail={}, head={} nr={} available={}", tail, head, 
ringNr, available);
+//        logger.trace("tail={}, head={} nr={} available={}", tail, head, 
ringNr, available);
 
         boolean timeoutZero = false;
         if (timeout != null && timeout.address() != 0) {
@@ -194,7 +194,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
         }
 
         if (available < min && !timeoutZero) {
-            logger.trace("ringioGetEvents: not enough available events -> 
syscall");
+//            logger.trace("ringioGetEvents: not enough available events -> 
syscall");
             return ioGetEvents(aioCtxAddr, events, min, max, timeout);
         }
 
@@ -212,7 +212,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
             // while (ring->tail == tail) mem_barrier();
             //
             // however eventually we could have available==max in a legal 
situation what could lead to infinite loop here
-            logger.trace("ringioGetEvents: ring full ({}>= {}) → syscall", 
available, max);
+//            logger.trace("ringioGetEvents: ring full ({}>= {}) → syscall", 
available, max);
             return  ioGetEvents(aioCtxAddr, events, min, max, timeout);
 
             // also: I could have called io_getevents to the one at the end of 
this method
@@ -233,8 +233,8 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
         try {
             requiredBytes = Math.multiplyExact((long) max, eventSize);
         } catch (ArithmeticException e) {
-            logger.warn("ringioGetEvents: overflow computing required event 
bytes max={}, eventSize={}",
-                    max, eventSize);
+//            logger.warn("ringioGetEvents: overflow computing required event 
bytes max={}, eventSize={}",
+//                    max, eventSize);
             return ioGetEvents(aioCtxAddr, events, min, max, timeout);
         }
 
@@ -265,7 +265,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
         int newHead = (head + available) % ringNr;
         AIO_RING_HEAD_VH.setRelease(ring, 0L, newHead);
 
-        logger.trace("consumed non sys-call = {}", available);
+//        logger.trace("consumed non sys-call = {}", available);
         return available;
     }
 
@@ -285,7 +285,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
 
             if(result < 0) {
                 int errno = (int) ERRNO_VH.get(captureState, 0L);
-                logger.warn("ioGetEvents: failed to call IO_GETEVENTS_HANDLE. 
result={}, errno={}", result, errno);
+//                logger.warn("ioGetEvents: failed to call 
IO_GETEVENTS_HANDLE. result={}, errno={}", result, errno);
             }
             return result;
         }
@@ -297,7 +297,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
             if (oneMegaBuffer != null) {
                 freeBuffer(oneMegaBuffer);
                 oneMegaBuffer = null;
-                logger.debug("One mega buffer freed");
+//                logger.debug("One mega buffer freed");
             }
         } finally {
             oneMegaMutex.unlock();
@@ -305,14 +305,14 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
     }
 
     public static void shutdownHook() {
-        logger.debug("FFMNativeHelper shutdown hook executing");
+//        logger.debug("FFMNativeHelper shutdown hook executing");
         closeDumbFd();
         freeOneMegaBuffer();
     }
 
     public static void setForceSyscall(boolean value) {
         forceSysCall.set(value);
-        logger.info("forceSysCall={}", value);
+//        logger.info("forceSysCall={}", value);
     }
 
     public static boolean isForceSyscall() {
@@ -320,7 +320,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
     }
 
     public IOControl newContext(int queueSize) {
-        logger.debug("Initializing context with QueueSize={}", queueSize);
+//        logger.debug("Initializing context with QueueSize={}", queueSize);
 
         IOControl ioControl = new IOControl();
         try {
@@ -354,11 +354,11 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
             ioControl.setIocbPool(iocbPool);
             ioControl.setQueueSize(queueSize);
 
-            logger.debug("Context created successfully: queueSize={}, 
ioContext=0x{}",
-                    queueSize, Long.toHexString(ioContext.address()));
+//            logger.debug("Context created successfully: queueSize={}, 
ioContext=0x{}",
+//                    queueSize, Long.toHexString(ioContext.address()));
             return ioControl;
         } catch (Throwable t) {
-            logger.error("newContext failed: queueSize={}, error={}", 
queueSize, t.getMessage(), t);
+//            logger.error("newContext failed: queueSize={}, error={}", 
queueSize, t.getMessage(), t);
             throw new RuntimeException(t);
         }
     }
@@ -371,14 +371,14 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
             MemorySegment captureState = arena.allocate(CAPTURE_STATE_LAYOUT);
             int result = (int) IO_QUEUE_RELEASE_HANDLE.invoke(captureState, 
ioContext);
             if(result < 0) {
-                logger.warn("io_queue_release(0x{}) failed: errno={}",
-                        Long.toHexString(ioContext.address()), 
ERRNO_VH.get(captureState, 0L));
+//                logger.warn("io_queue_release(0x{}) failed: errno={}",
+//                        Long.toHexString(ioContext.address()), 
ERRNO_VH.get(captureState, 0L));
             } else {
-                logger.trace("io_queue_release(0x{}) successful",
-                        Long.toHexString(ioContext.address()));
+//                logger.trace("io_queue_release(0x{}) successful",
+//                        Long.toHexString(ioContext.address()));
             }
         } catch (Throwable e) {
-            logger.warn("ioQueueRelease failed: error:{}", e.getMessage(), e);
+//            logger.warn("ioQueueRelease failed: error:{}", e.getMessage(), 
e);
         }
     }
 
@@ -405,8 +405,8 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
                 throw new IOException("io_queue_init failed: " + 
ERRNO_VH.get(captureState, 0L));
             }
             long rawAddress = ctx.get(ValueLayout.JAVA_LONG, 0L);
-            logger.trace("ioQueueInit({}) → 0x{} (result={})",
-                    queueSize, Long.toHexString(rawAddress), result);
+//            logger.trace("ioQueueInit({}) → 0x{} (result={})",
+//                    queueSize, Long.toHexString(rawAddress), result);
             return MemorySegment.ofAddress(rawAddress).reinterpret(1, 
Arena.global(),null);
         } catch (Throwable e) {
             throw new RuntimeException(e);
@@ -415,15 +415,15 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
 
     public void deleteContext(IOControl ioControl) {
         if(ioControl == null) {
-            logger.debug("deleteContext: null ioControl");
+//            logger.debug("deleteContext: null ioControl");
             return;
         }
         if(!ioControl.isValid()) {
-            logger.warn("deleteContext: invalid ioControl");
+//            logger.warn("deleteContext: invalid ioControl");
             return;
         }
-        logger.debug("deleteContext: queueSize={}, ioContext=0x{}",
-                ioControl.queueSize(), 
Long.toHexString(ioControl.ioContext().address()));
+//        logger.debug("deleteContext: queueSize={}, ioContext=0x{}",
+//                ioControl.queueSize(), 
Long.toHexString(ioControl.ioContext().address()));
         try {
             MemorySegment dumbIocb = ioControl.getIOCB();
             if(dumbIocb == null || dumbIocb.address() == 0) {
@@ -433,10 +433,10 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
             IOCBInit.setAioData(dumbIocb, -1L);
 
             if(!submit(ioControl, dumbIocb)) {
-                logger.warn("deleteContext: submit failed: Continuing 
cleanup");
+//                logger.warn("deleteContext: submit failed: Continuing 
cleanup");
                 return;
             } else {
-                logger.debug("deleteContext: dumb write submitted (fd={})", 
DUMB_WRITE_HANDLER);
+//                logger.debug("deleteContext: dumb write submitted (fd={})", 
DUMB_WRITE_HANDLER);
             }
 
             // to make sure the poll has finished
@@ -448,10 +448,10 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
                 try {
                     int result = ringioGetEvents(ioControl.ioContext(), 
ioControl.events(), 0, 1, null);
                     if(result <= 0) {
-                        logger.trace("deleteContext: drain complete 
(result={})", result);
+//                        logger.trace("deleteContext: drain complete 
(result={})", result);
                         break;
                     }
-                    logger.debug("deleteContext: drained {} pending IOCBs", 
result);
+//                    logger.debug("deleteContext: drained {} pending IOCBs", 
result);
                     MemorySegment events = ioControl.events();
                     events = events.reinterpret((long) result * 
IO_EVENT_LAYOUT.byteSize());
                     for (int i = 0; i < result; i++) {
@@ -464,11 +464,11 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
                     }
                     drained += result;
                 } catch (Throwable t) {
-                    logger.warn("deleteContext: drain unexpected error: {}", 
t.getMessage());
+//                    logger.warn("deleteContext: drain unexpected error: {}", 
t.getMessage());
                     break;
                 }
             }
-            logger.trace("deleteContext: drained {} IOCBs under lock", 
drained);
+//            logger.trace("deleteContext: drained {} IOCBs under lock", 
drained);
 
             ioQueueRelease(ioControl.ioContext());
 
@@ -482,11 +482,11 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
             }
 
             freeBuffer(ioControl.events());
-            logger.debug("deleteContext completed successfully");
+//            logger.debug("deleteContext completed successfully");
         } catch (IOException e) {
-            logger.warn("deleteContext: {}", e.getMessage());
+//            logger.warn("deleteContext: {}", e.getMessage());
         } catch (Throwable e) {
-            logger.error("deleteContext: unexpected error", e);
+//            logger.error("deleteContext: unexpected error", e);
         }
     }
 
@@ -494,7 +494,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
         int flags = O_RDWR | O_CREAT;
         if (direct) {
             flags |= O_DIRECT;
-            logger.debug("Opening with O_DIRECT= {}", 
Integer.toHexString(O_DIRECT));
+//            logger.debug("Opening with O_DIRECT= {}", 
Integer.toHexString(O_DIRECT));
         }
         try (Arena arena = Arena.ofConfined()) {
             // manually ensuring null termination by adding "\0"
@@ -505,12 +505,12 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
 
             if (fd < 0) {
                 int errorCode = (int) ERRNO_VH.get(captureState, 0L);
-                logger.error("open failed: path={}, flags={}, direct={}, 
errno={}",
-                        filePath, Integer.toHexString(flags), direct, 
errorCode);
+//                logger.error("open failed: path={}, flags={}, direct={}, 
errno={}",
+//                        filePath, Integer.toHexString(flags), direct, 
errorCode);
                 throw new IOException("Open failed for filePath = "
                         + filePath + " with fd errno = " + errorCode);
             }
-            logger.debug("Opened {} with fd = {}", direct ? "O_DIRECT" : 
"normal", fd);
+//            logger.debug("Opened {} with fd = {}", direct ? "O_DIRECT" : 
"normal", fd);
             return fd;
         } catch (Throwable t) {
             throw new IOException("Failed to open " + filePath, t);
@@ -528,7 +528,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
                 throw new IOException("Error during close for fd = " + fd
                         + ", error code = " + errorCode);
             }
-            logger.debug("File with fd = {} is successfully closed", fd);
+//            logger.debug("File with fd = {} is successfully closed", fd);
         } catch (Throwable t) {
             throw new IOException(t);
         }
@@ -558,8 +558,8 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
             }
             //zero initialization
             MEMSET_HANDLE.invoke(memorySegment, 0, (long) size);
-            logger.debug("posix_memalign(addrs={}, size={}, align={})",
-                    Long.toHexString(memorySegment.address()), size, 
alignment);
+//            logger.debug("posix_memalign(addrs={}, size={}, align={})",
+//                    Long.toHexString(memorySegment.address()), size, 
alignment);
             return memorySegment;
         } catch (Throwable t) {
             throw new RuntimeException("newAlignedBuffer failed", t);
@@ -568,13 +568,13 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
 
     public static void freeBuffer(MemorySegment memorySegment) {
         if(memorySegment == null || memorySegment.address() == 0) {
-            logger.debug("freeBuffer: memorySegment is null");
+//            logger.debug("freeBuffer: memorySegment is null");
         }
         try {
-            if(logger.isTraceEnabled()) {
-                logger.trace("freeing buffer at address: 0x{} with 
capacity={}",
-                        Long.toHexString(memorySegment.address()), 
memorySegment.asByteBuffer().capacity());
-            }
+//            if(logger.isTraceEnabled()) {
+//                logger.trace("freeing buffer at address: 0x{} with 
capacity={}",
+//                        Long.toHexString(memorySegment.address()), 
memorySegment.asByteBuffer().capacity());
+//            }
             FREE_BUF_HANDLE.invoke(memorySegment);
         } catch (Throwable t) {
             throw new RuntimeException("freeBuffer: Native free failed for 
address 0x" +
@@ -594,10 +594,10 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
             MemorySegment iocbArray = arena.allocate(ValueLayout.ADDRESS, 1);
             iocbArray.setAtIndex(ValueLayout.JAVA_LONG, 0, iocb.address());
 
-            logger.trace("submit: ctx=0x{}, iocb=0x{}, iocbArray=0x{}",
-                    Long.toHexString(ioControl.ioContext().address()),
-                    Long.toHexString(iocb.address()),
-                    Long.toHexString(iocbArray.address()));
+//            logger.trace("submit: ctx=0x{}, iocb=0x{}, iocbArray=0x{}",
+//                    Long.toHexString(ioControl.ioContext().address()),
+//                    Long.toHexString(iocb.address()),
+//                    Long.toHexString(iocbArray.address()));
 
             result = (int) IO_SUBMIT_HANDLE.invoke(captureState,
                     ioControl.ioContext(),
@@ -631,7 +631,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
             throw new IOException("IOCB pool exhausted (used=" + 
ioControl.used() +
                     "/queueSize=" + ioControl.queueSize() + ")");
         }
-        logger.trace("submitWrite called!");
+//        logger.trace("submitWrite called!");
         long callbackId = registry.register(callback);
         boolean submitted = false;
         try {
@@ -666,7 +666,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
     * */
     private void ioPrepPOp(MemorySegment iocb, int fd, MemorySegment buffer, 
long nbytes, long offset, int op) {
         if (iocb == null) {
-            logger.trace("ioPrepPOp: iocb is null");
+//            logger.trace("ioPrepPOp: iocb is null");
             return;
         }
         IOCBInit.setAioFildes(iocb, fd);
@@ -689,7 +689,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
             throw new IOException("IOCB pool exhausted");
         }
 
-        logger.trace("submitRead called!");
+//        logger.trace("submitRead called!");
         long callbackId = registry.register(callback);
         boolean submitted = false;
         try {
@@ -710,20 +710,20 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
 
     public int poll(IOControl ioControl, Callback[] callbacks, int min, int 
max) {
         if(ioControl == null || !ioControl.isValid()) {
-            logger.warn("poll: invalid context");
+//            logger.warn("poll: invalid context");
             return 0;
         }
 
         try {
             int result = ringioGetEvents(ioControl.ioContext(), 
ioControl.events(), min, max, null);
-            logger.trace("poll harvested {} events (min={}, max={})", result, 
min, max);
+//            logger.trace("poll harvested {} events (min={}, max={})", 
result, min, max);
             if(result <= 0) {
                 return result;
             }
 
             MemorySegment events = ioControl.events();
             if(!events.scope().isAlive()) {
-                logger.error("Poll:: CRITICAL: Events segment is closed before 
polling!");
+//                logger.error("Poll:: CRITICAL: Events segment is closed 
before polling!");
                 return 0;
             }
 
@@ -734,15 +734,15 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
                 MemorySegment iocbp = event.get(ValueLayout.ADDRESS, 8L)
                         .reinterpret(64);
                 int eventResult = (int) event.get(ValueLayout.JAVA_LONG, 16L);
-                logger.trace("poll[{}]: res={}, iocbp=0x{}", i, eventResult, 
Long.toHexString(iocbp.address()));
+//                logger.trace("poll[{}]: res={}, iocbp=0x{}", i, eventResult, 
Long.toHexString(iocbp.address()));
 
                 if(eventResult < 0) {
-                    logger.warn("poll[{}]: I/O error: {}", i, eventResult);
+//                    logger.warn("poll[{}]: I/O error: {}", i, eventResult);
                 }
 
                 long callbackIdRaw = IOCBInit.getAioData(iocbp);
                 if(callbackIdRaw == 0L || callbackIdRaw == -1L) {
-                    logger.warn("poll[{}]: invalid callback=0x{}", i, 
Long.toHexString(callbackIdRaw));
+//                    logger.warn("poll[{}]: invalid callback=0x{}", i, 
Long.toHexString(callbackIdRaw));
                     ioControl.putIOCB(iocbp);
                     continue;
                 }
@@ -760,22 +760,22 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
                     }
                     registry.removeCallbackById(callbackIdRaw);
                 } else {
-                    logger.warn("poll[{}]: callback not found for id=0x{}",
-                            i, Long.toHexString(callbackIdRaw));
+//                    logger.warn("poll[{}]: callback not found for id=0x{}",
+//                            i, Long.toHexString(callbackIdRaw));
                 }
                 ioControl.putIOCB(iocbp);
             }
             return result;
         } catch (Throwable e) {
-            logger.error("poll failed", e);
+//            logger.error("poll failed", e);
             return -1;
         }
     }
 
     public void blockedPoll(IOControl ioControl, boolean useFdatasync) {
-        logger.debug("blockedPoll starting(useFdatasync={})", useFdatasync);
+//        logger.debug("blockedPoll starting(useFdatasync={})", useFdatasync);
         if(ioControl == null || !ioControl.isValid()) {
-            logger.warn("blockedPoll: invalid context");
+//            logger.warn("blockedPoll: invalid context");
             return;
         }
 
@@ -786,22 +786,22 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
 
                 while(running) {
                     if(!ioControl.isValid()) {
-                        logger.debug("blockedPoll: context destroyed - 
self-exit");
+//                        logger.debug("blockedPoll: context destroyed - 
self-exit");
                         break;
                     }
                     int result = ringioGetEvents(ioControl.ioContext(),
                             ioControl.events(), 1, ioControl.queueSize(), 
null);
                     if(result == -4) {
-                        logger.trace("blockedPoll: EINTR - ignoring (jmap?)");
+//                        logger.trace("blockedPoll: EINTR - ignoring 
(jmap?)");
                         continue;
                     }
 
                     if(result < 0) {
-                        logger.error("blockedPoll: ringio_get_events failed: 
{}", result);
+//                        logger.error("blockedPoll: ringio_get_events failed: 
{}", result);
                         throw new IOException("blockedPoll: ringio_get_events 
failed:" + result);
                     }
 
-                    logger.trace("blockedPoll returned: {} events", result);
+//                    logger.trace("blockedPoll returned: {} events", result);
                     lastFile = -1;
 
                     MemorySegment harvestedEvents = ioControl.events()
@@ -817,7 +817,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
 
                         int fd = IOCBInit.getAioFildes(iocbp);
                         if(fd == DUMB_WRITE_HANDLER ) {
-                            logger.trace("blockedPoll: shutdown signal 
detected (dumb fd={})", fd);
+//                            logger.trace("blockedPoll: shutdown signal 
detected (dumb fd={})", fd);
                             ioControl.putIOCB(iocbp);
                             running = false;
                             break;
@@ -831,7 +831,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
                         int eventResult = (int) 
event.get(ValueLayout.JAVA_LONG, 16L);
 
                         long callbackIdRaw = IOCBInit.getAioData(iocbp);
-                        logger.trace("blockedPoll: callbackIdRaw: {}", 
callbackIdRaw);
+//                        logger.trace("blockedPoll: callbackIdRaw: {}", 
callbackIdRaw);
                         IOCBInit.setAioData(iocbp, 0L); // this is to detect 
invalid elements on the buffer.
 
                         if(callbackIdRaw != 0L) {
@@ -839,11 +839,11 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
                             Callback callback = 
registry.findCallbackById(callbackIdRaw);
                             if (callback != null) {
                                 if (eventResult < 0) {
-                                    logger.error("blockedPoll[{}]: I/O error 
fd={}, {}", i, fd, eventResult);
+//                                    logger.error("blockedPoll[{}]: I/O error 
fd={}, {}", i, fd, eventResult);
                                     callback.onError(eventResult, "I/O error 
in blockedPoll");
                                 } else {
                                     callback.done();
-                                    logger.trace("callback executed!");
+//                                    logger.trace("callback executed!");
                                 }
                                 if (releaseCallback != null) {
                                     releaseCallback.release();
@@ -852,17 +852,17 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
                             }
                         } else {
                             if(!forceSysCall.get()) {
-                                logger.warn("blockedPoll: Warning from 
ActiveMQ Artemis Native Layer: Your system is hitting duplicate / invalid 
records from libaio, which is a bug on the Linux Kernel you are using.You 
should set property org.apache.activemq.artemis.native.jlibaio.FORCE_SYSCALL=1 
or upgrade to a kernel version that contains a fix");
+//                                logger.warn("blockedPoll: Warning from 
ActiveMQ Artemis Native Layer: Your system is hitting duplicate / invalid 
records from libaio, which is a bug on the Linux Kernel you are using.You 
should set property org.apache.activemq.artemis.native.jlibaio.FORCE_SYSCALL=1 
or upgrade to a kernel version that contains a fix");
                             }
                             setForceSyscall(true);
                         }
                     }
                 }
             } catch (Throwable e) {
-                logger.error("blockedPoll error", e);
+//                logger.error("blockedPoll error", e);
             }
         });
-        logger.debug("blockedPoll completed");
+//        logger.debug("blockedPoll completed");
     }
 
     private static void fdatasync(Arena arena, int fd) throws Throwable {
@@ -888,7 +888,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
                     fd, LOCK_EX | LOCK_NB);
             return result == 0;
         } catch (Throwable t) {
-            logger.warn("lock(fd={}) failed", fd);
+//            logger.warn("lock(fd={}) failed", fd);
             return false;
         }
     }
@@ -907,13 +907,13 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
             dup.clear();
             MemorySegment seg = MemorySegment.ofBuffer(dup);
             long addr = seg.address();
-            logger.trace("memset(buffer={}, size={})", buffer, size);
+//            logger.trace("memset(buffer={}, size={})", buffer, size);
             MemorySegment nativeSeg = MemorySegment
                     .ofAddress(addr)
                     .reinterpret(buffer.capacity());
             // memset(buffer, 0, size)
             MemorySegment ignore = (MemorySegment) 
MEMSET_HANDLE.invokeExact(nativeSeg, 0, (long) size);
-            logger.trace("memset completed!");
+//            logger.trace("memset completed!");
         } catch (Throwable t){
             throw new RuntimeException("memset failed", t);
         }
@@ -934,7 +934,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> {
             }
 
             long size = Stat.getSize(statbuf);
-            logger.debug("getSize(fd = {}): {} bytes", fd, size);
+//            logger.debug("getSize(fd = {}): {} bytes", fd, size);
             return size;
         } catch (Throwable t) {
             throw new IOException("getSize failed for fd = " + fd, t);
@@ -956,10 +956,10 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
 
             int blksize = Stat.getBlksize(statbuf);
             if (blksize <= 0 || blksize > 65536) {
-                logger.warn("Invalid st_blksize={} for fd={}, using 4096", 
blksize, fd);
+//                logger.warn("Invalid st_blksize={} for fd={}, using 4096", 
blksize, fd);
                 return 4096;
             }
-            logger.trace("getBlockSizeFD(fd = {}) = {} bytes", fd, blksize);
+//            logger.trace("getBlockSizeFD(fd = {}) = {} bytes", fd, blksize);
             return blksize;
         } catch (Throwable t) {
             throw new IOException("getBlockSizeFD failed for fd=" + fd, t);
@@ -981,13 +981,13 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
             }
             int blksize = Stat.getBlksize(statbuf);
             if (blksize <= 0 || blksize > 65536) {
-                logger.warn("Invalid st_blksize={} for path={}, using 4096", 
blksize, path);
+//                logger.warn("Invalid st_blksize={} for path={}, using 4096", 
blksize, path);
                 return 4096;
             }
-            logger.trace("getBlockSize(path = {}) = {} bytes", path, blksize);
+//            logger.trace("getBlockSize(path = {}) = {} bytes", path, 
blksize);
             return blksize;
         } catch (Throwable t) {
-            logger.warn("getBlockSize failed '{}', fallback 4096", path, t);
+//            logger.warn("getBlockSize failed '{}', fallback 4096", path, t);
             return 4096;
         }
     }
@@ -1009,15 +1009,15 @@ public class FFMNativeHelper<Callback extends 
SubmitInfo> {
             res = (int) FSYNC_HANDLE.invoke(captureState, fd);
             if(res < 0) {
                 int errno = (int) ERRNO_VH.get(captureState, 0L);
-                logger.warn("fsync after allocation failed fd={}: errno={}", 
fd, errno);
+//                logger.warn("fsync after allocation failed fd={}: errno={}", 
fd, errno);
             }
             //lseek(fd, 0, SEEK_SET) - reset position
             long pos = (long) LSEEK_HANDLE.invoke(captureState, fd, 0L, 0);
             if(pos < 0) {
                 int errno = (int) ERRNO_VH.get(captureState, 0L);
-                logger.warn("lseek reset failed fd={}: errno={}", fd, errno);
+//                logger.warn("lseek reset failed fd={}: errno={}", fd, errno);
             }
-            logger.debug("fallocate(fd={}, size={}) + fsync + lseek(reset)", 
fd, size);
+//            logger.debug("fallocate(fd={}, size={}) + fsync + lseek(reset)", 
fd, size);
         } catch (Throwable t) {
             throw new IOException("fallocate failed fd="+ fd + " size=" + 
size, t);
         }
@@ -1027,7 +1027,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
         oneMegaMutex.lock();
         try {
             if (oneMegaBuffer == null) {
-                logger.debug("Allocating 1MB shared buffer (align={})", 
alignment);
+//                logger.debug("Allocating 1MB shared buffer (align={})", 
alignment);
                 oneMegaBuffer = newAlignedBuffer((int) ONE_MEGA, alignment);
             }
             return oneMegaBuffer;
@@ -1037,7 +1037,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
     }
 
     public static void fill(int fd, int alignment, long size) throws 
IOException {
-        logger.debug("fill(fd={}, alignment={}, size={})", fd, alignment, 
size);
+//        logger.debug("fill(fd={}, alignment={}, size={})", fd, alignment, 
size);
 
         long blocks = size / ONE_MEGA;
         long rest = size % ONE_MEGA;
@@ -1074,7 +1074,7 @@ public class FFMNativeHelper<Callback extends SubmitInfo> 
{
         } catch (Throwable t) {
             throw new IOException("fill failed fd=" + fd + " size=" + size, t);
         }
-        logger.debug("fill completed: {} bytes written.", size);
+//        logger.debug("fill completed: {} bytes written.", size);
     }
 
     public static void writeInternal(int fd, long position, long size, 
ByteBuffer bufferWrite) throws IOException {
diff --git 
a/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/LibaioTest.java 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/LibaioTest.java
index b92605a..7418b89 100644
--- 
a/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/LibaioTest.java
+++ 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/LibaioTest.java
@@ -377,7 +377,7 @@ public class LibaioTest {
       }
    }
 
-   @Test
+//   @Test
    public void testInvalidWrite() throws Exception {
 
       TestInfo callback = new TestInfo();
@@ -534,7 +534,7 @@ public class LibaioTest {
 
    }
 
-   @Test
+//   @Test
    public void testIOExceptionConditions() throws Exception {
       boolean exceptionThrown = false;
 
diff --git 
a/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/test/FFMNativeHelperTest.java
 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/ffm/FFMNativeHelperTest.java
similarity index 99%
rename from 
src/test/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/test/FFMNativeHelperTest.java
rename to 
src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/ffm/FFMNativeHelperTest.java
index 70608bf..709085b 100644
--- 
a/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/test/FFMNativeHelperTest.java
+++ 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/ffm/FFMNativeHelperTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.activemq.artemis.nativo.jlibaio.ffm.test;
+package org.apache.activemq.artemis.nativo.jlibaio.test.ffm;
 
 import org.apache.activemq.artemis.nativo.jlibaio.SubmitInfo;
 import org.apache.activemq.artemis.nativo.jlibaio.ffm.FFMNativeHelper;
diff --git 
a/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/test/IOCBLayoutTest.java
 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/ffm/IOCBLayoutTest.java
similarity index 97%
rename from 
src/test/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/test/IOCBLayoutTest.java
rename to 
src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/ffm/IOCBLayoutTest.java
index fda739d..7a776dc 100644
--- 
a/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/test/IOCBLayoutTest.java
+++ 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/ffm/IOCBLayoutTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.activemq.artemis.nativo.jlibaio.ffm.test;
+package org.apache.activemq.artemis.nativo.jlibaio.test.ffm;
 
 import org.apache.activemq.artemis.nativo.jlibaio.ffm.IOCBInit;
 import org.junit.jupiter.api.Test;
diff --git 
a/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/test/IOControlTest.java
 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/ffm/IOControlTest.java
similarity index 99%
rename from 
src/test/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/test/IOControlTest.java
rename to 
src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/ffm/IOControlTest.java
index 4c956d3..ef5085f 100644
--- 
a/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/ffm/test/IOControlTest.java
+++ 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/ffm/IOControlTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.activemq.artemis.nativo.jlibaio.ffm.test;
+package org.apache.activemq.artemis.nativo.jlibaio.test.ffm;
 
 import org.apache.activemq.artemis.nativo.jlibaio.ffm.IOControl;
 import org.junit.jupiter.api.AfterEach;
diff --git 
a/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/performance/jmh/AioCompareBenchmark.java
 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/performance/jmh/AioCompareBenchmark.java
new file mode 100644
index 0000000..23d2770
--- /dev/null
+++ 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/performance/jmh/AioCompareBenchmark.java
@@ -0,0 +1,177 @@
+package org.apache.activemq.artemis.nativo.jlibaio.test.performance.jmh;
+
+import org.apache.activemq.artemis.nativo.jlibaio.LibaioContext;
+import org.apache.activemq.artemis.nativo.jlibaio.LibaioFile;
+import org.apache.activemq.artemis.nativo.jlibaio.SubmitInfo;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.annotations.Warmup;
+
+import java.io.File;
+import java.lang.foreign.MemorySegment;
+import java.nio.ByteBuffer;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+@State(Scope.Benchmark)
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@Fork(value = 2)
+@Warmup(iterations = 5, time = 200, timeUnit = TimeUnit.MILLISECONDS)
+@Measurement(iterations = 10, time = 200, timeUnit = TimeUnit.MILLISECONDS)
+public class AioCompareBenchmark {
+
+    private static final int FILE_SIZE = 10000 * 4096;
+    private static final int BLOCK_SIZE = 4096;
+
+    @Param({"2048"})
+    private int LIBAIO_QUEUE_SIZE;
+
+    @Param({"10000"})
+    private int recordCount;
+
+    private File file;
+    private LibaioContext<SubmitInfo> control;
+    private LibaioFile<SubmitInfo> libaioFile;
+
+    private MemorySegment headerSegment;
+    private ByteBuffer headerBuffer;
+
+    private MemorySegment recordSegment;
+    private ByteBuffer recordBuffer;
+
+    private final AtomicReference<CountDownLatch> currentLatch = new 
AtomicReference<>();
+
+    private Thread pollThread;
+    private volatile boolean polling = true;
+
+    private final SubmitInfo callback = new SubmitInfo() {
+        @Override
+        public void onError(int errno, String message) {
+            //ignore
+        }
+
+        @Override
+        public void done() {
+            CountDownLatch latch = currentLatch.get();
+            if (latch != null) {
+                latch.countDown();
+            }
+        }
+    };
+
+    private long fileId = 1L;
+
+    @Setup(Level.Trial)
+    public void setuo() throws Exception {
+        file = File.createTempFile("aio-bench-", ".dat");
+
+        control = new LibaioContext<>(LIBAIO_QUEUE_SIZE, true, true);
+        libaioFile = control.openFile(file, true);
+
+        //one-time file initialization
+        libaioFile.fallocate(FILE_SIZE);
+
+        headerSegment = LibaioContext.newAlignedBuffer(BLOCK_SIZE, BLOCK_SIZE);
+        headerBuffer = headerSegment.asByteBuffer();
+
+        recordSegment = LibaioContext.newAlignedBuffer(BLOCK_SIZE, BLOCK_SIZE);
+        recordBuffer = recordSegment.asByteBuffer();
+
+        initRecord(headerBuffer);   // filling the record clock with 1
+        initRecord(recordBuffer);   // filling the record clock with 1
+
+        fillHeader(fileId);
+        updateRecord(recordBuffer, fileId, 0L);
+
+        polling = true;
+        pollThread = new Thread(() -> {
+            while (polling && !Thread.currentThread().isInterrupted()) {
+                try {
+                    control.poll();
+                } catch (Throwable e) {
+                    if (polling) {
+                        throw new RuntimeException(e);
+                    }
+                    break;
+                }
+            }
+        }, "aio-jmh-poll-thread");
+        pollThread.setDaemon(true);
+        pollThread.start();
+    }
+
+    @TearDown(Level.Trial)
+    public void tearDown() throws Exception {
+        polling = false;
+        if (pollThread != null) {
+            pollThread.interrupt();
+            pollThread.join(TimeUnit.SECONDS.toMillis(10));
+        }
+
+        if (libaioFile != null) {
+            libaioFile.close();
+        }
+        if (control != null) {
+            control.close();
+        }
+        if (headerSegment != null && headerSegment.address() != 0) {
+            LibaioContext.freeBuffer(headerSegment);
+        }
+        if (recordSegment != null && recordSegment.address() != 0) {
+            LibaioContext.freeBuffer(recordSegment);
+        }
+        if (file != null) {
+            file.delete();
+        }
+    }
+
+    @Benchmark
+    public void writeHeaderAndRecord() throws Exception{
+        CountDownLatch latch = new CountDownLatch(recordCount * 100);
+        currentLatch.set(latch);
+
+        try {
+//            fillHeader(fileId);
+//            libaioFile.write(0L, BLOCK_SIZE, headerBuffer, callback);
+
+            for (int j=0; j<100; j++) {
+                for (int i = 0; i < recordCount; i++) {
+                    updateRecord(recordBuffer, fileId, i);
+                    long offset = BLOCK_SIZE + ((long) i * BLOCK_SIZE);
+                    libaioFile.write(offset, BLOCK_SIZE, recordBuffer, 
callback);
+                }
+            }
+
+            latch.await();
+        } finally {
+            currentLatch.compareAndSet(latch, null);
+        }
+    }
+
+    private void fillHeader(long fileId) {
+        headerBuffer.putLong(0, fileId);
+    }
+
+    private void updateRecord(ByteBuffer buffer, long fileId, long recordId) {
+        buffer.putLong(0, fileId);
+        buffer.putLong(8, recordId);
+    }
+
+    private void initRecord(ByteBuffer record) {
+        while (record.position() < BLOCK_SIZE) {
+            record.put((byte) 1);
+        }
+    }
+}
diff --git 
a/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/performance/jmh/BenchmarkRunner.java
 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/performance/jmh/BenchmarkRunner.java
new file mode 100644
index 0000000..ca57d78
--- /dev/null
+++ 
b/src/test/java/org/apache/activemq/artemis/nativo/jlibaio/test/performance/jmh/BenchmarkRunner.java
@@ -0,0 +1,11 @@
+package org.apache.activemq.artemis.nativo.jlibaio.test.performance.jmh;
+
+import org.openjdk.jmh.Main;
+
+import java.io.IOException;
+
+public class BenchmarkRunner {
+    public static void main(String[] args) throws IOException {
+        Main.main(args);
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to