From 5baab9ed3387bba23df1530a684ed9414adf5e76 Mon Sep 17 00:00:00 2001 From: shoothzj Date: Sun, 10 Oct 2021 16:51:32 +0800 Subject: [PATCH 1/3] Forget to close preAllocator log on shutdown --- .../bookkeeper/bookie/EntryLoggerAllocator.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java index 1874dfa4ff6..d6fb812ef2b 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java @@ -42,6 +42,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.bookie.EntryLogger.BufferedLogChannel; @@ -218,7 +219,17 @@ void stop() { Thread.currentThread().interrupt(); } allocatorExecutor.shutdownNow(); - + if (preallocatedLogId != -1) { + // if preallocate new log success, release the file channel + try { + BufferedLogChannel bufferedLogChannel = getPreallocationFuture().get(3, TimeUnit.SECONDS); + if (bufferedLogChannel != null) { + bufferedLogChannel.close(); + } + } catch (IOException | InterruptedException | ExecutionException | TimeoutException e) { + log.warn("release preAllocator log failed, ignore error"); + } + } log.info("Stopped entry logger preallocator."); } From 490ec16ff19dadc24e10c7ded09cdf205023915f Mon Sep 17 00:00:00 2001 From: shoothzj Date: Sun, 10 Oct 2021 17:02:25 +0800 Subject: [PATCH 2/3] Fix synchronize problem --- .../bookie/EntryLoggerAllocator.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java index d6fb812ef2b..50e2f5675a1 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java @@ -183,6 +183,21 @@ private synchronized BufferedLogChannel allocateNewLog(File dirForNextEntryLog, return logChannel; } + + private synchronized void closePreAllocateLog() { + if (preallocatedLogId != -1) { + // if preallocate new log success, release the file channel + try { + BufferedLogChannel bufferedLogChannel = getPreallocationFuture().get(3, TimeUnit.SECONDS); + if (bufferedLogChannel != null) { + bufferedLogChannel.close(); + } + } catch (IOException | InterruptedException | ExecutionException | TimeoutException e) { + log.warn("release preAllocator log failed, ignore error"); + } + } + } + /** * writes the given id to the "lastId" file in the given directory. */ @@ -209,6 +224,7 @@ private void setLastLogId(File dir, long logId) throws IOException { */ void stop() { // wait until the preallocation finished. + allocatorExecutor.execute(this::closePreAllocateLog); allocatorExecutor.shutdown(); try { if (!allocatorExecutor.awaitTermination(5, TimeUnit.SECONDS)) { @@ -219,17 +235,6 @@ void stop() { Thread.currentThread().interrupt(); } allocatorExecutor.shutdownNow(); - if (preallocatedLogId != -1) { - // if preallocate new log success, release the file channel - try { - BufferedLogChannel bufferedLogChannel = getPreallocationFuture().get(3, TimeUnit.SECONDS); - if (bufferedLogChannel != null) { - bufferedLogChannel.close(); - } - } catch (IOException | InterruptedException | ExecutionException | TimeoutException e) { - log.warn("release preAllocator log failed, ignore error"); - } - } log.info("Stopped entry logger preallocator."); } From cd01e4dae4516798d27561833c315ca3f97c7381 Mon Sep 17 00:00:00 2001 From: shoothzj Date: Sun, 10 Oct 2021 21:57:55 +0800 Subject: [PATCH 3/3] handle InterruptedException --- .../org/apache/bookkeeper/bookie/EntryLoggerAllocator.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java index 50e2f5675a1..5b05e64cb8d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java @@ -192,8 +192,11 @@ private synchronized void closePreAllocateLog() { if (bufferedLogChannel != null) { bufferedLogChannel.close(); } - } catch (IOException | InterruptedException | ExecutionException | TimeoutException e) { - log.warn("release preAllocator log failed, ignore error"); + } catch (InterruptedException e) { + log.warn("interrupted while release preAllocate log"); + Thread.currentThread().interrupt(); + } catch (IOException | ExecutionException | TimeoutException e) { + log.warn("release preAllocate log failed, ignore error"); } } }