Github user hanm commented on a diff in the pull request: https://github.com/apache/zookeeper/pull/606#discussion_r213189883 --- Diff: src/java/main/org/apache/zookeeper/server/DataTree.java --- @@ -941,22 +945,41 @@ public ProcessTxnResult processTxn(TxnHeader header, Record txn) LOG.debug("Failed: " + header + ":" + txn, e); } } + + /* - * A snapshot might be in progress while we are modifying the data - * tree. If we set lastProcessedZxid prior to making corresponding - * change to the tree, then the zxid associated with the snapshot - * file will be ahead of its contents. Thus, while restoring from - * the snapshot, the restore method will not apply the transaction - * for zxid associated with the snapshot file, since the restore - * method assumes that transaction to be present in the snapshot. + * Things we can only update after the whole txn is applied to data + * tree. * - * To avoid this, we first apply the transaction and then modify - * lastProcessedZxid. During restore, we correctly handle the - * case where the snapshot contains data ahead of the zxid associated - * with the file. + * If we update the lastProcessedZxid with the first sub txn in multi + * and there is a snapshot in progress, it's possible that the zxid + * associated with the snapshot only include partial of the multi op. + * + * When loading snapshot, it will only load the txns after the zxid + * associated with snapshot file, which could data inconsistency due --- End diff -- nit: which could **cause** data inconsistency
---