From 0a4eca28351460bccc1fb655749bd75576fb32d5 Mon Sep 17 00:00:00 2001 From: fengyubiao Date: Thu, 5 Jun 2025 19:56:44 +0800 Subject: [PATCH] [fix][ml]Revert a break change of releasing idle offloaded ledger handle: only release idle BlobStoreBackedReadHandle --- .../org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java | 3 ++- .../offload/jcloud/impl/BlobStoreBackedReadHandleImpl.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java index 88272ac8f1fab..61a54f8d5955a 100644 --- a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java +++ b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java @@ -2753,7 +2753,8 @@ synchronized List internalEvictOffloadedLedgers() { ReadHandle readHandle = ledger.join(); if (readHandle instanceof OffloadedLedgerHandle offloadedLedgerHandle) { int pendingRead = offloadedLedgerHandle.getPendingRead(); - if (pendingRead == 0) { + long lastAccessTimestamp = offloadedLedgerHandle.lastAccessTimestamp(); + if (lastAccessTimestamp >= 0 && pendingRead == 0) { long delta = now - offloadedLedgerHandle.lastAccessTimestamp(); if (delta >= inactiveOffloadedLedgerEvictionTimeMs) { log.info("[{}] Offloaded ledger {} can be released ({} ms elapsed since last access)", diff --git a/tiered-storage/jcloud/src/main/java/org/apache/bookkeeper/mledger/offload/jcloud/impl/BlobStoreBackedReadHandleImpl.java b/tiered-storage/jcloud/src/main/java/org/apache/bookkeeper/mledger/offload/jcloud/impl/BlobStoreBackedReadHandleImpl.java index 84d9d11872849..916e33c364218 100644 --- a/tiered-storage/jcloud/src/main/java/org/apache/bookkeeper/mledger/offload/jcloud/impl/BlobStoreBackedReadHandleImpl.java +++ b/tiered-storage/jcloud/src/main/java/org/apache/bookkeeper/mledger/offload/jcloud/impl/BlobStoreBackedReadHandleImpl.java @@ -135,8 +135,8 @@ public CompletableFuture readAsync(long firstEntry, long lastEntr // is better. PENDING_READ_UPDATER.incrementAndGet(this); promise.whenComplete((__, ex) -> { - PENDING_READ_UPDATER.decrementAndGet(BlobStoreBackedReadHandleImpl.this); lastAccessTimestamp = System.currentTimeMillis(); + PENDING_READ_UPDATER.decrementAndGet(BlobStoreBackedReadHandleImpl.this); }); executor.execute(() -> { if (state == State.Closed) {