You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xtable.apache.org by "vinishjail97 (via GitHub)" <gi...@apache.org> on 2026/10/07 01:23:23 UTC

[I] [Bug] Hudi snapshot sync fails when reusing an already synchronized source commit [incubator-xtable]

vinishjail97 opened a new issue, #962:
URL: https://github.com/apache/incubator-xtable/issues/962

   ### Description
   
   A Hudi snapshot sync can fail when the source snapshot has already been synchronized. The target derives the Hudi instant from the source commit time and attempts to create that instant again.
   
   This affects an explicit `FULL` sync when the source has not advanced. Repeating a full sync should safely handle the existing source version rather than fail while creating an existing timeline file.
   
   ### Reproduction
   
   1. Synchronize a source snapshot into a Hudi target.
   2. Keep the source commit time and source file list unchanged.
   3. Run another snapshot sync against the same target.
   4. The target attempts to reuse the previous Hudi instant.
   
   I reproduced the target-level failure with local Hudi tables at versions SIX and NINE, using Hudi 1.2.1 and Java 11. The test registers an existing file, then invokes snapshot synchronization with the same source commit time and the same file list. Both versions fail. Controls that advance the source commit time pass.
   
   The reproducer invokes the Hudi target directly. A controller-level regression test for repeated `FULL` synchronization is still needed.
   
   ### Actual result
   
   ```text
   org.apache.hudi.exception.HoodieIOException:
     Failed to create immutable file .../<instant>.replacecommit.inflight
   Caused by: org.apache.hadoop.fs.FileAlreadyExistsException:
     File already exists: .../<instant>.replacecommit.inflight
   ```
   
   The stack includes:
   
   ```text
   HudiConversionTarget.completeSync
   HudiConversionTarget$CommitState.commit
   ActiveTimelineV1.transitionReplaceRequestedToInflight  // table version SIX
   ActiveTimelineV2.transitionReplaceRequestedToInflight  // table version NINE
   ```
   
   Synchronization fails. I did not observe data loss in these tests.
   
   ### Code path
   
   `TableFormatSync.syncSnapshot()` invokes `beginSync()` without filtering an already synchronized source version. `HudiConversionTarget.beginSync()` derives the target instant from `table.getLatestCommitTime()`. `CommitState.commit()` then creates the requested replace commit and transitions it to inflight using that instant.
   
   ### Expected result
   
   Repeated snapshot synchronization of an unchanged source should handle the existing instant safely. If the target requires metadata repair, the implementation should preserve that behavior rather than unconditionally skip every unchanged snapshot.
   
   Regression coverage should include repeated `FULL` synchronization on table versions SIX and NINE. It should verify the visible files and column statistics after the repeated operation.
   


-- 
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: commits-unsubscribe@xtable.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org