From 02487e19e7e9a90f25d752fc4f9b2a4818202bd1 Mon Sep 17 00:00:00 2001 From: Masahiro Sakamoto Date: Thu, 10 Jun 2021 00:16:50 +0900 Subject: [PATCH] Update lastMarkDeleteEntry using AtomicReferenceFieldUpdater --- .../mledger/impl/ManagedCursorImpl.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java index 8a127651cc4a1..bd0b5e124b26d 100644 --- a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java +++ b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java @@ -288,17 +288,17 @@ public Map getProperties() { @Override public boolean putProperty(String key, Long value) { if (lastMarkDeleteEntry != null) { - MarkDeleteEntry currentLastMarkDeleteEntry = lastMarkDeleteEntry; - Map properties = currentLastMarkDeleteEntry.properties; - if (properties == null || properties.isEmpty()) { - Map newProperties = Maps.newHashMap(); + LAST_MARK_DELETE_ENTRY_UPDATER.updateAndGet(this, last -> { + Map properties = last.properties; + Map newProperties = properties == null ? Maps.newHashMap() : Maps.newHashMap(properties); newProperties.put(key, value); - lastMarkDeleteEntry = new MarkDeleteEntry(currentLastMarkDeleteEntry.newPosition, newProperties, - currentLastMarkDeleteEntry.callback, currentLastMarkDeleteEntry.ctx); - lastMarkDeleteEntry.callbackGroup = currentLastMarkDeleteEntry.callbackGroup; - } else { - properties.put(key, value); - } + + MarkDeleteEntry newLastMarkDeleteEntry = new MarkDeleteEntry(last.newPosition, newProperties, + last.callback, last.ctx); + newLastMarkDeleteEntry.callbackGroup = last.callbackGroup; + + return newLastMarkDeleteEntry; + }); return true; } return false; @@ -307,11 +307,14 @@ public boolean putProperty(String key, Long value) { @Override public boolean removeProperty(String key) { if (lastMarkDeleteEntry != null) { - Map properties = lastMarkDeleteEntry.properties; - if (properties != null && properties.containsKey(key)) { - properties.remove(key); - return true; - } + LAST_MARK_DELETE_ENTRY_UPDATER.updateAndGet(this, last -> { + Map properties = last.properties; + if (properties != null && properties.containsKey(key)) { + properties.remove(key); + } + return last; + }); + return true; } return false; }