jackye1995 commented on code in PR #5888:
URL: https://github.com/apache/iceberg/pull/5888#discussion_r1120534618
##########
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:
I am a bit not sure if this should be a table level property. I would
imagine this to enabled only on certain sessions, but the majority of writers
still do not rollback. Is there any other option to make this a runtime config
instead?
--
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]