You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hudi.apache.org by "fhan688 (via GitHub)" <gi...@apache.org> on 2026/08/07 12:21:44 UTC

[PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

fhan688 opened a new pull request, #19553:
URL: https://github.com/apache/hudi/pull/19553

   ### Describe the issue this Pull Request addresses
   
   
     This is a follow-up to #19338 and addresses the archived-timeline optimization suggested in https://github.com/apache/hudi/pull/19338#issuecomment-5211158987.
   
     For timeline layout V1, `CompletionTimeQueryViewV1` loaded archived instants to identify candidate requested times, after which `IncrementalQueryAnalyzer` discarded that timeline and loaded the archive again to construct `QueryContext`. Since V1 completion time is equivalent to requested time, the second scan is redundant.
   
     ### Summary and Changelog
   
     - Add a dedicated V1 analysis path in `IncrementalQueryAnalyzer`.
     - Load the filtered archived timeline at most once when the requested range overlaps archived instants.
     - Apply `InstantRange` directly to `HoodieInstant.requestedTime()` and reuse the same archived timeline in `QueryContext`.
     - Avoid archive loading for active-only and snapshot ranges; for end-only ranges, check the filtered active timeline before loading the archive.
     - Keep the V2 completion-time query path unchanged.
     - Add tests covering single archive loading, timeline reuse, range boundaries, active-only and snapshot paths, limits, and V2 behavior.
   
     ### Impact
   
     Improves incremental-query performance for timeline layout V1 (table versions 5–7) by eliminating a redundant archived-timeline scan. There are no public API, configuration, storage-format, or V2 semantic changes. Query results and existing range semantics remain unchanged.
   
     ### Risk Level
   
     low
   
     The change touches V1 incremental range selection but keeps V2 on the existing path. It is covered by `TestIncrementalQueryAnalyzer` and `TestCompletionTimeQueryViewV1`: 16 tests passed with no failures or errors. Reactor compilation, Checkstyle, RAT, and `git diff --check` also passed.
   
     ### Documentation Update
   
     none. This is an internal performance optimization with no new user-facing behavior or configuration.
   
     ### Contributor's checklist
   
     - [x] Read through [contributor's guide](https://hudi.apache.org/contribute/how-to-contribute)
     - [x] Enough context is provided in the sections above
     - [x] Adequate tests were added if applicable


-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19553:
URL: https://github.com/apache/hudi/pull/19553#issuecomment-5218391115

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176",
       "triggerID" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * b322979a67f70085f4006c3ed1a31c6a52919985 Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176) 
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "codecov-commenter (via GitHub)" <gi...@apache.org>.
codecov-commenter commented on PR #19553:
URL: https://github.com/apache/hudi/pull/19553#issuecomment-5217133311

   ## [Codecov](https://app.codecov.io/gh/apache/hudi/pull/19553?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) Report
   :x: Patch coverage is `0%` with `75 lines` in your changes missing coverage. Please review.
   :white_check_mark: Project coverage is 76.79%. Comparing base ([`65cf7e8`](https://app.codecov.io/gh/apache/hudi/commit/65cf7e8ede7d1a08f3b3f13b4a45c6229043cc3e?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)) to head ([`b322979`](https://app.codecov.io/gh/apache/hudi/commit/b322979a67f70085f4006c3ed1a31c6a52919985?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)).
   
   | [Files with missing lines](https://app.codecov.io/gh/apache/hudi/pull/19553?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Patch % | Lines |
   |---|---|---|
   | [...di/common/table/read/IncrementalQueryAnalyzer.java](https://app.codecov.io/gh/apache/hudi/pull/19553?src=pr&el=tree&filepath=hudi-common%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fhudi%2Fcommon%2Ftable%2Fread%2FIncrementalQueryAnalyzer.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-aHVkaS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2h1ZGkvY29tbW9uL3RhYmxlL3JlYWQvSW5jcmVtZW50YWxRdWVyeUFuYWx5emVyLmphdmE=) | 0.00% | [75 Missing :warning: ](https://app.codecov.io/gh/apache/hudi/pull/19553?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   
   <details><summary>Additional details and impacted files</summary>
   
   
   
   ```diff
   @@             Coverage Diff              @@
   ##             master   #19553      +/-   ##
   ============================================
   - Coverage     76.84%   76.79%   -0.05%     
   + Complexity    32379    32376       -3     
   ============================================
     Files          2522     2522              
     Lines        139106   139154      +48     
     Branches      16713    16720       +7     
   ============================================
   - Hits         106892   106863      -29     
   - Misses        24621    24697      +76     
   - Partials       7593     7594       +1     
   ```
   
   | [Components](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=components&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Coverage Δ | |
   |---|---|---|
   | [hudi-common](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `83.07% <0.00%> (-0.20%)` | :arrow_down: |
   | [hudi-client](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `81.98% <ø> (-0.01%)` | :arrow_down: |
   | [hudi-flink](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `84.70% <ø> (ø)` | |
   | [hudi-spark-datasource](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `70.60% <ø> (ø)` | |
   | [hudi-utilities](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `73.63% <ø> (ø)` | |
   | [hudi-cli](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `15.32% <ø> (ø)` | |
   | [hudi-hadoop](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `63.50% <ø> (ø)` | |
   | [hudi-sync](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `75.11% <ø> (ø)` | |
   | [hudi-io](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `79.46% <ø> (ø)` | |
   | [hudi-timeline-service](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `83.44% <ø> (ø)` | |
   | [hudi-cloud](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `64.06% <ø> (ø)` | |
   | [hudi-kafka-connect](https://app.codecov.io/gh/apache/hudi/pull/19553/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `53.20% <ø> (ø)` | |
   
   | [Flag](https://app.codecov.io/gh/apache/hudi/pull/19553/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Coverage Δ | |
   |---|---|---|
   | [hadoop-mr-java-client](https://app.codecov.io/gh/apache/hudi/pull/19553/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `43.70% <0.00%> (-0.03%)` | :arrow_down: |
   
   Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#carryforward-flags-in-the-pull-request-comment) to find out more.
   
   | [Files with missing lines](https://app.codecov.io/gh/apache/hudi/pull/19553?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Coverage Δ | |
   |---|---|---|
   | [...di/common/table/read/IncrementalQueryAnalyzer.java](https://app.codecov.io/gh/apache/hudi/pull/19553?src=pr&el=tree&filepath=hudi-common%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fhudi%2Fcommon%2Ftable%2Fread%2FIncrementalQueryAnalyzer.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-aHVkaS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2h1ZGkvY29tbW9uL3RhYmxlL3JlYWQvSW5jcmVtZW50YWxRdWVyeUFuYWx5emVyLmphdmE=) | `52.43% <0.00%> (-44.98%)` | :arrow_down: |
   
   ... and [1 file with indirect coverage changes](https://app.codecov.io/gh/apache/hudi/pull/19553/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   </details>
   <details><summary> :rocket: New features to boost your workflow: </summary>
   
   - :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
   - :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
   </details>


-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "cshuo (via GitHub)" <gi...@apache.org>.
cshuo commented on code in PR #19553:
URL: https://github.com/apache/hudi/pull/19553#discussion_r3891530894


##########
hudi-common/src/main/java/org/apache/hudi/common/table/read/IncrementalQueryAnalyzer.java:
##########
@@ -167,51 +172,159 @@ public QueryContext analyze() {
         return QueryContext.EMPTY;
       }
       HoodieTimeline filteredTimeline = getFilteredTimeline(this.metaClient);
-      List<String> instantTimeList = completionTimeQueryView.getInstantTimes(filteredTimeline, startCompletionTime, endCompletionTime, rangeType);
-      if (instantTimeList.isEmpty()) {
-        // no instants completed within the give time range, returns early.
-        return QueryContext.EMPTY;
-      }
-      // get hoodie instants
-      Pair<List<String>, List<String>> splitInstantTime = splitInstantByActiveness(instantTimeList, completionTimeQueryView);
-      Set<String> instantTimeSet = new HashSet<>(instantTimeList);
-      List<String> archivedInstantTimes = splitInstantTime.getLeft();
-      List<String> activeInstantTimes = splitInstantTime.getRight();
-      List<HoodieInstant> archivedInstants = new ArrayList<>();
-      List<HoodieInstant> activeInstants = new ArrayList<>();
-      HoodieTimeline archivedReadTimeline = null;
-      if (!activeInstantTimes.isEmpty()) {
-        activeInstants = filteredTimeline.getInstantsAsStream().filter(instant -> instantTimeSet.contains(instant.requestedTime())).collect(Collectors.toList());
-        if (limit > 0 && limit < activeInstants.size()) {
-          // streaming read speed limit, limits the maximum number of commits allowed to read for each run
-          activeInstants = activeInstants.subList(0, limit);
-        }
-      }
-      if (!archivedInstantTimes.isEmpty()) {
-        archivedReadTimeline = getArchivedReadTimeline(metaClient, archivedInstantTimes.get(0));
-        archivedInstants = archivedReadTimeline.getInstantsAsStream().filter(instant -> instantTimeSet.contains(instant.requestedTime())).collect(Collectors.toList());
+      if (TimelineLayoutVersion.LAYOUT_VERSION_1.equals(metaClient.getTimelineLayoutVersion())) {
+        return analyzeForV1Timeline(filteredTimeline, completionTimeQueryView);
       }
-      List<String> instants = Stream.concat(archivedInstants.stream(), activeInstants.stream()).map(HoodieInstant::requestedTime).collect(Collectors.toList());
-      if (instants.isEmpty()) {
-        // no instants completed within the give time range, returns early.
-        return QueryContext.EMPTY;
-      }
-      if (startCompletionTime.isEmpty() && endCompletionTime.isPresent()) {
-        instants = Collections.singletonList(instants.get(instants.size() - 1));
-      }
-      String lastInstant = instants.get(instants.size() - 1);
-      // null => if starting from earliest, if no startCompletionTime is specified, start from the latest instant like usual streaming read semantics.
-      // if startCompletionTime is neither, then use the earliest instant as the start instant.
-      String startInstant = START_COMMIT_EARLIEST.equalsIgnoreCase(startCompletionTime.orElse(null)) ? null :
-          startCompletionTime.isEmpty() ? lastInstant : instants.get(0);
-      String endInstant = endCompletionTime.isEmpty() ? null : lastInstant;
-      return QueryContext.create(startInstant, endInstant, instants, archivedInstants, activeInstants, filteredTimeline, archivedReadTimeline);
+      return analyzeForV2Timeline(filteredTimeline, completionTimeQueryView);
     } catch (Exception ex) {
       log.error("Got exception when generating incremental query info", ex);
       throw new HoodieException(ex);
     }
   }
 
+  private QueryContext analyzeForV1Timeline(

Review Comment:
   nit: Could you add some method comments so that other developers can easily understand the optimizations in `analyzeForV1Timeline` compared with `analyzeForV2Timeline`?



-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19553:
URL: https://github.com/apache/hudi/pull/19553#issuecomment-5450489146

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176",
       "triggerID" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "triggerType" : "PUSH"
     }, {
       "hash" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "status" : "PENDING",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16663",
       "triggerID" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * b322979a67f70085f4006c3ed1a31c6a52919985 Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176) 
   * a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a Azure: [PENDING](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16663) 
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19553:
URL: https://github.com/apache/hudi/pull/19553#issuecomment-5451822945

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "status" : "DELETED",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176",
       "triggerID" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "triggerType" : "PUSH"
     }, {
       "hash" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16663",
       "triggerID" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16663) 
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19553:
URL: https://github.com/apache/hudi/pull/19553#issuecomment-5217167119

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "status" : "UNKNOWN",
       "url" : "TBD",
       "triggerID" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * b322979a67f70085f4006c3ed1a31c6a52919985 UNKNOWN
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19553:
URL: https://github.com/apache/hudi/pull/19553#issuecomment-5473781139

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "status" : "DELETED",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176",
       "triggerID" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "triggerType" : "PUSH"
     }, {
       "hash" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16663",
       "triggerID" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "triggerType" : "PUSH"
     }, {
       "hash" : "053a2b8023b8f65a979eedd377087451f4f06c46",
       "status" : "PENDING",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16711",
       "triggerID" : "053a2b8023b8f65a979eedd377087451f4f06c46",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16663) 
   * 053a2b8023b8f65a979eedd377087451f4f06c46 Azure: [PENDING](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16711) 
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "hudi-agent (via GitHub)" <gi...@apache.org>.
hudi-agent commented on code in PR #19553:
URL: https://github.com/apache/hudi/pull/19553#discussion_r3735857781


##########
hudi-common/src/test/java/org/apache/hudi/common/table/read/TestIncrementalQueryAnalyzer.java:
##########
@@ -86,4 +107,209 @@ void testBuilderRequiresMetaClientAndRangeType() {
         .metaClient(mock(HoodieTableMetaClient.class))
         .build());
   }
+
+  @Test
+  void testV1LoadsArchivedTimelineOnceAndReusesIt() {
+    AnalyzerFixture fixture = analyzerFixture(
+        TimelineLayoutVersion.LAYOUT_VERSION_1,
+        Arrays.asList(instant(T3), instant(T4)),
+        Arrays.asList(instant(T1), instant(T2)));
+    when(fixture.completionTimeQueryView.isArchived(T2)).thenReturn(true);
+
+    IncrementalQueryAnalyzer.QueryContext queryContext = fixture.analyzer(T2, T4).analyze();
+
+    assertEquals(Arrays.asList(T2, T3, T4), queryContext.getInstantTimeList());
+    assertEquals(Collections.singletonList(T2), requestedTimes(queryContext.getArchivedInstants()));
+    assertEquals(Arrays.asList(T3, T4), requestedTimes(queryContext.getActiveInstants()));
+    assertSame(fixture.archivedCommitsTimeline, queryContext.getArchivedTimeline());
+    verify(fixture.metaClient, times(1)).getArchivedTimeline(T2, false);
+    verify(fixture.completionTimeQueryView, never()).getInstantTimes(
+        any(HoodieTimeline.class), any(), any(), any(InstantRange.RangeType.class));
+  }
+
+  @Test
+  void testV1EndOnlyLoadsArchiveOnceAndSelectsLastEligibleInstant() {
+    AnalyzerFixture fixture = analyzerFixture(
+        TimelineLayoutVersion.LAYOUT_VERSION_1,
+        Arrays.asList(instant(T3), instant(T4)),
+        Arrays.asList(instant(T1), instant(T2)));
+
+    IncrementalQueryAnalyzer.QueryContext queryContext = fixture.analyzer(null, T2).analyze();
+
+    assertEquals(Collections.singletonList(T2), queryContext.getInstantTimeList());
+    assertEquals(Collections.singletonList(T2), requestedTimes(queryContext.getArchivedInstants()));
+    assertTrue(queryContext.getActiveInstants().isEmpty());
+    assertSame(fixture.archivedCommitsTimeline, queryContext.getArchivedTimeline());
+    verify(fixture.metaClient, times(1)).getArchivedTimeline("", false);
+  }
+
+  @Test
+  void testV1ActiveOnlyAndSnapshotRangesDoNotLoadArchive() {

Review Comment:
   🤖 nit: this test covers two distinct cases (active-only range and earliest-snapshot range) in one method, which makes it harder to pinpoint which scenario caused a failure. Could you split it into `testV1ActiveOnlyRangeDoesNotLoadArchive` and `testV1EarliestSnapshotDoesNotLoadArchive`?
   
   <sub><i>⚠️ AI-generated; verify before applying. React 👍/👎 to flag quality.</i></sub>



-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19553:
URL: https://github.com/apache/hudi/pull/19553#issuecomment-5217217649

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "status" : "PENDING",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176",
       "triggerID" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * b322979a67f70085f4006c3ed1a31c6a52919985 Azure: [PENDING](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176) 
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "cshuo (via GitHub)" <gi...@apache.org>.
cshuo commented on code in PR #19553:
URL: https://github.com/apache/hudi/pull/19553#discussion_r3877815023


##########
hudi-common/src/main/java/org/apache/hudi/common/table/read/IncrementalQueryAnalyzer.java:
##########
@@ -167,51 +172,145 @@ public QueryContext analyze() {
         return QueryContext.EMPTY;
       }
       HoodieTimeline filteredTimeline = getFilteredTimeline(this.metaClient);
-      List<String> instantTimeList = completionTimeQueryView.getInstantTimes(filteredTimeline, startCompletionTime, endCompletionTime, rangeType);
-      if (instantTimeList.isEmpty()) {
-        // no instants completed within the give time range, returns early.
-        return QueryContext.EMPTY;
-      }
-      // get hoodie instants
-      Pair<List<String>, List<String>> splitInstantTime = splitInstantByActiveness(instantTimeList, completionTimeQueryView);
-      Set<String> instantTimeSet = new HashSet<>(instantTimeList);
-      List<String> archivedInstantTimes = splitInstantTime.getLeft();
-      List<String> activeInstantTimes = splitInstantTime.getRight();
-      List<HoodieInstant> archivedInstants = new ArrayList<>();
-      List<HoodieInstant> activeInstants = new ArrayList<>();
-      HoodieTimeline archivedReadTimeline = null;
-      if (!activeInstantTimes.isEmpty()) {
-        activeInstants = filteredTimeline.getInstantsAsStream().filter(instant -> instantTimeSet.contains(instant.requestedTime())).collect(Collectors.toList());
-        if (limit > 0 && limit < activeInstants.size()) {
-          // streaming read speed limit, limits the maximum number of commits allowed to read for each run
-          activeInstants = activeInstants.subList(0, limit);
-        }
-      }
-      if (!archivedInstantTimes.isEmpty()) {
-        archivedReadTimeline = getArchivedReadTimeline(metaClient, archivedInstantTimes.get(0));
-        archivedInstants = archivedReadTimeline.getInstantsAsStream().filter(instant -> instantTimeSet.contains(instant.requestedTime())).collect(Collectors.toList());
-      }
-      List<String> instants = Stream.concat(archivedInstants.stream(), activeInstants.stream()).map(HoodieInstant::requestedTime).collect(Collectors.toList());
-      if (instants.isEmpty()) {
-        // no instants completed within the give time range, returns early.
-        return QueryContext.EMPTY;
-      }
-      if (startCompletionTime.isEmpty() && endCompletionTime.isPresent()) {
-        instants = Collections.singletonList(instants.get(instants.size() - 1));
+      if (TimelineLayoutVersion.LAYOUT_VERSION_1.equals(metaClient.getTimelineLayoutVersion())) {
+        return analyzeForV1Timeline(filteredTimeline, completionTimeQueryView);
       }
-      String lastInstant = instants.get(instants.size() - 1);
-      // null => if starting from earliest, if no startCompletionTime is specified, start from the latest instant like usual streaming read semantics.
-      // if startCompletionTime is neither, then use the earliest instant as the start instant.
-      String startInstant = START_COMMIT_EARLIEST.equalsIgnoreCase(startCompletionTime.orElse(null)) ? null :
-          startCompletionTime.isEmpty() ? lastInstant : instants.get(0);
-      String endInstant = endCompletionTime.isEmpty() ? null : lastInstant;
-      return QueryContext.create(startInstant, endInstant, instants, archivedInstants, activeInstants, filteredTimeline, archivedReadTimeline);
+      return analyzeForV2Timeline(filteredTimeline, completionTimeQueryView);
     } catch (Exception ex) {
       log.error("Got exception when generating incremental query info", ex);
       throw new HoodieException(ex);
     }
   }
 
+  private QueryContext analyzeForV1Timeline(
+      HoodieTimeline filteredTimeline,
+      CompletionTimeQueryView completionTimeQueryView) {
+    final boolean startFromEarliest = START_COMMIT_EARLIEST.equalsIgnoreCase(startCompletionTime.orElse(null));
+    final Option<String> effectiveStart = startFromEarliest ? Option.empty() : startCompletionTime;
+    final HoodieTimeline completedTimeline = filteredTimeline.filterCompletedInstants();
+
+    if (effectiveStart.isEmpty() && endCompletionTime.isEmpty()) {
+      // (_, _) reads the latest completed instant while [earliest, +INF] is a snapshot read.
+      List<HoodieInstant> activeInstants = completedTimeline.lastInstant()
+          .map(Collections::singletonList)
+          .orElse(Collections.emptyList());
+      return createQueryContext(Collections.emptyList(), activeInstants, filteredTimeline, null);
+    }
+
+    List<HoodieInstant> archivedInstants = Collections.emptyList();
+    List<HoodieInstant> activeInstants;
+    HoodieTimeline archivedReadTimeline = null;
+
+    if (startCompletionTime.isEmpty() && endCompletionTime.isPresent()) {
+      // (_, end] returns the last eligible instant at or before end. Check the filtered active
+      // timeline first and only load the archive when there is no active match.
+      activeInstants = getLastInstantAtOrBefore(completedTimeline, endCompletionTime.get());
+      if (activeInstants.isEmpty()) {
+        archivedReadTimeline = getArchivedReadTimeline(metaClient, "");
+        archivedInstants = getLastInstantAtOrBefore(archivedReadTimeline, endCompletionTime.get());
+      }
+    } else {
+      InstantRange instantRange = InstantRange.builder()
+          .rangeType(rangeType)
+          .startInstant(effectiveStart.orElse(null))
+          .endInstant(endCompletionTime.orElse(null))
+          .nullableBoundary(true)
+          .build();
+      activeInstants = getInstantsInRange(completedTimeline, instantRange);
+
+      boolean needsArchivedInstants = startFromEarliest
+          || (effectiveStart.isPresent() && completionTimeQueryView.isArchived(effectiveStart.get()));
+      if (needsArchivedInstants) {
+        archivedReadTimeline = getArchivedReadTimeline(metaClient, effectiveStart.orElse(""));
+        archivedInstants = getInstantsInRange(archivedReadTimeline, instantRange);
+      }
+    }
+
+    return createQueryContext(
+        archivedInstants, activeInstants, filteredTimeline, archivedReadTimeline);
+  }
+
+  private QueryContext analyzeForV2Timeline(
+      HoodieTimeline filteredTimeline,
+      CompletionTimeQueryView completionTimeQueryView) {
+    List<String> instantTimeList = completionTimeQueryView.getInstantTimes(
+        filteredTimeline, startCompletionTime, endCompletionTime, rangeType);
+    if (instantTimeList.isEmpty()) {
+      // no instants completed within the given time range, returns early.
+      return QueryContext.EMPTY;
+    }
+
+    Pair<List<String>, List<String>> splitInstantTime = splitInstantByActiveness(
+        instantTimeList, completionTimeQueryView);
+    Set<String> instantTimeSet = new HashSet<>(instantTimeList);
+    List<String> archivedInstantTimes = splitInstantTime.getLeft();
+    List<String> activeInstantTimes = splitInstantTime.getRight();
+    List<HoodieInstant> archivedInstants = new ArrayList<>();
+    List<HoodieInstant> activeInstants = new ArrayList<>();
+    HoodieTimeline archivedReadTimeline = null;
+    if (!activeInstantTimes.isEmpty()) {
+      activeInstants = filteredTimeline.getInstantsAsStream()
+          .filter(instant -> instantTimeSet.contains(instant.requestedTime()))
+          .collect(Collectors.toList());
+    }
+    if (!archivedInstantTimes.isEmpty()) {
+      archivedReadTimeline = getArchivedReadTimeline(metaClient, archivedInstantTimes.get(0));
+      archivedInstants = archivedReadTimeline.getInstantsAsStream()
+          .filter(instant -> instantTimeSet.contains(instant.requestedTime()))
+          .collect(Collectors.toList());
+    }
+    return createQueryContext(
+        archivedInstants, activeInstants, filteredTimeline, archivedReadTimeline);
+  }
+
+  private QueryContext createQueryContext(
+      List<HoodieInstant> archivedInstants,
+      List<HoodieInstant> activeInstants,
+      HoodieTimeline filteredTimeline,
+      @Nullable HoodieTimeline archivedReadTimeline) {
+    if (limit > 0 && limit < activeInstants.size()) {
+      // streaming read speed limit, limits the maximum number of active commits allowed per run
+      activeInstants = activeInstants.subList(0, limit);
+    }
+    List<String> instants = Stream.concat(archivedInstants.stream(), activeInstants.stream())

Review Comment:
   This concatenation does not guarantee global requested-time ordering. With `hoodie.archive.beyond.savepoint=true`, an old savepointed commit may remain active while later commits are archived. For example, archived `[102, 103, 104]` and active `[101]` produces `[102, 103, 104, 101]`. Since `lastInstant` is taken from the final list element, the resulting end boundary regresses to `101`, and downstream readers can omit `102`–`104`.
   
   Please globally deduplicate and sort the combined requested-time list before deriving `lastInstant`. The previous V1 candidate path explicitly applied both `distinct()` and `sorted()`, so preserving those properties would also handle overlap during concurrent archival.



##########
hudi-common/src/main/java/org/apache/hudi/common/table/read/IncrementalQueryAnalyzer.java:
##########
@@ -167,51 +172,145 @@ public QueryContext analyze() {
         return QueryContext.EMPTY;
       }
       HoodieTimeline filteredTimeline = getFilteredTimeline(this.metaClient);
-      List<String> instantTimeList = completionTimeQueryView.getInstantTimes(filteredTimeline, startCompletionTime, endCompletionTime, rangeType);
-      if (instantTimeList.isEmpty()) {
-        // no instants completed within the give time range, returns early.
-        return QueryContext.EMPTY;
-      }
-      // get hoodie instants
-      Pair<List<String>, List<String>> splitInstantTime = splitInstantByActiveness(instantTimeList, completionTimeQueryView);
-      Set<String> instantTimeSet = new HashSet<>(instantTimeList);
-      List<String> archivedInstantTimes = splitInstantTime.getLeft();
-      List<String> activeInstantTimes = splitInstantTime.getRight();
-      List<HoodieInstant> archivedInstants = new ArrayList<>();
-      List<HoodieInstant> activeInstants = new ArrayList<>();
-      HoodieTimeline archivedReadTimeline = null;
-      if (!activeInstantTimes.isEmpty()) {
-        activeInstants = filteredTimeline.getInstantsAsStream().filter(instant -> instantTimeSet.contains(instant.requestedTime())).collect(Collectors.toList());
-        if (limit > 0 && limit < activeInstants.size()) {
-          // streaming read speed limit, limits the maximum number of commits allowed to read for each run
-          activeInstants = activeInstants.subList(0, limit);
-        }
-      }
-      if (!archivedInstantTimes.isEmpty()) {
-        archivedReadTimeline = getArchivedReadTimeline(metaClient, archivedInstantTimes.get(0));
-        archivedInstants = archivedReadTimeline.getInstantsAsStream().filter(instant -> instantTimeSet.contains(instant.requestedTime())).collect(Collectors.toList());
-      }
-      List<String> instants = Stream.concat(archivedInstants.stream(), activeInstants.stream()).map(HoodieInstant::requestedTime).collect(Collectors.toList());
-      if (instants.isEmpty()) {
-        // no instants completed within the give time range, returns early.
-        return QueryContext.EMPTY;
-      }
-      if (startCompletionTime.isEmpty() && endCompletionTime.isPresent()) {
-        instants = Collections.singletonList(instants.get(instants.size() - 1));
+      if (TimelineLayoutVersion.LAYOUT_VERSION_1.equals(metaClient.getTimelineLayoutVersion())) {
+        return analyzeForV1Timeline(filteredTimeline, completionTimeQueryView);
       }
-      String lastInstant = instants.get(instants.size() - 1);
-      // null => if starting from earliest, if no startCompletionTime is specified, start from the latest instant like usual streaming read semantics.
-      // if startCompletionTime is neither, then use the earliest instant as the start instant.
-      String startInstant = START_COMMIT_EARLIEST.equalsIgnoreCase(startCompletionTime.orElse(null)) ? null :
-          startCompletionTime.isEmpty() ? lastInstant : instants.get(0);
-      String endInstant = endCompletionTime.isEmpty() ? null : lastInstant;
-      return QueryContext.create(startInstant, endInstant, instants, archivedInstants, activeInstants, filteredTimeline, archivedReadTimeline);
+      return analyzeForV2Timeline(filteredTimeline, completionTimeQueryView);
     } catch (Exception ex) {
       log.error("Got exception when generating incremental query info", ex);
       throw new HoodieException(ex);
     }
   }
 
+  private QueryContext analyzeForV1Timeline(
+      HoodieTimeline filteredTimeline,
+      CompletionTimeQueryView completionTimeQueryView) {
+    final boolean startFromEarliest = START_COMMIT_EARLIEST.equalsIgnoreCase(startCompletionTime.orElse(null));
+    final Option<String> effectiveStart = startFromEarliest ? Option.empty() : startCompletionTime;
+    final HoodieTimeline completedTimeline = filteredTimeline.filterCompletedInstants();
+
+    if (effectiveStart.isEmpty() && endCompletionTime.isEmpty()) {
+      // (_, _) reads the latest completed instant while [earliest, +INF] is a snapshot read.
+      List<HoodieInstant> activeInstants = completedTimeline.lastInstant()
+          .map(Collections::singletonList)
+          .orElse(Collections.emptyList());
+      return createQueryContext(Collections.emptyList(), activeInstants, filteredTimeline, null);
+    }
+
+    List<HoodieInstant> archivedInstants = Collections.emptyList();
+    List<HoodieInstant> activeInstants;
+    HoodieTimeline archivedReadTimeline = null;
+
+    if (startCompletionTime.isEmpty() && endCompletionTime.isPresent()) {
+      // (_, end] returns the last eligible instant at or before end. Check the filtered active
+      // timeline first and only load the archive when there is no active match.
+      activeInstants = getLastInstantAtOrBefore(completedTimeline, endCompletionTime.get());

Review Comment:
   This shortcut assumes that any eligible active instant is newer than every archived instant, which is not guaranteed with `hoodie.archive.beyond.savepoint=true`. A savepointed commit can remain active while later commits are archived; for example, active `[101, 105]` and archived `[102, 103, 104]`. For an end-only query ending at `104`, this returns active instant `101` without checking the archive, omitting the actual latest eligible instant `104`.
   
   Please only use the active-only shortcut when the selected active instant is on or after the archive boundary; otherwise compare the best active and archived candidates. A regression test covering this savepoint-hole scenario would also be helpful.



-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19553:
URL: https://github.com/apache/hudi/pull/19553#issuecomment-5473741735

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "status" : "DELETED",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176",
       "triggerID" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "triggerType" : "PUSH"
     }, {
       "hash" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16663",
       "triggerID" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "triggerType" : "PUSH"
     }, {
       "hash" : "053a2b8023b8f65a979eedd377087451f4f06c46",
       "status" : "UNKNOWN",
       "url" : "TBD",
       "triggerID" : "053a2b8023b8f65a979eedd377087451f4f06c46",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16663) 
   * 053a2b8023b8f65a979eedd377087451f4f06c46 UNKNOWN
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19553:
URL: https://github.com/apache/hudi/pull/19553#issuecomment-5450436943

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176",
       "triggerID" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "triggerType" : "PUSH"
     }, {
       "hash" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "status" : "UNKNOWN",
       "url" : "TBD",
       "triggerID" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * b322979a67f70085f4006c3ed1a31c6a52919985 Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176) 
   * a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a UNKNOWN
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "hudi-bot (via GitHub)" <gi...@apache.org>.
hudi-bot commented on PR #19553:
URL: https://github.com/apache/hudi/pull/19553#issuecomment-5474419868

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "status" : "DELETED",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16176",
       "triggerID" : "b322979a67f70085f4006c3ed1a31c6a52919985",
       "triggerType" : "PUSH"
     }, {
       "hash" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "status" : "DELETED",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16663",
       "triggerID" : "a82ff9ccf8a35122e90f5bc7bb7cc17b573d922a",
       "triggerType" : "PUSH"
     }, {
       "hash" : "053a2b8023b8f65a979eedd377087451f4f06c46",
       "status" : "SUCCESS",
       "url" : "https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16711",
       "triggerID" : "053a2b8023b8f65a979eedd377087451f4f06c46",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * 053a2b8023b8f65a979eedd377087451f4f06c46 Azure: [SUCCESS](https://dev.azure.com/apachehudi/a1a51da7-8592-47d4-88dc-fd67bed336bb/_build/results?buildId=16711) 
   
   <details>
   <summary>Bot commands</summary>
     @hudi-bot supports the following commands:
   
    - `@hudi-bot run azure` re-run the last Azure build
   </details>


-- 
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@hudi.apache.org

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


Re: [PR] perf(common): avoid redundant V1 archived timeline loads in incremental queries [hudi]

Posted by "fhan688 (via GitHub)" <gi...@apache.org>.
fhan688 commented on PR #19553:
URL: https://github.com/apache/hudi/pull/19553#issuecomment-5248500672

   this is the potential improvement mentioned in https://github.com/apache/hudi/pull/19338, please help review, thanks!  @danny0405 


-- 
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@hudi.apache.org

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