From 219aa5242db398804456345650402504a9c7a93c Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Tue, 14 Jun 2022 10:19:51 +0300 Subject: [PATCH] [ML] Fix thread safety issues in ManagedCursorContainer related to "heap" field access - heap is an ArrayList which isn't thread safe --- .../mledger/impl/ManagedCursorContainer.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorContainer.java b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorContainer.java index ef9a546a50781..f9591d9ee6aba 100644 --- a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorContainer.java +++ b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorContainer.java @@ -105,11 +105,21 @@ private boolean shouldTrackInHeap(ManagedCursor cursor) { } public PositionImpl getSlowestReadPositionForActiveCursors() { - return heap.isEmpty() ? null : (PositionImpl) heap.get(0).cursor.getReadPosition(); + long stamp = rwLock.readLock(); + try { + return heap.isEmpty() ? null : (PositionImpl) heap.get(0).cursor.getReadPosition(); + } finally { + rwLock.unlockRead(stamp); + } } public PositionImpl getSlowestMarkDeletedPositionForActiveCursors() { - return heap.isEmpty() ? null : (PositionImpl) heap.get(0).cursor.getMarkDeletedPosition(); + long stamp = rwLock.readLock(); + try { + return heap.isEmpty() ? null : (PositionImpl) heap.get(0).cursor.getMarkDeletedPosition(); + } finally { + rwLock.unlockRead(stamp); + } } public ManagedCursor get(String name) {