You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by eo...@apache.org on 2021/05/13 07:46:38 UTC
[pulsar] 44/46: Made OpAddEntry.toString() more robust to nulls to
prevent NPEs (#10548)
This is an automated email from the ASF dual-hosted git repository.
eolivelli pushed a commit to branch 2.7.2_ds_tmp
in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit e2c52457d2719b5f913691bfbd19e2fd660afa09
Author: Devin Bost <de...@users.noreply.github.com>
AuthorDate: Wed May 12 19:00:15 2021 -0600
Made OpAddEntry.toString() more robust to nulls to prevent NPEs (#10548)
Adding test to show we don't throw NPE
Fixed concurrency issue in OpAddEntry.toString()
Co-authored-by: Devin Bost <db...@overstock.com>
(cherry picked from commit d2b7c5eaee925b253201e2a92fcb91ad7290ff93)
---
.../apache/bookkeeper/mledger/impl/OpAddEntry.java | 14 ++++++
.../bookkeeper/mledger/impl/ManagedLedgerTest.java | 58 ++++++++++++++++++++--
2 files changed, 67 insertions(+), 5 deletions(-)
diff --git a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/OpAddEntry.java b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/OpAddEntry.java
index d72d237..b042183 100644
--- a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/OpAddEntry.java
+++ b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/OpAddEntry.java
@@ -301,4 +301,18 @@ class OpAddEntry extends SafeRunnable implements AddCallback, CloseCallback {
}
private static final Logger log = LoggerFactory.getLogger(OpAddEntry.class);
+
+ @Override
+ public String toString() {
+ ManagedLedgerImpl ml = this.ml;
+ LedgerHandle ledger = this.ledger;
+ return "OpAddEntry{" +
+ "mlName=" + ml != null ? ml.getName() : "null" +
+ ", ledgerId=" + ledger != null ? String.valueOf(ledger.getId()) : "null" +
+ ", entryId=" + entryId +
+ ", startTime=" + startTime +
+ ", dataLength=" + dataLength +
+ '}';
+ }
+
}
diff --git a/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerTest.java b/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerTest.java
index 1cc95b4..db9ee42 100644
--- a/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerTest.java
+++ b/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerTest.java
@@ -21,11 +21,8 @@ package org.apache.bookkeeper.mledger.impl;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.when;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
@@ -2856,4 +2853,55 @@ public class ManagedLedgerTest extends MockedBookKeeperTestCase {
Thread.sleep(intSleepTimeInMillis + (intSleepTimeInMillis * i));
}
}
+
+ @Test
+ public void testManagedLedgerRollOverIfFull() throws Exception {
+ ManagedLedgerConfig config = new ManagedLedgerConfig();
+ config.setRetentionTime(1, TimeUnit.SECONDS);
+ config.setMaxEntriesPerLedger(2);
+ config.setMinimumRolloverTime(1, TimeUnit.MILLISECONDS);
+ config.setMaximumRolloverTime(500, TimeUnit.MILLISECONDS);
+
+ ManagedLedgerImpl ledger = (ManagedLedgerImpl)factory.open("test_managedLedger_rollOver", config);
+ ManagedCursor cursor = ledger.openCursor("c1");
+
+ int msgNum = 10;
+
+ for (int i = 0; i < msgNum; i++) {
+ ledger.addEntry(new byte[1024 * 1024]);
+ }
+
+ Assert.assertEquals(ledger.getLedgersInfoAsList().size(), msgNum / 2);
+ List<Entry> entries = cursor.readEntries(msgNum);
+ Assert.assertEquals(msgNum, entries.size());
+
+ for (Entry entry : entries) {
+ cursor.markDelete(entry.getPosition());
+ }
+ entries.forEach(e -> e.release());
+
+ // all the messages have benn acknowledged
+ // and all the ledgers have been removed except the last ledger
+ Thread.sleep(1000);
+ Assert.assertEquals(ledger.getLedgersInfoAsList().size(), 1);
+ Assert.assertEquals(ledger.getTotalSize(), 0);
+ }
+
+ @Test
+ public void testOpEntryAdd_toString_doesNotThrowNPE(){
+ ManagedLedger ml = mock(ManagedLedger.class);
+ LedgerHandle ledger = mock(LedgerHandle.class);
+ when(ml.getName()).thenReturn(null);
+ when(ledger.getId()).thenReturn(124L);
+ long entryId = 12L;
+ long startTime = 1245L;
+ int dataLength = 566;
+ String test = "OpAddEntry{" +
+ "mlName=" + ml != null ? ml.getName() : "null" +
+ ", ledgerId=" + ledger != null ? String.valueOf(ledger.getId()) : "null" +
+ ", entryId=" + entryId +
+ ", startTime=" + startTime +
+ ", dataLength=" + dataLength +
+ '}';
+ }
}