This is an automated email from the ASF dual-hosted git repository.

reddycharan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new 41b39c6  ISSUE #1967: make ledger creation and removal robust to zk 
connectionloss
41b39c6 is described below

commit 41b39c6eff249729a698838e880ad77cc0c18c67
Author: Charan Reddy Guttapalem <[email protected]>
AuthorDate: Thu May 2 11:42:49 2019 -0700

    ISSUE #1967: make ledger creation and removal robust to zk connectionloss
    
    
    - fix test failures in TestLedgerMetadataSerDe
    
    
    Reviewers: Enrico Olivelli <[email protected]>, Sijie Guo 
<[email protected]>
    
    This closes #2070 from reddycharan/fixzktestfailures, closes #1967
---
 .../bookkeeper/meta/LedgerMetadataSerDe.java       | 22 +++++++++++++++++-----
 .../meta/AbstractZkLedgerManagerTest.java          | 14 ++++++++++++--
 .../bookkeeper/meta/TestLedgerMetadataSerDe.java   | 13 ++++++-------
 3 files changed, 35 insertions(+), 14 deletions(-)

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java
index b34b34b..2ee441a 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java
@@ -181,7 +181,12 @@ public class LedgerMetadataSerDe {
                 break;
             }
 
-            builder.setCtime(metadata.getCtime());
+            /** Hack to get around fact that ctime was never versioned 
correctly */
+            if (LedgerMetadataUtils.shouldStoreCtime(metadata)) {
+                builder.setCtime(metadata.getCtime());
+            }
+
+
             
builder.setDigestType(apiToProtoDigestType(metadata.getDigestType()));
 
             serializePassword(metadata.getPassword(), builder);
