This is an automated email from the ASF dual-hosted git repository.

vinishjail97 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-xtable.git


The following commit(s) were added to refs/heads/main by this push:
     new 692c8756 [928] Skip incremental sync when Delta source has no new 
commits (#930)
692c8756 is described below

commit 692c8756c6de94557510853b949f0043c402ac8d
Author: Arvin <[email protected]>
AuthorDate: Fri Sep 11 05:43:48 2026 +0800

    [928] Skip incremental sync when Delta source has no new commits (#930)
    
    * [Bug] Skip incremental sync when delta source has no new commits
    
    Fixes #928: getCommitsBacklog computed start = lastSyncVersion + 1 with no
    start <= end guard, so a re-sync with no new commits passed an inverted
    version range [n+1, n] to Delta Kernel's getChanges, which failed with
    "Invalid version range". With no new commits the sync is now a successful
    no-op, matching the Hudi and Parquet sources.
    
    * Add Delta Kernel empty backlog test
    
    ---------
    
    Co-authored-by: Vinish Reddy <[email protected]>
---
 .../xtable/kernel/DeltaKernelConversionSource.java | 10 +++++++++
 .../kernel/ITDeltaKernelConversionSource.java      | 25 ++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git 
a/xtable-core/src/main/java/org/apache/xtable/kernel/DeltaKernelConversionSource.java
 
b/xtable-core/src/main/java/org/apache/xtable/kernel/DeltaKernelConversionSource.java
index 5c1b4cee..14241f92 100644
--- 
a/xtable-core/src/main/java/org/apache/xtable/kernel/DeltaKernelConversionSource.java
+++ 
b/xtable-core/src/main/java/org/apache/xtable/kernel/DeltaKernelConversionSource.java
@@ -180,6 +180,16 @@ public class DeltaKernelConversionSource implements 
ConversionSource<Long> {
             engine, 
Timestamp.from(instantsForIncrementalSync.getLastSyncInstant()).getTime());
 
     long versionNumberAtLastSyncInstant = snapshot.getVersion();
+    long latestVersion = table.getLatestSnapshot(engine).getVersion();
+    if (versionNumberAtLastSyncInstant >= latestVersion) {
+      log.info(
+          "No new delta commits to sync: last sync instant {} corresponds to 
version {} and the "
+              + "latest version is {}. Nothing to sync.",
+          instantsForIncrementalSync.getLastSyncInstant(),
+          versionNumberAtLastSyncInstant,
+          latestVersion);
+      return 
CommitsBacklog.<Long>builder().commitsToProcess(Collections.emptyList()).build();
+    }
     resetState(versionNumberAtLastSyncInstant + 1, engine, table);
     return CommitsBacklog.<Long>builder()
         .commitsToProcess(getChangesState().getVersionsInSortedOrder())
diff --git 
a/xtable-core/src/test/java/org/apache/xtable/kernel/ITDeltaKernelConversionSource.java
 
b/xtable-core/src/test/java/org/apache/xtable/kernel/ITDeltaKernelConversionSource.java
index 82dc2d6d..f5a83d65 100644
--- 
a/xtable-core/src/test/java/org/apache/xtable/kernel/ITDeltaKernelConversionSource.java
+++ 
b/xtable-core/src/test/java/org/apache/xtable/kernel/ITDeltaKernelConversionSource.java
@@ -412,6 +412,31 @@ public class ITDeltaKernelConversionSource {
     ValidationTestHelper.validateTableChanges(allActiveFiles, allTableChanges);
   }
 
+  @Test
+  void testGetCommitsBacklogWithNoNewCommits() {
+    String tableName = GenericTable.getTableName();
+    TestSparkDeltaTable testSparkDeltaTable =
+        new TestSparkDeltaTable(tableName, tempDir, sparkSession, null, false);
+    testSparkDeltaTable.insertRows(50);
+
+    SourceTable tableConfig =
+        SourceTable.builder()
+            .name(testSparkDeltaTable.getTableName())
+            .basePath(testSparkDeltaTable.getBasePath())
+            .formatName(TableFormat.DELTA)
+            .build();
+    DeltaKernelConversionSource conversionSource =
+        conversionSourceProvider.getConversionSourceInstance(tableConfig);
+
+    CommitsBacklog<Long> commitsBacklog =
+        conversionSource.getCommitsBacklog(
+            InstantsForIncrementalSync.builder()
+                
.lastSyncInstant(Instant.ofEpochMilli(testSparkDeltaTable.getLastCommitTimestamp()))
+                .build());
+
+    assertTrue(commitsBacklog.getCommitsToProcess().isEmpty());
+  }
+
   @Test
   public void testsShowingVacuumHasNoEffectOnIncrementalSync() {
     boolean isPartitioned = true;

Reply via email to