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

ivank 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 9b3c6b7  Make LedgerMetadata fields for closing immutable
9b3c6b7 is described below

commit 9b3c6b73d8f667d52eb78025f07d3aedec6e9de0
Author: Ivan Kelly <[email protected]>
AuthorDate: Fri Nov 23 14:32:31 2018 +0000

    Make LedgerMetadata fields for closing immutable
    
    Master issue: #281
    
    
    Reviewers: Enrico Olivelli <[email protected]>, Sijie Guo 
<[email protected]>
    
    This closes #1831 from ivankelly/close-immut
---
 .../apache/bookkeeper/client/LedgerMetadata.java   | 39 ++++++++--------------
 .../bookkeeper/client/LedgerMetadataBuilder.java   | 11 ++----
 .../bookkeeper/client/LedgerRecoveryTest.java      |  6 ++--
 3 files changed, 18 insertions(+), 38 deletions(-)

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java
index bf5e9f5..4f67077 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java
@@ -78,9 +78,9 @@ public class LedgerMetadata implements 
org.apache.bookkeeper.client.api.LedgerMe
     private final int writeQuorumSize;
     private final int ackQuorumSize;
 
-    private LedgerMetadataFormat.State state;
-    private long length;
-    private long lastEntryId;
+    private final LedgerMetadataFormat.State state;
+    private final long length;
+    private final long lastEntryId;
     private final long ctime;
     final boolean storeCtime; // non-private so builder can access for copy
 
@@ -107,18 +107,22 @@ public class LedgerMetadata implements 
org.apache.bookkeeper.client.api.LedgerMe
                    boolean storeCtime,
                    Map<String, byte[]> customMetadata) {
         checkArgument(ensembles.size() > 0, "There must be at least one 
ensemble in the ledger");
+        if (state == LedgerMetadataFormat.State.CLOSED) {
+            checkArgument(length.isPresent(), "Closed ledger must have a 
length");
+            checkArgument(lastEntryId.isPresent(), "Closed ledger must have a 
last entry");
+        } else {
+            checkArgument(!length.isPresent(), "Non-closed ledger must not 
have a length");
+            checkArgument(!lastEntryId.isPresent(), "Non-closed ledger must 
not have a last entry");
+        }
 
         this.metadataFormatVersion = metadataFormatVersion;
         this.ensembleSize = ensembleSize;
         this.writeQuorumSize = writeQuorumSize;
         this.ackQuorumSize = ackQuorumSize;
         this.state = state;
-        if (lastEntryId.isPresent()) {
-            this.lastEntryId = lastEntryId.get();
-        } else {
-            this.lastEntryId = LedgerHandle.INVALID_ENTRY_ID;
-        }
-        length.ifPresent((l) -> this.length = l);
+
+        this.lastEntryId = lastEntryId.orElse(LedgerHandle.INVALID_ENTRY_ID);
+        this.length = length.orElse(0L);
 
         this.ensembles = Collections.unmodifiableNavigableMap(
                 ensembles.entrySet().stream().collect(TreeMap::new,
@@ -248,10 +252,6 @@ public class LedgerMetadata implements 
org.apache.bookkeeper.client.api.LedgerMe
         return length;
     }
 
-    void setLength(long length) {
-        this.length = length;
-    }
-
     @Override
     public boolean isClosed() {
         return state == LedgerMetadataFormat.State.CLOSED;
@@ -265,19 +265,6 @@ public class LedgerMetadata implements 
org.apache.bookkeeper.client.api.LedgerMe
         return state;
     }
 
-    void setState(LedgerMetadataFormat.State state) {
-        this.state = state;
-    }
-
-    void markLedgerInRecovery() {
-        state = LedgerMetadataFormat.State.IN_RECOVERY;
-    }
-
-    void close(long entryId) {
-        lastEntryId = entryId;
-        state = LedgerMetadataFormat.State.CLOSED;
-    }
-
     List<BookieSocketAddress> getCurrentEnsemble() {
         return currentEnsemble;
     }
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataBuilder.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataBuilder.java
index 74ec717..4a42c70 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataBuilder.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataBuilder.java
@@ -73,14 +73,9 @@ public class LedgerMetadataBuilder {
         builder.ackQuorumSize = other.getAckQuorumSize();
 
         builder.state = other.getState();
-
-        long lastEntryId = other.getLastEntryId();
-        if (lastEntryId != LedgerHandle.INVALID_ENTRY_ID) {
-            builder.lastEntryId = Optional.of(lastEntryId);
-        }
-        long length = other.getLength();
-        if (length > 0) {
-            builder.length = Optional.of(length);
+        if (builder.state == LedgerMetadataFormat.State.CLOSED) {
+            builder.lastEntryId = Optional.of(other.getLastEntryId());
+            builder.length = Optional.of(other.getLength());
         }
 
         builder.ensembles.putAll(other.getAllEnsembles());
diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/LedgerRecoveryTest.java
 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/LedgerRecoveryTest.java
index 6a21da2..9a927b6 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/LedgerRecoveryTest.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/LedgerRecoveryTest.java
@@ -84,10 +84,8 @@ public class LedgerRecoveryTest extends 
BookKeeperClusterTestCase {
         /*
          * Check if has recovered properly.
          */
-        assertTrue("Has not recovered correctly: " + 
afterlh.getLastAddConfirmed(),
-                   afterlh.getLastAddConfirmed() == numEntries - 1);
-        assertTrue("Has not set the length correctly: " + afterlh.getLength() 
+ ", " + length,
-                   afterlh.getLength() == length);
+        assertEquals("Has not recovered correctly", numEntries - 1, 
afterlh.getLastAddConfirmed());
+        assertEquals("Has not set the length correctly", length, 
afterlh.getLength());
     }
 
     @Test

Reply via email to