From d442aca7a81d4ab5ac22d6bad2072c38e2dcdbf4 Mon Sep 17 00:00:00 2001 From: Ivan Rakov Date: Wed, 16 Jun 2021 18:26:38 +0300 Subject: [PATCH] dirtyfix. --- .../chronicle/map/ChronicleMapBuilder.java | 25 +++++++++++++------ .../openhft/chronicle/map/FileLockUtil.java | 23 +++++++++-------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java index 56f5a9916..614a9b639 100644 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java @@ -1703,15 +1703,26 @@ public final class ChronicleMapBuilder implements final AtomicBoolean newFile = new AtomicBoolean(); final FileChannel fileChannel = raf.getChannel(); - FileLockUtil.runExclusively(canonicalFile, fileChannel, () -> { + while (true) { if (raf.length() == 0) { - map.set(newMap()); - headerBuffer.set(writeHeader(fileChannel, map.get())); - newFile.set(true); - } else { - newFile.set(false); + final boolean locked = FileLockUtil.tryRunExclusively(canonicalFile, fileChannel, () -> { + if (raf.length() == 0) { + map.set(newMap()); + headerBuffer.set(writeHeader(fileChannel, map.get())); + newFile.set(true); + } else { + newFile.set(false); + } + }); + + if (locked) + break; + else + Jvm.pause(10); } - }); + else + break; + } if (newFile.get()) { final int headerSize = headerBuffer.get().remaining(); diff --git a/src/main/java/net/openhft/chronicle/map/FileLockUtil.java b/src/main/java/net/openhft/chronicle/map/FileLockUtil.java index a29c27c8e..d22637005 100644 --- a/src/main/java/net/openhft/chronicle/map/FileLockUtil.java +++ b/src/main/java/net/openhft/chronicle/map/FileLockUtil.java @@ -99,27 +99,26 @@ public final class FileLockUtil { public static boolean tryRunExclusively(@NotNull final File canonicalFile, @NotNull final FileChannel fileChannel, @NotNull final FileIOAction fileIOAction) { + AtomicBoolean locked = new AtomicBoolean(false); + FILE_LOCKS.compute(canonicalFile, (f, flr) -> { if (flr != null) throw new ChronicleFileLockException("A file lock instance already exists for the file " + canonicalFile); try { if (USE_LOCKING) { - do { - try (FileLock ignored = fileChannel.tryLock()) { - if (ignored == null) { - Jvm.pause(10); + try (FileLock ignored = fileChannel.tryLock()) { + if (ignored == null) + return null; - continue; - } + fileIOAction.fileIOAction(); - fileIOAction.fileIOAction(); - - break; - } - } while (true); + locked.set(true); + } } else { fileIOAction.fileIOAction(); + + locked.set(true); } return null; @@ -128,6 +127,8 @@ public final class FileLockUtil { } } ); + + return locked.get(); } /**