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

sijie 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 a764c7f  ISSUE #1007: move checksum to proto
a764c7f is described below

commit a764c7f3336d2acb6b15e1b0197b0dc4cff7e5b1
Author: Arvin <[email protected]>
AuthorDate: Wed Jan 24 11:05:00 2018 -0800

    ISSUE #1007: move checksum to proto
    
    Descriptions of the changes in this PR:
    
    Refactor checksum to proto
    Master Issue: #<1007>
    
    Author: Arvin <[email protected]>
    
    Reviewers: Enrico Olivelli <[email protected]>, Sijie Guo 
<[email protected]>, Venkateswararao Jujjuri (JV) <None>
    
    This closes #1018 from ArvinDevel/issue1007, closes #1007
---
 .../org/apache/bookkeeper/client/BookKeeper.java   | 20 +++++++++--
 .../org/apache/bookkeeper/client/LedgerHandle.java | 15 ++++----
 .../apache/bookkeeper/client/LedgerHandleAdv.java  |  3 +-
 .../apache/bookkeeper/client/LedgerRecoveryOp.java |  6 ++--
 .../apache/bookkeeper/client/PendingReadLacOp.java |  7 ++--
 .../apache/bookkeeper/client/PendingReadOp.java    |  1 +
 .../client/ReadLastConfirmedAndEntryOp.java        |  1 +
 .../bookkeeper/client/ReadLastConfirmedOp.java     |  4 +--
 .../bookkeeper/client/TryReadLastConfirmedOp.java  |  6 ++--
 .../bookkeeper/proto/BookieProtoEncoding.java      |  2 +-
 .../checksum}/CRC32CDigestManager.java             |  2 +-
 .../checksum}/CRC32DigestManager.java              |  4 +--
 .../{client => proto/checksum}/DigestManager.java  | 40 ++++++++++++++--------
 .../checksum}/MacDigestManager.java                |  2 +-
 .../bookkeeper/proto/checksum/package-info.java    | 23 +++++++++++++
 .../org/apache/bookkeeper/client/ClientUtil.java   | 11 +++---
 .../bookkeeper/client/MockBookKeeperTestCase.java  | 24 +++++++++++--
 .../client/ParallelLedgerRecoveryTest.java         |  3 +-
 .../main/resources/bookkeeper/findbugsExclude.xml  |  3 ++
 .../checksum}/DigestTypeBenchmark.java             | 24 ++++++++-----
 20 files changed, 142 insertions(+), 59 deletions(-)

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java
index 6822a0f..79dd625 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java
@@ -71,6 +71,7 @@ import org.apache.bookkeeper.net.BookieSocketAddress;
 import org.apache.bookkeeper.net.DNSToSwitchMapping;
 import org.apache.bookkeeper.proto.BookieClient;
 import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback;
+import org.apache.bookkeeper.proto.DataFormats;
 import org.apache.bookkeeper.stats.Counter;
 import org.apache.bookkeeper.stats.NullStatsLogger;
 import org.apache.bookkeeper.stats.OpStatsLogger;
