Repository navigation
[improvement](external) Support Elasticsearch 9.x node discovery - #69651
Conversation
### What problem does this PR solve? Related PR: apache#69650 (reader regression coverage) With `nodes_discovery=true`, ES metadata loading follows `EsMetadataFetcher.fetchShards -> EsConnectorRestClient.getHttpNodes -> EsNodeInfo -> EsMajorVersion.parse`. The parser accepts only majors through 8, so a 9.x node makes discovery fail with an unsupported-version exception. The configured-seed path with discovery disabled does not parse node versions and is not affected in the same way. Add the explicit ES 9 major, comparisons and latest-supported bound while continuing to reject unvalidated future majors with a clear diagnostic. Add an HTTP unit test containing mixed 8.19/9.0 nodes, IPv6 routing and a node without HTTP, plus an opt-in live compatibility suite rather than relying on version parsing alone. The live suite creates isolated temporary indices and checks the production connector's `_nodes/http`, `_mapping`, `_search_shards`, index listing and metadata fetching with discovery enabled/disabled. It also verifies authenticated source/docvalue scroll requests, missing values, pagination, scroll cleanup and invalid-credential failures. Enable it with `DORIS_ES9_TEST_URL`, `DORIS_ES9_TEST_USER` and `DORIS_ES9_TEST_PASSWORD`. ### Release note Allow Elasticsearch 9.x nodes during ES catalog node discovery. ### Check List (For Author) - Test - [x] Version parsing and mixed-node tests reproduce the unsupported-9.x failure before the change. - [x] All 124 ES connector tests pass with live authenticated Elasticsearch 9.0.0 and 9.5.5, including the three opt-in compatibility tests on each version. - [x] Default unit-test execution passes with the live suite disabled when no endpoint is configured. - [x] FE Checkstyle for the ES module and its reactor dependencies. - [x] The BE ES reader also reads the authenticated three-row fixture through source/docvalue scans with batch size 1 on both versions, using the reader coverage change in the related ES regression PR. - [ ] Full Doris SQL end-to-end validation against ES 9; the live tests above validate connector metadata and HTTP reader compatibility. - Behavior changed: - [x] Yes: discovery accepts ES 9 nodes; later unverified majors remain rejected. - Does this need documentation? - [x] No new catalog properties or configuration are introduced. ### Check List (For Reviewer who merge this PR) - [ ] Confirm the release note - [ ] Confirm test cases - [ ] Confirm document - [ ] Add branch pick label
|
Thank you for your contribution to Apache Doris. Please clearly describe your PR:
|
|
run buildall |
|
/review |
There was a problem hiding this comment.
Reviewed all four changed files at 6f3cfe264e3fbc0611cd0f9b8be07dfac000a1fc, including the discovery-to-shard-routing-to-reader flow. No verified new findings or existing inline blockers were identified.
Critical checkpoint conclusions:
| Checkpoint | Conclusion |
|---|---|
| Goal and supporting tests | The new 9.x prefix removes the discovered-node parser rejection. Version, mixed-node HTTP and opt-in production metadata tests target that behavior. |
| Scope and reuse | One production class and three related test files; the implementation follows the existing major-version representation and parser. |
| Concurrency and locks | No production threading, shared mutable state or locking changes. |
| Lifecycle and initialization | V_9_X is initialized before LATEST in the same class. The local server, UUID test indices and scroll contexts have cleanup paths. |
| Configuration | No production settings added; environment variables opt into the live tests. |
| Compatibility | Existing supported prefixes and comparison/equality semantics remain intact; future majors still fail explicitly. No storage-format or binary-interface migration is introduced. |
| Thrift and protobuf | No definitions or field IDs changed; release-branch ID comparison is inapplicable. |
| Parallel paths | Traced discovery and configured-seed routing, single/per-shard planning and the shared BE scroll reader. No additional active version gate needs updating. |
| Conditional checks | The explicit 9.x branch and unsupported-version bound match the intended policy. Class-level JUnit gating protects the optional endpoint initializer. |
| Test coverage | JUnit coverage includes parsing, ordering, equality, future rejection, mixed 8/9 nodes, IPv6 and missing HTTP. Opt-in tests add production metadata, both discovery settings, authentication failures and REST scroll/null/docvalue checks. |
| Expected results | New assertions were inspected; no regression golden-result files changed. |
| Observability | The unsupported-version diagnostic now reports 9.x. Existing request/error reporting remains applicable. |
| Transactions, persistence and failover | No production transaction, edit-log or persisted metadata representation changes. |
| Data writes and atomicity | Production changes only affect metadata reading; new writes create isolated live-test fixtures with teardown. |
| FE/BE variables | No new transmitted fields or scan properties; existing transfer paths are unchanged. |
| Performance | One additional fixed prefix check and version constant; no added production I/O, unbounded work or synchronization. |
| Other issues and user focus | No additional substantiated issue after independent full-diff and risk-focused reviews. No additional user focus was supplied. |
Validation limits: this was static inspection only. No builds, tests, live Elasticsearch requests or SQL end-to-end checks were executed, and the author's reported results were not independently reproduced. The new source/docvalue scroll test uses a standalone Java HTTP client, so it establishes REST smoke coverage rather than executing Doris SQL or the BE reader. Static review coverage is complete; these execution limits do not establish full ES9 runtime compatibility.
The optional test gate and scroll assumptions were cross-checked against the JUnit 5.14.1 condition documentation and Elastic pagination documentation.
Review converged after 1 round(s).
TPC-H: Total hot run time: 28444 ms |
TPC-DS: Total hot run time: 150798 ms |
ClickBench: Total hot run time: 24.36 s |
FE Regression Coverage ReportIncrement line coverage |
Apply the outstanding changes in master merge order: apache#69545 7d16729 apache#69551 7224a2d apache#69612 61d1aef apache#69615 8d2bd1e apache#69650 3dc7341 apache#69651 c00ecb1 apache#69646 e493c61 apache#69668 7865646 apache#69614 already exists on branch-4.2 through apache#69644. Adapt datasource APIs and tests to the release branch, retaining its existing scanner dispatch and statement-bound metadata contracts.
### What problem does this PR solve? Backport the requested external-data and FileScannerV2 changes to `branch-4.2` in their actual master merge order: | Order | Master PR | Change | Backport | | --- | --- | --- | --- | | 1 | #69545 | Preserve Paimon schema options after field renames | Included | | 2 | #69551 | Expand Iceberg capability, transaction and snapshot tests | Included with 4.2 API adaptations | | 3 | #69614 | Elasticsearch HTTP scans in FileScannerV2 | Already present through #69644 (`2104b7509cda`); not applied twice | | 4 | #69612 | Check catalog visibility before SHOW DATABASES accesses metadata | Included | | 5 | #69615 | Publish Iceberg Parquet split offsets | Included | | 6 | #69650 | Preserve ES compound residuals and expand scanner coverage | Included | | 7 | #69651 | Accept Elasticsearch 9.x during node discovery | Included | | 8 | #69646 | Prioritize Parquet V2 row groups using TopN bounds | Included | | 9 | #69668 | Arrow loads and schema inference in FileScannerV2 | Included | The eight outstanding changes are combined in one commit. This branch retains the 4.2 FE datasource APIs instead of importing master's connector-module refactor. ### Backport adaptations - Port Paimon schema restoration, catalog-option provenance, fallback handling and tests to the existing table-copy/serialization lifecycle. Keep statement-bound fields when reader options are applied after a schema-only rename. - Exercise Iceberg's existing metadata and transaction entry points with real in-memory tables and retained-generation fixtures. Preserve the nine disabled known-bug reproductions; omit two connector-only lifecycle tests. Expiration checks verify live data-file sets and exact delete-file counters; 4.2's separate manifest-name/data-counter issue remains unchanged. The delete/history SQL suite checks visible rows and eager/late-materialization parity because 4.2 does not expose master's `_file`/`_pos` columns. The inventory labels upstream-only evidence explicitly. - Port ES residual tracking to the legacy planner and add compound OR/NOT, docvalue eligibility and Thrift-context tests there. Use Java 8-compatible HTTP APIs for opt-in ES 9 tests and the branch's supported node-address fixtures. - Keep the existing full-schema Iceberg metadata-table scan, which already supplies the file-size dependency for split offsets. Adapt the external write suite to verify offsets without requiring master-only distribution plans or golden output. - Use the existing Parquet statistics interface and physical row-location representation. Keep the TopN scheduling and pruning invariants. - Include the shared Arrow array normalizer required by the new reader, taken from the same master revision. Preserve 4.2 Lance/Avro dispatch; omit the schema-inference test for the unavailable Hive OpenCSV parser. ### Validation - FE production and test sources compile with the branch's Java 8 target. Across the targeted runs and focused reruns, 20 test classes report 181 discovered, 171 passed, zero failures/errors, and 10 skipped: nine intentionally disabled known-bug reproductions plus the opt-in live ES 9 class. - FE Checkstyle: passed with zero violations. - Clang compiler syntax checks: all 23 affected C++ translation units passed against the current sources and freshly generated Thrift, using cached third-party/generated build dependencies. Focused BE runtime validation is listed below. - clang-format 16: all 30 affected C++ source/header files passed. - Groovy 4.0.19 syntax and AST conversion: all seven changed suites passed. All 105 local inventory links resolve. - Complete staged-diff self-review, whitespace/conflict checks, and sensitive-information checks passed. A full BE rebuild and SQL/external-service regressions were not run locally. Live ES 9 tests require their opt-in endpoint. CI is requested for the combined backport. ### Release note Fix Paimon reads after field renames, external-catalog SHOW DATABASES authorization, and ES compound residual filtering. Support ES 9.x node discovery, publish Iceberg Parquet split offsets, improve Parquet V2 TopN row-group scheduling, and use FileScannerV2 for Arrow loads and text/JSON schema inference. ### Check List (For Author) - Test - [x] Unit Test - [x] Regression test additions and syntax checks; SQL execution pending CI - Behavior changed: - [x] Yes. Backport the changes listed above. - Does this need documentation? - [x] No. Existing interfaces and settings are retained; the test coverage inventory is included. ### Follow-up fixes - Set the Thrift `enable_file_scanner_v2` default to `true`, matching the session default. Preserve explicit `false` for legacy query scans and extend the existing load-selection test. - Keep the selected Paimon snapshot and schema together during relation projection. Historical sequence/aggregation options must not be combined with the latest field names. Read-only principals can resolve historical selectors without INSERT permission. - Read legacy append schemas with missing or empty bucket keys without bucket pruning, preserving every historical file. The regression covers both unaware and multiple fixed buckets. Follow-up validation: 169 targeted Paimon FE tests passed with zero failures/errors/skips. FE production compilation and Checkstyle passed. Both changed C++ test translation units passed compiler syntax checks and clang-format 16. Regenerated Java/C++ defaults are enabled; a Java 8-targeted protocol check verifies constructor/clear defaults, an omitted wire field, and an explicit-false round trip. Complete BE CI and live external SQL suites remain pending. The two new reproductions first failed with the same missing-bucket-key and renamed-sequence-field errors as CI. A separate read-only-principal reproduction also failed before the permission correction. Complete external regression execution remains pending CI. ### BE unit-test compatibility - Complete the native Arrow Variant input dependency for `branch-4.2`: accept binary storage and the Parquet Variant extension, validate metadata and payloads before appending, and retain owned data after Arrow buffers are released. Allow that ingestion path through the load reader while preserving query-format restrictions and source-default validation. - Preserve Variant V2 markers in the Arrow test fixtures, including nested types. Verify timestamp input against this branch's SerDe for positive, negative, and second-boundary values. Match the existing DATE range diagnostic in the TopN pruning test. - Add tests for sliced and empty reads, invalid ranges and carriers, malformed metadata/payloads, NULL children, atomic failure, buffer ownership, and the query capability boundary. Validation: all 13 previously failing BE tests passed. The expanded run passed all 309 tests across nine suites, including Arrow/JSON loads, load validation, Iceberg, table mapping, and Variant input/output. The focused executable rebuilds the affected readers and SerDe against cached 4.2 build dependencies; this is not a complete BE rebuild. All seven changed C++ translation units passed compiler checks with current headers/generated Thrift, and all 33 affected C/C++ files passed clang-format 16. The complete staged diff, whitespace, and sensitive-information checks passed. Full CI is requested with `run buildall` and `/review`.
What problem does this PR solve?
Related PR: #69650 (reader regression coverage)
With
nodes_discovery=true, ES metadata loading followsEsMetadataFetcher.fetchShards -> EsConnectorRestClient.getHttpNodes -> EsNodeInfo -> EsMajorVersion.parse. The parser accepts only majors through 8, so a 9.x node makes discovery fail with an unsupported-version exception. The configured-seed path with discovery disabled does not parse node versions and is not affected in the same way.Add the explicit ES 9 major, comparisons and latest-supported bound while continuing to reject unvalidated future majors with a clear diagnostic. Add an HTTP unit test containing mixed 8.19/9.0 nodes, IPv6 routing and a node without HTTP, plus an opt-in live compatibility suite rather than relying on version parsing alone.
The live suite creates isolated temporary indices and checks the production connector's
_nodes/http,_mapping,_search_shards, index listing and metadata fetching with discovery enabled/disabled. It also verifies authenticated source/docvalue scroll requests, missing values, pagination, scroll cleanup and invalid-credential failures. Enable it withDORIS_ES9_TEST_URL,DORIS_ES9_TEST_USERandDORIS_ES9_TEST_PASSWORD.Release note
Allow Elasticsearch 9.x nodes during ES catalog node discovery.
Check List (For Author)
Check List (For Reviewer who merge this PR)