Github user eolivelli commented on a diff in the pull request: https://github.com/apache/zookeeper/pull/632#discussion_r223181405 --- Diff: zookeeper-server/src/main/java/org/apache/zookeeper/server/DataTree.java --- @@ -1521,4 +1562,179 @@ public boolean removeWatch(String path, WatcherType type, Watcher watcher) { public ReferenceCountedACLCache getReferenceCountedAclCache() { return aclCache; } + + /** + * Add the digest to the historical list, and update the latest zxid digest. + */ + private void logZxidDigest(long zxid, long digest) { + ZxidDigest zxidDigest = new ZxidDigest(zxid, DigestCalculator.DIGEST_VERSION, digest); + lastProcessedZxidDigest = zxidDigest; + if (zxidDigest.zxid % 128 == 0) { + synchronized (digestLog) { + digestLog.add(zxidDigest); + if (digestLog.size() > DIGEST_LOG_LIMIT) { + digestLog.poll(); + } + } + } + } + + /** + * Serializing the digest to snapshot, this is done after the data tree + * is being serialized, so when we replay the txns and it hits this zxid + * we know we should be in a non-fuzzy state, and have the same digest. + * + * @param oa the output stream to write to + * @return true if the digest is serialized successfully + */ + public Boolean serializeZxidDigest(OutputArchive oa) throws IOException { + if (!DigestCalculator.digestEnabled()) { + return false; + } + + ZxidDigest zxidDigest = lastProcessedZxidDigest; + if (zxidDigest == null) { + // write an empty digest + zxidDigest = new ZxidDigest(); + } + zxidDigest.serialize(oa); + return true; + } + + /** + * Deserializing the zxid digest from the input stream and update the + * digestFromLoadedSnapshot. + * + * @param ia the input stream to read from + * @return the true if it deserialized successfully + */ + public Boolean deserializeZxidDigest(InputArchive ia) throws IOException { --- End diff -- Nit: boolean
---