@@ -351,7 +356,7 @@ public class LedgerMetadataSerDe {
 
             switch (metadataFormatVersion) {
             case METADATA_FORMAT_VERSION_3:
-                return parseVersion3Config(is);
+                return parseVersion3Config(is, metadataStoreCtime);
             case METADATA_FORMAT_VERSION_2:
                 return parseVersion2Config(is, metadataStoreCtime);
             case METADATA_FORMAT_VERSION_1:
@@ -365,12 +370,19 @@ public class LedgerMetadataSerDe {
         }
     }
 
-    private static LedgerMetadata parseVersion3Config(InputStream is) throws 
IOException {
+    private static LedgerMetadata parseVersion3Config(InputStream is, 
Optional<Long> metadataStoreCtime)
+            throws IOException {
         LedgerMetadataBuilder builder = LedgerMetadataBuilder.create()
-            .withMetadataFormatVersion(METADATA_FORMAT_VERSION_3);
+                .withMetadataFormatVersion(METADATA_FORMAT_VERSION_3);
         LedgerMetadataFormat.Builder formatBuilder = 
LedgerMetadataFormat.newBuilder();
         formatBuilder.mergeDelimitedFrom(is);
-        decodeFormat(formatBuilder.build(), builder);
+        LedgerMetadataFormat data = formatBuilder.build();
+        decodeFormat(data, builder);
+        if (data.hasCtime()) {
+            builder.storingCreationTime(true);
+        } else if (metadataStoreCtime.isPresent()) {
+            
builder.withCreationTime(metadataStoreCtime.get()).storingCreationTime(false);
+        }
         return builder.build();
     }
 
diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java
 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java
index 0dc2b53..b54b7d9 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java
@@ -124,7 +124,6 @@ public class AbstractZkLedgerManagerTest extends 
MockZooKeeperTestCase {
         this.metadata = LedgerMetadataBuilder.create()
             .withDigestType(DigestType.CRC32C).withPassword(new byte[0])
             .withEnsembleSize(5)
-            .withMetadataFormatVersion(2)
             .withWriteQuorumSize(3)
             .withAckQuorumSize(3)
             .newEnsembleEntry(0L, ensemble)
@@ -180,7 +179,18 @@ public class AbstractZkLedgerManagerTest extends 
MockZooKeeperTestCase {
         mockZkUtilsAsyncCreateFullPathOptimistic(
             ledgerStr, CreateMode.PERSISTENT,
             KeeperException.Code.NODEEXISTS.intValue(), null);
-
+        Stat stat = mock(Stat.class);
+        when(stat.getVersion()).thenReturn(1234);
+        when(stat.getCtime()).thenReturn(metadata.getCtime());
+        /*
+         * this is needed because in AbstractZkLedgerManager.readLedgerMetadata
+         * if MetadataFormatVersion is >2, then for createLedgerMetadata if we
+         * get NODEEXISTS exception then it will try to read to make sure 
ledger
+         * creation is robust to ZK connection loss. Please check Issue #1967.
+         */
+        mockZkGetData(
+                ledgerStr, false,
+                KeeperException.Code.OK.intValue(), serDe.serialize(metadata), 
stat);
         try {
             result(ledgerManager.createLedgerMetadata(ledgerId, metadata));
             fail("Should fail to create ledger metadata if the ledger already 
exists");
diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/TestLedgerMetadataSerDe.java
 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/TestLedgerMetadataSerDe.java
index 1c9de74..a159e6c 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/TestLedgerMetadataSerDe.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/TestLedgerMetadataSerDe.java
@@ -122,9 +122,9 @@ public class TestLedgerMetadataSerDe {
     }
 
     @Test
-    public void testPeggedToV2SerDe() throws Exception {
+    public void testPeggedToV3SerDe() throws Exception {
         LedgerMetadataSerDe serDe = new LedgerMetadataSerDe();
-        LedgerMetadata metadata = 
LedgerMetadataBuilder.create().withMetadataFormatVersion(2)
+        LedgerMetadata metadata = LedgerMetadataBuilder.create()
             .withEnsembleSize(3).withWriteQuorumSize(2).withAckQuorumSize(1)
             
.withPassword("foobar".getBytes(UTF_8)).withDigestType(DigestType.CRC32C)
             .newEnsembleEntry(0L, Lists.newArrayList(new 
BookieSocketAddress("192.0.2.1", 3181),
@@ -134,11 +134,11 @@ public class TestLedgerMetadataSerDe {
         byte[] encoded = serDe.serialize(metadata);
 
         LedgerMetadata decoded = serDe.parseConfig(encoded, Optional.empty());
-        Assert.assertEquals(2, decoded.getMetadataFormatVersion());
+        Assert.assertEquals(LedgerMetadataSerDe.METADATA_FORMAT_VERSION_3, 
decoded.getMetadataFormatVersion());
     }
 
     @Test
-    public void testStoreSystemtimeAsLedgerCtimeEnabledWithVersion2()
+    public void testStoreSystemtimeAsLedgerCtimeEnabledWithNewerVersion()
             throws Exception {
         LedgerMetadata lm = LedgerMetadataBuilder.create()
             .withEnsembleSize(3).withWriteQuorumSize(2).withAckQuorumSize(1)
@@ -161,9 +161,9 @@ public class TestLedgerMetadataSerDe {
     }
 
     @Test
-    public void testStoreSystemtimeAsLedgerCtimeDisabledWithVersion2()
+    public void testStoreSystemtimeAsLedgerCtimeDisabledWithNewerVersion()
             throws Exception {
-        LedgerMetadata lm = 
LedgerMetadataBuilder.create().withMetadataFormatVersion(2)
+        LedgerMetadata lm = LedgerMetadataBuilder.create()
             .withEnsembleSize(3).withWriteQuorumSize(2).withAckQuorumSize(1)
             
.withPassword("foobar".getBytes(UTF_8)).withDigestType(DigestType.CRC32C)
             .newEnsembleEntry(0L, Lists.newArrayList(
@@ -171,7 +171,6 @@ public class TestLedgerMetadataSerDe {
                                       new BookieSocketAddress("192.0.2.2", 
1234),
                                       new BookieSocketAddress("192.0.2.3", 
1234)))
             .build();
-
         LedgerMetadataSerDe serDe = new LedgerMetadataSerDe();
         byte[] serialized = serDe.serialize(lm);
         LedgerMetadata deserialized = serDe.parseConfig(serialized, 
Optional.of(654321L));

Reply via email to