From 73aa8c08bc1b90ab012e1f5c569fc035519ef178 Mon Sep 17 00:00:00 2001 From: Yu Ning <78631860+Chillax-0v0@users.noreply.github.com> Date: Thu, 14 Mar 2024 12:00:50 +0800 Subject: [PATCH] fix(s3stream/wal): use different O_DIRECT flag in amd64 and aarch64 (#962) Signed-off-by: Ning Yu --- .../moe/cnkirito/kdio/DirectIOLib.java | 6 +-- .../moe/cnkirito/kdio/OpenFlags.java | 51 +++++++++++++++---- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/s3stream/src/main/java/com/automq/stream/thirdparty/moe/cnkirito/kdio/DirectIOLib.java b/s3stream/src/main/java/com/automq/stream/thirdparty/moe/cnkirito/kdio/DirectIOLib.java index c90dc8274..1e0e113e0 100755 --- a/s3stream/src/main/java/com/automq/stream/thirdparty/moe/cnkirito/kdio/DirectIOLib.java +++ b/s3stream/src/main/java/com/automq/stream/thirdparty/moe/cnkirito/kdio/DirectIOLib.java @@ -306,11 +306,11 @@ public int pwrite(int fd, ByteBuffer buf, long offset) throws IOException { * @return An integer file descriptor for the opened file */ public int oDirectOpen(String pathname, boolean readOnly) throws IOException { - int flags = OpenFlags.O_DIRECT; + int flags = OpenFlags.INSTANCE.oDIRECT(); if (readOnly) { - flags |= OpenFlags.O_RDONLY; + flags |= OpenFlags.INSTANCE.oRDONLY(); } else { - flags |= OpenFlags.O_RDWR | OpenFlags.O_CREAT; + flags |= OpenFlags.INSTANCE.oRDWR() | OpenFlags.INSTANCE.oCREAT(); } int fd = open(pathname, flags, 00644); if (fd < 0) { diff --git a/s3stream/src/main/java/com/automq/stream/thirdparty/moe/cnkirito/kdio/OpenFlags.java b/s3stream/src/main/java/com/automq/stream/thirdparty/moe/cnkirito/kdio/OpenFlags.java index 5665f6bcd..50612dea3 100755 --- a/s3stream/src/main/java/com/automq/stream/thirdparty/moe/cnkirito/kdio/OpenFlags.java +++ b/s3stream/src/main/java/com/automq/stream/thirdparty/moe/cnkirito/kdio/OpenFlags.java @@ -13,15 +13,48 @@ /** * Constants for {@link DirectIOLib#oDirectOpen(String, boolean)}. */ -public final class OpenFlags { - public static final int O_RDONLY = 00; - public static final int O_WRONLY = 01; - public static final int O_RDWR = 02; - public static final int O_CREAT = 0100; - public static final int O_TRUNC = 01000; - public static final int O_DIRECT = 040000; - public static final int O_SYNC = 04000000; +public interface OpenFlags { + OpenFlags INSTANCE = instance(); - private OpenFlags() { + private static OpenFlags instance() { + String arch = System.getProperty("os.arch"); + switch (arch) { + case "aarch64": + return new Aarch64OpenFlags(); + default: + return new DefaultOpenFlags(); + } + } + + default int oRDONLY() { + return 00; + } + default int oWRONLY() { + return 01; + } + default int oRDWR() { + return 02; + } + default int oCREAT() { + return 0100; + } + default int oTRUNC() { + return 01000; + } + default int oDIRECT() { + return 040000; + } + default int oSYNC() { + return 04010000; + } + + class DefaultOpenFlags implements OpenFlags { + } + + class Aarch64OpenFlags implements OpenFlags { + @Override + public int oDIRECT() { + return 0200000; + } } }