< prev index next >

test/jdk/java/nio/channels/FileChannel/directio/DirectIOTest.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -45,34 +45,41 @@
 import java.nio.file.StandardOpenOption;
 import com.sun.nio.file.ExtendedOpenOption;
 
 public class DirectIOTest {
 
-    private static final int SIZE = 4096;
+    private static final int BASE_SIZE = 4096;
+    private static long blockSize;
 
-    private static void testWrite(Path p) throws Exception {
+    private static int testWrite(Path p) throws Exception {
         try (FileChannel fc = FileChannel.open(p, StandardOpenOption.WRITE,
              ExtendedOpenOption.DIRECT)) {
-            FileStore fs = Files.getFileStore(p);
-            int alignment = (int)fs.getBlockSize();
-            ByteBuffer src = ByteBuffer.allocateDirect(SIZE + alignment - 1)
+            int bs = (int)blockSize;
+            int size = Math.max(BASE_SIZE, bs);
+            int alignment = bs;
+            ByteBuffer src = ByteBuffer.allocateDirect(size + alignment - 1)
                                        .alignedSlice(alignment);
-            for (int j = 0; j < SIZE; j++) {
+            assert src.capacity() != 0;
+            for (int j = 0; j < size; j++) {
                 src.put((byte)0);
             }
             src.flip();
             fc.write(src);
+            return size;
         }
     }
 
-    private static void testRead(Path p) throws Exception {
+    private static int testRead(Path p) throws Exception {
         try (FileChannel fc = FileChannel.open(p, ExtendedOpenOption.DIRECT)) {
-            FileStore fs = Files.getFileStore(p);
-            int alignment = (int)fs.getBlockSize();
-            ByteBuffer dest = ByteBuffer.allocateDirect(SIZE + alignment - 1)
+            int bs = (int)blockSize;
+            int size = Math.max(BASE_SIZE, bs);
+            int alignment = bs;
+            ByteBuffer dest = ByteBuffer.allocateDirect(size + alignment - 1)
                                         .alignedSlice(alignment);
+            assert dest.capacity() != 0;
             fc.read(dest);
+            return size;
         }
     }
 
     public static Path createTempFile() throws IOException {
         return Files.createTempFile(

@@ -91,35 +98,36 @@
             }
         }
         return supported;
     }
 
-    private static boolean isFileInCache(Path p) {
+    private static boolean isFileInCache(int size, Path p) {
         String path = p.toString();
-        return isFileInCache0(SIZE, path);
+        return isFileInCache0(size, path);
     }
 
     private static native boolean isFileInCache0(int size, String path);
 
     public static void main(String[] args) throws Exception {
         Path p = createTempFile();
+        blockSize = Files.getFileStore(p).getBlockSize();
 
         if (!isDirectIOSupportedByFS(p)) {
             Files.delete(p);
             return;
         }
 
         System.loadLibrary("DirectIO");
 
         try {
-            testWrite(p);
-            if (isFileInCache(p)) {
+            int size = testWrite(p);
+            if (isFileInCache(size, p)) {
                 throw new RuntimeException("DirectIO is not working properly with "
                     + "write. File still exists in cache!");
             }
-            testRead(p);
-            if (isFileInCache(p)) {
+            size = testRead(p);
+            if (isFileInCache(size, p)) {
                 throw new RuntimeException("DirectIO is not working properly with "
                     + "read. File still exists in cache!");
             }
         } finally {
             Files.delete(p);
< prev index next >