jackye1995 commented on code in PR #5888:
URL: https://github.com/apache/iceberg/pull/5888#discussion_r1131789195


##########
core/src/main/java/org/apache/iceberg/SnapshotProducer.java:
##########
@@ -615,4 +630,49 @@ private static void updateTotal(
       }
     }
   }
+
+  private Long snapshotIdToRollbackToOnConflict(Long parentSnapshotId) {
+    Long newParentSnapshotId = parentSnapshotId;
+    if (shouldRollbackReplaceOnConflict()) {
+      // add a set snapshot op on top of base to roll back to parent snapshot
+      boolean isCommitSuccessfullyApplied = false;
+      // Update parentSnapshot to it's grandParent
+      // provided parentSnapshot is of type replace and never rollback beyond 
startingSnapshotId
+      while (newParentSnapshotId != null
+          && 
DataOperations.REPLACE.equals(base.snapshot(newParentSnapshotId).operation())
+          && !newParentSnapshotId.equals(startingSnapshotId())) {
+        // create a tempTableOperation to pass base with rollback to validate 
of update
+        TableOperations tempTableOps = ops.temp(base);
+        newParentSnapshotId = base.snapshot(newParentSnapshotId).parentId();
+        if (newParentSnapshotId == null) {
+          return null;
+        }
+        Snapshot parentSnapshot = base.snapshot(newParentSnapshotId);
+
+        SetSnapshotOperation setSnapshotOp = new 
SetSnapshotOperation(tempTableOps);
+        setSnapshotOp.rollbackTo(newParentSnapshotId).commit();
+        try {
+          validate(tempTableOps.current(), parentSnapshot);
+          isCommitSuccessfullyApplied = true;
+        } catch (ValidationException validationException) {
+          // swallow the exception for re-trying
+        }
+      }
+
+      if (!isCommitSuccessfullyApplied) {
+        return null;
+      }
+
+      return newParentSnapshotId;
+    } else {
+      return null;
+    }
+  }
+
+  private Boolean shouldRollbackReplaceOnConflict() {
+    return PropertyUtil.propertyAsBoolean(
+        base.properties(),
+        TableProperties.COMMIT_ROLLBACK_REPLACE_ON_CONFLICT_ENABLED,

Review Comment:
   we could potentially make this more generic, for example just add this to 
`SnapshotUpdate<T>`
   
   ```
     T rollback(List<String> operations);
   ```
   
   Although I don't know what would be the use case of the other kinds of 
rollback, but seems like a good generalization.
   
   @rdblue do you have any thoughts and further comments regarding this PR?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to