@@ -649,11 +650,14 @@ public class BookKeeper implements 
org.apache.bookkeeper.client.api.BookKeeper {
     }
 
     /**
-     * There are 2 digest types that can be used for verification. The CRC32 is
+     * There are 3 digest types that can be used for verification. The CRC32 is
      * cheap to compute but does not protect against byzantine bookies (i.e., a
      * bookie might report fake bytes and a matching CRC32). The MAC code is 
more
      * expensive to compute, but is protected by a password, i.e., a bookie 
can't
-     * report fake bytes with a mathching MAC unless it knows the password
+     * report fake bytes with a mathching MAC unless it knows the password.
+     * The CRC32C, which use SSE processor instruction, has better performance 
than CRC32.
+     * Legacy DigestType for backward compatibility. If we want to add new 
DigestType,
+     * we should add it in here, client.api.DigestType and DigestType in 
DataFormats.proto.
      */
     public enum DigestType {
         MAC, CRC32, CRC32C;
@@ -670,6 +674,18 @@ public class BookKeeper implements 
org.apache.bookkeeper.client.api.BookKeeper {
                     throw new IllegalArgumentException("Unable to convert 
digest type " + digestType);
             }
         }
+        public static DataFormats.LedgerMetadataFormat.DigestType 
toProtoDigestType(DigestType digestType) {
+            switch (digestType) {
+                case MAC:
+                    return DataFormats.LedgerMetadataFormat.DigestType.HMAC;
+                case CRC32:
+                    return DataFormats.LedgerMetadataFormat.DigestType.CRC32;
+                case CRC32C:
+                    return DataFormats.LedgerMetadataFormat.DigestType.CRC32C;
+                default:
+                    throw new IllegalArgumentException("Unable to convert 
digest type " + digestType);
+            }
+        }
     }
 
     ZooKeeper getZkHandle() {
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java
index e34ec27..ba6b3fc 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java
@@ -56,7 +56,6 @@ import 
org.apache.bookkeeper.client.AsyncCallback.ReadCallback;
 import org.apache.bookkeeper.client.AsyncCallback.ReadLastConfirmedCallback;
 import org.apache.bookkeeper.client.BKException.BKIncorrectParameterException;
 import org.apache.bookkeeper.client.BKException.BKReadException;
-import org.apache.bookkeeper.client.BookKeeper.DigestType;
 import org.apache.bookkeeper.client.SyncCallbackUtils.FutureReadLastConfirmed;
 import 
org.apache.bookkeeper.client.SyncCallbackUtils.FutureReadLastConfirmedAndEntry;
 import org.apache.bookkeeper.client.SyncCallbackUtils.SyncAddCallback;
@@ -78,6 +77,8 @@ import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback;
 import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.TimedGenericCallback;
 import org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State;
 import org.apache.bookkeeper.proto.PerChannelBookieClientPool;
+import org.apache.bookkeeper.proto.checksum.DigestManager;
+import org.apache.bookkeeper.proto.checksum.MacDigestManager;
 import org.apache.bookkeeper.stats.Counter;
 import org.apache.bookkeeper.stats.Gauge;
 import 
org.apache.bookkeeper.util.OrderedSafeExecutor.OrderedSafeGenericCallback;
@@ -137,7 +138,7 @@ public class LedgerHandle implements WriteHandle {
     }
 
     LedgerHandle(BookKeeper bk, long ledgerId, LedgerMetadata metadata,
-                 DigestType digestType, byte[] password, EnumSet<WriteFlag> 
writeFlags)
+                 BookKeeper.DigestType digestType, byte[] password, 
EnumSet<WriteFlag> writeFlags)
             throws GeneralSecurityException, NumberFormatException {
         this.bk = bk;
         this.metadata = metadata;
@@ -162,7 +163,7 @@ public class LedgerHandle implements WriteHandle {
             this.throttler = null;
         }
 
-        macManager = DigestManager.instantiate(ledgerId, password, digestType);
+        macManager = DigestManager.instantiate(ledgerId, password, 
BookKeeper.DigestType.toProtoDigestType(digestType));
 
         // If the password is empty, pass the same random ledger key which is 
generated by the hash of the empty
         // password, so that the bookie can avoid processing the keys for each 
entry
@@ -1079,8 +1080,8 @@ public class LedgerHandle implements WriteHandle {
                 @Override
                 public void readLastConfirmedDataComplete(int rc, 
DigestManager.RecoveryData data) {
                     if (rc == BKException.Code.OK) {
-                        updateLastConfirmed(data.lastAddConfirmed, 
data.length);
-                        cb.readLastConfirmedComplete(rc, 
data.lastAddConfirmed, ctx);
+                        updateLastConfirmed(data.getLastAddConfirmed(), 
data.getLength());
+                        cb.readLastConfirmedComplete(rc, 
data.getLastAddConfirmed(), ctx);
                     } else {
                         cb.readLastConfirmedComplete(rc, INVALID_ENTRY_ID, 
ctx);
                     }
@@ -1120,9 +1121,9 @@ public class LedgerHandle implements WriteHandle {
             @Override
             public void readLastConfirmedDataComplete(int rc, 
DigestManager.RecoveryData data) {
                 if (rc == BKException.Code.OK) {
-                    updateLastConfirmed(data.lastAddConfirmed, data.length);
+                    updateLastConfirmed(data.getLastAddConfirmed(), 
data.getLength());
                     if (completed.compareAndSet(false, true)) {
-                        cb.readLastConfirmedComplete(rc, 
data.lastAddConfirmed, ctx);
+                        cb.readLastConfirmedComplete(rc, 
data.getLastAddConfirmed(), ctx);
                     }
                 } else {
                     if (completed.compareAndSet(false, true)) {
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandleAdv.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandleAdv.java
index 435c453..0866db7 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandleAdv.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandleAdv.java
@@ -32,7 +32,6 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.PriorityBlockingQueue;
 import java.util.concurrent.RejectedExecutionException;
 import org.apache.bookkeeper.client.AsyncCallback.AddCallback;
-import org.apache.bookkeeper.client.BookKeeper.DigestType;
 import org.apache.bookkeeper.client.SyncCallbackUtils.SyncAddCallback;
 import org.apache.bookkeeper.client.api.WriteAdvHandle;
 import org.apache.bookkeeper.client.api.WriteFlag;
@@ -56,7 +55,7 @@ public class LedgerHandleAdv extends LedgerHandle implements 
WriteAdvHandle {
     }
 
     LedgerHandleAdv(BookKeeper bk, long ledgerId, LedgerMetadata metadata,
-            DigestType digestType, byte[] password, EnumSet<WriteFlag> 
writeFlags)
+                    BookKeeper.DigestType digestType, byte[] password, 
EnumSet<WriteFlag> writeFlags)
             throws GeneralSecurityException, NumberFormatException {
         super(bk, ledgerId, metadata, digestType, password, writeFlags);
         pendingAddOps = new PriorityBlockingQueue<PendingAddOp>(10, new 
PendingOpsComparator());
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java
index 6ea21b6..3956c68 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java
@@ -23,9 +23,9 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.bookkeeper.client.AsyncCallback.AddCallback;
 import org.apache.bookkeeper.client.AsyncCallback.CloseCallback;
-import org.apache.bookkeeper.client.DigestManager.RecoveryData;
 import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback;
 import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryListener;
+import org.apache.bookkeeper.proto.checksum.DigestManager.RecoveryData;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -110,8 +110,8 @@ class LedgerRecoveryOp implements ReadEntryListener, 
AddCallback {
                     public void readLastConfirmedDataComplete(int rc, 
RecoveryData data) {
                         if (rc == BKException.Code.OK) {
                             synchronized (lh) {
-                                lh.lastAddPushed = lh.lastAddConfirmed = 
data.lastAddConfirmed;
-                                lh.length = data.length;
+                                lh.lastAddPushed = lh.lastAddConfirmed = 
data.getLastAddConfirmed();
+                                lh.length = data.getLength();
                                 startEntryToRead = endEntryToRead = 
lh.lastAddConfirmed;
                             }
                             // keep a copy of ledger metadata before proceeding
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadLacOp.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadLacOp.java
index 07cbb0e..ecdbc5d 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadLacOp.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadLacOp.java
@@ -20,8 +20,8 @@ package org.apache.bookkeeper.client;
 import io.netty.buffer.ByteBuf;
 
 import org.apache.bookkeeper.client.BKException.BKDigestMatchException;
-import org.apache.bookkeeper.client.DigestManager.RecoveryData;
 import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadLacCallback;
+import org.apache.bookkeeper.proto.checksum.DigestManager.RecoveryData;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -102,8 +102,9 @@ class PendingReadLacOp implements ReadLacCallback {
 
                 // Extract lac from last entry on the disk
                 RecoveryData recoveryData = 
lh.macManager.verifyDigestAndReturnLastConfirmed(lastEntryBuffer);
-                if (recoveryData.lastAddConfirmed > maxLac) {
-                    maxLac = recoveryData.lastAddConfirmed;
+                long recoveredLac = recoveryData.getLastAddConfirmed();
+                if (recoveredLac > maxLac) {
+                    maxLac = recoveredLac;
                 }
                 heardValidResponse = true;
             } catch (BKDigestMatchException e) {
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java
index 2e59e35..041ccd1 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java
@@ -42,6 +42,7 @@ import org.apache.bookkeeper.common.util.SafeRunnable;
 import org.apache.bookkeeper.net.BookieSocketAddress;
 import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryCallback;
 import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryCallbackCtx;
+import org.apache.bookkeeper.proto.checksum.DigestManager;
 import org.apache.bookkeeper.stats.Counter;
 import org.apache.bookkeeper.stats.OpStatsLogger;
 import org.apache.bookkeeper.util.MathUtils;
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java
index 07cb318..aba3a17 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java
@@ -33,6 +33,7 @@ import org.apache.bookkeeper.net.BookieSocketAddress;
 import org.apache.bookkeeper.proto.BookieProtocol;
 import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks;
 import org.apache.bookkeeper.proto.ReadLastConfirmedAndEntryContext;
+import org.apache.bookkeeper.proto.checksum.DigestManager;
 import org.apache.bookkeeper.util.MathUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java
index 0ae93cc..d0e116e 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java
@@ -21,9 +21,9 @@ import io.netty.buffer.ByteBuf;
 import io.netty.util.ReferenceCountUtil;
 
 import org.apache.bookkeeper.client.BKException.BKDigestMatchException;
-import org.apache.bookkeeper.client.DigestManager.RecoveryData;
 import org.apache.bookkeeper.proto.BookieProtocol;
 import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryCallback;
+import org.apache.bookkeeper.proto.checksum.DigestManager.RecoveryData;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -88,7 +88,7 @@ class ReadLastConfirmedOp implements ReadEntryCallback {
         if (rc == BKException.Code.OK) {
             try {
                 RecoveryData recoveryData = 
lh.macManager.verifyDigestAndReturnLastConfirmed(buffer);
-                if (recoveryData.lastAddConfirmed > 
maxRecoveredData.lastAddConfirmed) {
+                if (recoveryData.getLastAddConfirmed() > 
maxRecoveredData.getLastAddConfirmed()) {
                     maxRecoveredData = recoveryData;
                 }
                 heardValidResponse = true;
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java
index 39026fa..bcaf231 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java
@@ -19,10 +19,10 @@ package org.apache.bookkeeper.client;
 
 import io.netty.buffer.ByteBuf;
 
-import org.apache.bookkeeper.client.DigestManager.RecoveryData;
 import 
org.apache.bookkeeper.client.ReadLastConfirmedOp.LastConfirmedDataCallback;
 import org.apache.bookkeeper.proto.BookieProtocol;
 import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryCallback;
+import org.apache.bookkeeper.proto.checksum.DigestManager.RecoveryData;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -72,9 +72,9 @@ class TryReadLastConfirmedOp implements ReadEntryCallback {
                 RecoveryData recoveryData = 
lh.macManager.verifyDigestAndReturnLastConfirmed(buffer);
                 if (LOG.isTraceEnabled()) {
                     LOG.trace("Received lastAddConfirmed (lac={}, length={}) 
from bookie({}) for (lid={}).",
-                            recoveryData.lastAddConfirmed, 
recoveryData.length, bookieIndex, ledgerId);
+                            recoveryData.getLastAddConfirmed(), 
recoveryData.getLength(), bookieIndex, ledgerId);
                 }
-                if (recoveryData.lastAddConfirmed > 
maxRecoveredData.lastAddConfirmed) {
+                if (recoveryData.getLastAddConfirmed() > 
maxRecoveredData.getLastAddConfirmed()) {
                     maxRecoveredData = recoveryData;
                     // callback immediately
                     cb.readLastConfirmedDataComplete(BKException.Code.OK, 
maxRecoveredData);
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java
index 0423f76..33bb675 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java
@@ -39,8 +39,8 @@ import java.io.IOException;
 import java.security.NoSuchAlgorithmException;
 import java.util.List;
 
-import org.apache.bookkeeper.client.MacDigestManager;
 import org.apache.bookkeeper.proto.BookieProtocol.PacketHeader;
+import org.apache.bookkeeper.proto.checksum.MacDigestManager;
 import org.apache.bookkeeper.util.DoubleByteBuf;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/CRC32CDigestManager.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/CRC32CDigestManager.java
similarity index 98%
rename from 
bookkeeper-server/src/main/java/org/apache/bookkeeper/client/CRC32CDigestManager.java
rename to 
bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/CRC32CDigestManager.java
index 86394cc..ca7fdec 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/CRC32CDigestManager.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/CRC32CDigestManager.java
@@ -1,4 +1,4 @@
-package org.apache.bookkeeper.client;
+package org.apache.bookkeeper.proto.checksum;
 
 /*
 * Licensed to the Apache Software Foundation (ASF) under one
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/CRC32DigestManager.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/CRC32DigestManager.java
similarity index 96%
rename from 
bookkeeper-server/src/main/java/org/apache/bookkeeper/client/CRC32DigestManager.java
rename to 
bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/CRC32DigestManager.java
index 25a0f61..1f06640 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/CRC32DigestManager.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/CRC32DigestManager.java
@@ -1,4 +1,4 @@
-package org.apache.bookkeeper.client;
+package org.apache.bookkeeper.proto.checksum;
 
 /*
 * Licensed to the Apache Software Foundation (ASF) under one
@@ -18,9 +18,7 @@ package org.apache.bookkeeper.client;
 * limitations under the License.
 */
 
-
 import io.netty.buffer.ByteBuf;
-
 import java.util.zip.CRC32;
 
 class CRC32DigestManager extends DigestManager {
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DigestManager.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/DigestManager.java
similarity index 87%
rename from 
bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DigestManager.java
rename to 
bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/DigestManager.java
index 21c9ae7..67386a6 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DigestManager.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/DigestManager.java
@@ -1,4 +1,4 @@
-package org.apache.bookkeeper.client;
+package org.apache.bookkeeper.proto.checksum;
 
 /**
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -25,7 +25,8 @@ import io.netty.buffer.Unpooled;
 import java.security.GeneralSecurityException;
 
 import org.apache.bookkeeper.client.BKException.BKDigestMatchException;
-import org.apache.bookkeeper.client.BookKeeper.DigestType;
+import org.apache.bookkeeper.client.LedgerHandle;
+import org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.DigestType;
 import org.apache.bookkeeper.util.DoubleByteBuf;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,14 +35,14 @@ import org.slf4j.LoggerFactory;
  * This class takes an entry, attaches a digest to it and packages it with 
relevant
  * data so that it can be shipped to the bookie. On the return side, it also
  * gets a packet, checks that the digest matches, and extracts the original 
entry
- * for the packet. Currently 2 types of digests are supported: MAC (based on 
SHA-1) and CRC32
+ * for the packet. Currently 3 types of digests are supported: MAC (based on 
SHA-1) and CRC32 and CRC32C.
  */
 
-abstract class DigestManager {
+public abstract class DigestManager {
     private static final Logger logger = 
LoggerFactory.getLogger(DigestManager.class);
 
-    static final int METADATA_LENGTH = 32;
-    static final int LAC_METADATA_LENGTH = 16;
+    public static final int METADATA_LENGTH = 32;
+    public static final int LAC_METADATA_LENGTH = 16;
 
     long ledgerId;
 
@@ -62,10 +63,10 @@ abstract class DigestManager {
         macCodeLength = getMacCodeLength();
     }
 
-    static DigestManager instantiate(long ledgerId, byte[] passwd, DigestType 
digestType)
+    public static DigestManager instantiate(long ledgerId, byte[] passwd, 
DigestType digestType)
             throws GeneralSecurityException {
         switch(digestType) {
-        case MAC:
+        case HMAC:
             return new MacDigestManager(ledgerId, passwd);
         case CRC32:
             return new CRC32DigestManager(ledgerId);
@@ -169,7 +170,7 @@ abstract class DigestManager {
 
     }
 
-    long verifyDigestAndReturnLac(ByteBuf dataReceived) throws 
BKDigestMatchException{
+    public long verifyDigestAndReturnLac(ByteBuf dataReceived) throws 
BKDigestMatchException{
         if ((LAC_METADATA_LENGTH + macCodeLength) > 
dataReceived.readableBytes()) {
             logger.error("Data received is smaller than the minimum for this 
digest type."
                     + " Either the packet it corrupt, or the wrong digest is 
configured. "
@@ -210,25 +211,36 @@ abstract class DigestManager {
      * @return
      * @throws BKDigestMatchException
      */
-    ByteBuf verifyDigestAndReturnData(long entryId, ByteBuf dataReceived)
+    public ByteBuf verifyDigestAndReturnData(long entryId, ByteBuf 
dataReceived)
             throws BKDigestMatchException {
         verifyDigest(entryId, dataReceived);
         dataReceived.readerIndex(METADATA_LENGTH + macCodeLength);
         return dataReceived;
     }
 
-    static class RecoveryData {
-        long lastAddConfirmed;
-        long length;
+    /**
+     * A representation of RecoveryData.
+     */
+    public static final class RecoveryData {
+        final long lastAddConfirmed;
+        final long length;
 
         public RecoveryData(long lastAddConfirmed, long length) {
             this.lastAddConfirmed = lastAddConfirmed;
             this.length = length;
         }
 
+        public long getLastAddConfirmed() {
+            return lastAddConfirmed;
+        }
+
+        public long getLength() {
+            return length;
+        }
+
     }
 
-    RecoveryData verifyDigestAndReturnLastConfirmed(ByteBuf dataReceived) 
throws BKDigestMatchException {
+    public RecoveryData verifyDigestAndReturnLastConfirmed(ByteBuf 
dataReceived) throws BKDigestMatchException {
         verifyDigest(dataReceived);
         dataReceived.readerIndex(8);
 
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/MacDigestManager.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/MacDigestManager.java
similarity index 98%
rename from 
bookkeeper-server/src/main/java/org/apache/bookkeeper/client/MacDigestManager.java
rename to 
bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/MacDigestManager.java
index fe67700..d897a9e 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/MacDigestManager.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/MacDigestManager.java
@@ -16,7 +16,7 @@
 * limitations under the License.
 */
 
-package org.apache.bookkeeper.client;
+package org.apache.bookkeeper.proto.checksum;
 
 import static com.google.common.base.Charsets.UTF_8;
 
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/package-info.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/package-info.java
new file mode 100644
index 0000000..7c5ba38
--- /dev/null
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Classes related to the Bookkeeper checksum.
+ */
+package org.apache.bookkeeper.proto.checksum;
diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/ClientUtil.java 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/ClientUtil.java
index c0400ee..25842f1 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/ClientUtil.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/ClientUtil.java
@@ -17,21 +17,24 @@
  */
 package org.apache.bookkeeper.client;
 
+import static 
org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.DigestType.CRC32;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
+import java.security.GeneralSecurityException;
+import org.apache.bookkeeper.proto.checksum.DigestManager;
 
 /**
  * Client utilities.
  */
 public class ClientUtil {
     public static ByteBuf generatePacket(long ledgerId, long entryId, long 
lastAddConfirmed,
-                                               long length, byte[] data) {
+                                               long length, byte[] data) 
throws GeneralSecurityException {
         return generatePacket(ledgerId, entryId, lastAddConfirmed, length, 
data, 0, data.length);
     }
 
-    public static ByteBuf generatePacket(long ledgerId, long entryId, long 
lastAddConfirmed,
-                                               long length, byte[] data, int 
offset, int len) {
-        CRC32DigestManager dm = new CRC32DigestManager(ledgerId);
+    public static ByteBuf generatePacket(long ledgerId, long entryId, long 
lastAddConfirmed, long length,
+                                         byte[] data, int offset, int len) 
throws GeneralSecurityException {
+        DigestManager dm = DigestManager.instantiate(ledgerId, new byte[2], 
CRC32);
         return dm.computeDigestAndPackageForSending(entryId, lastAddConfirmed, 
length,
                                                     
Unpooled.wrappedBuffer(data, offset, len));
     }
diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java
 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java
index 6fc92b7..1ebfb8f 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java
@@ -27,6 +27,7 @@ import static org.mockito.Mockito.when;
 import com.google.common.base.Optional;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
+import java.security.GeneralSecurityException;
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -49,6 +50,8 @@ import org.apache.bookkeeper.net.BookieSocketAddress;
 import org.apache.bookkeeper.proto.BookieClient;
 import org.apache.bookkeeper.proto.BookieProtocol;
 import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks;
+import org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.DigestType;
+import org.apache.bookkeeper.proto.checksum.DigestManager;
 import org.apache.bookkeeper.stats.NullStatsLogger;
 import org.apache.bookkeeper.util.OrderedSafeExecutor;
 import org.junit.After;
@@ -333,7 +336,12 @@ public abstract class MockBookKeeperTestCase {
             long entryId = (Long) args[3];
 
             executor.submitOrdered(ledgerId, () -> {
-                DigestManager macManager = new CRC32DigestManager(ledgerId);
+                DigestManager macManager = null;
+                try {
+                    macManager = DigestManager.instantiate(ledgerId, new 
byte[2], DigestType.CRC32);
+                } catch (GeneralSecurityException gse){
+                    LOG.error("Initialize macManager fail", gse);
+                }
                 fencedLedgers.add(ledgerId);
                 MockEntry mockEntry = getMockLedgerEntry(ledgerId, 
bookieSocketAddress, entryId);
                 if (mockEntry != null) {
@@ -363,7 +371,12 @@ public abstract class MockBookKeeperTestCase {
                 (BookkeeperInternalCallbacks.ReadEntryCallback) args[3];
 
             executor.submitOrdered(ledgerId, () -> {
-                DigestManager macManager = new CRC32DigestManager(ledgerId);
+                DigestManager macManager = null;
+                try {
+                    macManager = DigestManager.instantiate(ledgerId, new 
byte[2], DigestType.CRC32);
+                } catch (GeneralSecurityException gse){
+                    LOG.error("Initialize macManager fail", gse);
+                }
                 MockEntry mockEntry = getMockLedgerEntry(ledgerId, 
bookieSocketAddress, entryId);
                 if (mockEntry != null) {
                     LOG.info("readEntry - found mock entry {}@{} at {}", 
entryId, ledgerId, bookieSocketAddress);
@@ -387,7 +400,12 @@ public abstract class MockBookKeeperTestCase {
             throws BKException.BKDigestMatchException {
         ByteBuf toSendCopy = Unpooled.copiedBuffer(toSend);
         toSendCopy.resetReaderIndex();
-        DigestManager macManager = new CRC32DigestManager(ledgerId);
+        DigestManager macManager = null;
+        try {
+            macManager = DigestManager.instantiate(ledgerId, new byte[2], 
DigestType.CRC32);
+        } catch (GeneralSecurityException gse){
+            LOG.error("Initialize macManager fail", gse);
+        }
         ByteBuf content = macManager.verifyDigestAndReturnData(entryId, 
toSendCopy);
         byte[] entry = new byte[content.readableBytes()];
         content.readBytes(entry);
diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/ParallelLedgerRecoveryTest.java
 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/ParallelLedgerRecoveryTest.java
index 48a1828..085a248 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/ParallelLedgerRecoveryTest.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/ParallelLedgerRecoveryTest.java
@@ -52,6 +52,7 @@ import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback;
 import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.LedgerMetadataListener;
 import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.Processor;
 import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.WriteCallback;
+import org.apache.bookkeeper.proto.checksum.DigestManager;
 import org.apache.bookkeeper.test.BookKeeperClusterTestCase;
 import org.apache.bookkeeper.versioning.Version;
 import org.apache.zookeeper.AsyncCallback.VoidCallback;
@@ -605,7 +606,7 @@ public class ParallelLedgerRecoveryTest extends 
BookKeeperClusterTestCase {
             @Override
             public void readLastConfirmedDataComplete(int rc, 
DigestManager.RecoveryData data) {
                 rcHolder.set(rc);
-                lacHolder.set(data.lastAddConfirmed);
+                lacHolder.set(data.getLastAddConfirmed());
                 doneLatch.countDown();
             }
         }).initiate();
diff --git a/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml 
b/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml
index 0328f7d..aede153 100644
--- a/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml
+++ b/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml
@@ -27,6 +27,9 @@
     <Class name="~org\.apache\.bookkeeper\.proto\.DataFormats.*" />
   </Match>
   <Match>
+    <Class name="~org\.apache\.bookkeeper\.proto\.checksum\.generated.*" />
+  </Match>
+  <Match>
     <!-- generated code, we can't be held responsible for findbugs in it //-->
     <Class name="~org\.apache\.bookkeeper\.proto\.BookkeeperProtocol.*" />
   </Match>
diff --git 
a/microbenchmarks/src/main/java/org/apache/bookkeeper/client/DigestTypeBenchmark.java
 
b/microbenchmarks/src/main/java/org/apache/bookkeeper/proto/checksum/DigestTypeBenchmark.java
similarity index 95%
rename from 
microbenchmarks/src/main/java/org/apache/bookkeeper/client/DigestTypeBenchmark.java
rename to 
microbenchmarks/src/main/java/org/apache/bookkeeper/proto/checksum/DigestTypeBenchmark.java
index bda4da5..339f5d2 100644
--- 
a/microbenchmarks/src/main/java/org/apache/bookkeeper/client/DigestTypeBenchmark.java
+++ 
b/microbenchmarks/src/main/java/org/apache/bookkeeper/proto/checksum/DigestTypeBenchmark.java
@@ -19,13 +19,14 @@
  *
  */
 
-package org.apache.bookkeeper.client;
+package org.apache.bookkeeper.proto.checksum;
 
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
+import io.netty.buffer.Unpooled;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
-
-import io.netty.buffer.ByteBufAllocator;
-import org.apache.bookkeeper.client.BookKeeper.DigestType;
+import org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.DigestType;
 import org.apache.bookkeeper.util.DoubleByteBuf;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
@@ -42,28 +43,30 @@ import org.openjdk.jmh.annotations.TearDown;
 import org.openjdk.jmh.annotations.Threads;
 import org.openjdk.jmh.annotations.Warmup;
 
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-
 /**
  * Microbenchmarks for different digest type
  * getting started:
  * 1. http://tutorials.jenkov.com/java-performance/jmh.html
  * 2. 
http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
  * 3. google
- *
  * To run:
  * build project from command line.
  * execute ./run.sh
  */
 public class DigestTypeBenchmark {
 
+    /**
+     * BufferType.
+     */
     public enum BufferType {
         ARRAY_BACKED,
         NOT_ARRAY_BACKED,
         BYTE_BUF_DEFAULT_ALLOC
     }
 
+    /**
+     * Digest.
+     */
     public enum Digest {
         MAC,
         CRC32,
@@ -76,6 +79,9 @@ public class DigestTypeBenchmark {
         return b;
     }
 
+    /**
+     * MyState.
+     */
     @State(Scope.Thread)
     public static class MyState {
 
@@ -106,7 +112,7 @@ public class DigestTypeBenchmark {
                     password, DigestType.CRC32C);
 
             mac = 
DigestManager.instantiate(ThreadLocalRandom.current().nextLong(0, 
Long.MAX_VALUE),
-                    password, DigestType.MAC);
+                    password, DigestType.HMAC);
 
             digestBuf = 
Unpooled.buffer(getDigestManager(digest).getMacCodeLength());
 

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to