Github user jasobrown commented on a diff in the pull request: https://github.com/apache/cassandra/pull/236#discussion_r199259098 --- Diff: src/java/org/apache/cassandra/io/util/FileUtils.java --- @@ -67,23 +71,84 @@ public static final boolean isCleanerAvailable; private static final AtomicReference<Optional<FSErrorHandler>> fsErrorHandler = new AtomicReference<>(Optional.empty()); + private static Class clsDirectBuffer; + private static MethodHandle mhDirectBufferCleaner; + private static MethodHandle mhCleanerClean; + private static MethodHandle mhDirectBufferAddress; + static { boolean canClean = false; try { + clsDirectBuffer = Class.forName("sun.nio.ch.DirectBuffer"); + Method mDirectBufferCleaner = clsDirectBuffer.getMethod("cleaner"); + mhDirectBufferCleaner = MethodHandles.lookup().unreflect(mDirectBufferCleaner); + Method mCleanerClean = mDirectBufferCleaner.getReturnType().getMethod("clean"); + mhCleanerClean = MethodHandles.lookup().unreflect(mCleanerClean); + Method mDirectBufferAddress = clsDirectBuffer.getMethod("address"); + mhDirectBufferAddress = MethodHandles.lookup().unreflect(mDirectBufferAddress); + ByteBuffer buf = ByteBuffer.allocateDirect(1); - ((DirectBuffer) buf).cleaner().clean(); + cleanerClean(buf); canClean = true; } catch (Throwable t) { + logger.info("Cannot initialize un-mmaper. Compacted data files will not be removed promptly.", t); JVMStabilityInspector.inspectThrowable(t); - logger.info("Cannot initialize un-mmaper. (Are you using a non-Oracle JVM?) Compacted data files will not be removed promptly. Consider using an Oracle JVM or using standard disk access mode"); } isCleanerAvailable = canClean; } + public static boolean isDirectBuffer(ByteBuffer buf) + { + return clsDirectBuffer.isInstance(buf); --- End diff -- Can't we just call `ByteBuffer.isDirect()` instead?
--- --------------------------------------------------------------------- To unsubscribe, e-mail: pr-unsubscr...@cassandra.apache.org For additional commands, e-mail: pr-h...@cassandra.apache.org