Skip to content
Permalink
Browse files
8264821: DirectIOTest fails on a system with large block size
Reviewed-by: yan
Backport-of: 7e4cd48
  • Loading branch information
Sergey Nazarkin authored and Yuri Nesterenko committed May 4, 2021
1 parent 6623cfe commit 1c24c09924408d0b3e8b257c95c1e93205deaf2a
Showing with 25 additions and 17 deletions.
  1. +25 −17 test/jdk/java/nio/channels/FileChannel/directio/DirectIOTest.java
@@ -1,5 +1,5 @@
/*
* 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
@@ -47,30 +47,37 @@

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;
}
}

@@ -93,15 +100,16 @@ public static boolean isDirectIOSupportedByFS(Path p) throws Exception {
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);
@@ -111,13 +119,13 @@ public static void main(String[] args) throws Exception {
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!");
}

1 comment on commit 1c24c09

@openjdk-notifier

This comment has been minimized.

Copy link

@openjdk-notifier openjdk-notifier bot commented on 1c24c09 May 4, 2021

Please sign in to comment.