Skip to content

Commit c6f27f0

Browse files
authored
LedgerHandle: eliminate unnecessasary synchronization on LedgerHandle.getLength() (#4516)
1 parent af8baa1 commit c6f27f0

File tree

4 files changed

+16
-16
lines changed

4 files changed

+16
-16
lines changed

bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import java.util.concurrent.TimeUnit;
5353
import java.util.concurrent.atomic.AtomicBoolean;
5454
import java.util.concurrent.atomic.AtomicInteger;
55+
import java.util.concurrent.atomic.AtomicLong;
5556
import org.apache.bookkeeper.client.AsyncCallback.AddCallback;
5657
import org.apache.bookkeeper.client.AsyncCallback.AddCallbackWithLatency;
5758
import org.apache.bookkeeper.client.AsyncCallback.CloseCallback;
@@ -137,7 +138,7 @@ private enum HandleState {
137138
*/
138139
private int stickyBookieIndex;
139140

140-
long length;
141+
final AtomicLong length;
141142
final DigestManager macManager;
142143
final DistributionSchedule distributionSchedule;
143144
final RateLimiter throttler;
@@ -188,10 +189,10 @@ private enum HandleState {
188189
LedgerMetadata metadata = versionedMetadata.getValue();
189190
if (metadata.isClosed()) {
190191
lastAddConfirmed = lastAddPushed = metadata.getLastEntryId();
191-
length = metadata.getLength();
192+
length = new AtomicLong(metadata.getLength());
192193
} else {
193194
lastAddConfirmed = lastAddPushed = INVALID_ENTRY_ID;
194-
length = 0;
195+
length = new AtomicLong();
195196
}
196197

197198
this.pendingAddsSequenceHead = lastAddConfirmed;
@@ -365,7 +366,7 @@ boolean setLedgerMetadata(Versioned<LedgerMetadata> expected, Versioned<LedgerMe
365366
LedgerMetadata metadata = versionedMetadata.getValue();
366367
if (metadata.isClosed()) {
367368
lastAddConfirmed = lastAddPushed = metadata.getLastEntryId();
368-
length = metadata.getLength();
369+
length.set(metadata.getLength());
369370
}
370371
return true;
371372
} else {
@@ -422,9 +423,8 @@ DigestManager getDigestManager() {
422423
* @param delta
423424
* @return the length of the ledger after the addition
424425
*/
425-
synchronized long addToLength(long delta) {
426-
this.length += delta;
427-
return this.length;
426+
long addToLength(long delta) {
427+
return length.addAndGet(delta);
428428
}
429429

430430
/**
@@ -433,8 +433,8 @@ synchronized long addToLength(long delta) {
433433
* @return the length of the ledger in bytes
434434
*/
435435
@Override
436-
public synchronized long getLength() {
437-
return this.length;
436+
public long getLength() {
437+
return this.length.get();
438438
}
439439

440440
/**
@@ -559,7 +559,7 @@ void doAsyncCloseInternal(final CloseCallback cb, final Object ctx, final int rc
559559

560560
// taking the length must occur after draining, as draining changes the length
561561
lastEntry = lastAddPushed = LedgerHandle.this.lastAddConfirmed;
562-
finalLength = LedgerHandle.this.length;
562+
finalLength = LedgerHandle.this.length.get();
563563
handleState = HandleState.CLOSED;
564564
}
565565

@@ -1649,7 +1649,7 @@ synchronized void updateLastConfirmed(long lac, long len) {
16491649
lacUpdateMissesCounter.inc();
16501650
}
16511651
lastAddPushed = Math.max(lastAddPushed, lac);
1652-
length = Math.max(length, len);
1652+
length.accumulateAndGet(len, (current, value) -> Math.max(current, value));
16531653
}
16541654

16551655
/**
@@ -1985,7 +1985,7 @@ public void asyncReadExplicitLastConfirmed(final ReadLastConfirmedCallback cb, f
19851985
isClosed = metadata.isClosed();
19861986
if (isClosed) {
19871987
lastAddConfirmed = metadata.getLastEntryId();
1988-
length = metadata.getLength();
1988+
length.set(metadata.getLength());
19891989
}
19901990
}
19911991
if (isClosed) {

bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public void readLastConfirmedDataComplete(int rc, RecoveryData data) {
121121
lh.lastAddPushed = lh.lastAddConfirmed = Math.max(data.getLastAddConfirmed(),
122122
(lastEnsembleEntryId - 1));
123123

124-
lh.length = data.getLength();
124+
lh.length.set(data.getLength());
125125
lh.pendingAddsSequenceHead = lh.lastAddConfirmed;
126126
startEntryToRead = endEntryToRead = lh.lastAddConfirmed;
127127
}
@@ -192,7 +192,7 @@ public void onEntryComplete(int rc, LedgerHandle lh, LedgerEntry entry, Object c
192192
* be added again when processing the call to add it.
193193
*/
194194
synchronized (lh) {
195-
lh.length = entry.getLength() - (long) data.length;
195+
lh.length.set(entry.getLength() - (long) data.length);
196196
// check whether entry id is expected, so we won't overwritten any entries by mistake
197197
if (entry.getEntryId() != lh.lastAddPushed + 1) {
198198
LOG.error("Unexpected to recovery add entry {} as entry {} for ledger {}.",

bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadOnlyLedgerHandle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ CompletableFuture<Versioned<LedgerMetadata>> closeRecovered() {
300300
long lac, len;
301301
synchronized (this) {
302302
lac = lastAddConfirmed;
303-
len = length;
303+
len = length.get();
304304
}
305305
LOG.info("Closing recovered ledger {} at entry {}", getId(), lac);
306306
CompletableFuture<Versioned<LedgerMetadata>> f = new MetadataUpdateLoop(

bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockLedgerHandle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public void asyncClose(CloseCallback cb, Object ctx) {
8484
metadata = LedgerMetadataBuilder.from(metadata)
8585
.withClosedState()
8686
.withLastEntryId(lastEntry)
87-
.withLength(length)
87+
.withLength(length.get())
8888
.build();
8989
setLedgerMetadata(getVersionedLedgerMetadata(), new Versioned<>(metadata, new LongVersion(1L)));
9090

0 commit comments

Comments
 (0)