Skip to content

[test](iceberg) Expand capability, transaction and snapshot coverage - #69551

Merged
Gabriel39 merged 1 commit into
apache:masterfrom
Gabriel39:dev/iceberg-comprehensive-test-coverage
Oct 25, 2026
Merged

Gabriel39 merged 1 commit into
apache:masterfrom
Gabriel39:dev/iceberg-comprehensive-test-coverage

Conversation

@Gabriel39

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Iceberg has broad regression coverage, but feature names alone miss state transitions and weak oracles. For example, expiring fresh snapshots with a cutoff in 2020 never exercises ref retention.

Add 45 connector unit tests, two external regression suites, and an inventory mapping the published 84 operations plus read, version, model, lineage, type, scanner and storage dimensions to existing tests and remaining gaps. The tests cover snapshot/schema/ref isolation, atomic writes and failure paths, nested type metadata, exact predicate semantics, partition serialization, actual ref retention, and file positions across deletes and history.

Nine individually disabled reproductions preserve correct assertions for five confirmed issue families: DECIMAL-to-DOUBLE pruning, lineage-name collisions during a V2-to-V3 upgrade, ignored per-operation isolation properties, mixed MERGE affected-row counts, and expiration counters built from stale metadata. These were run and observed failing before disabling. Production behavior is unchanged.

Release note

None

Validation

  • Full connector reactor: mvn -f fe/pom.xml -pl :fe-connector-iceberg -am test -DfailIfNoTests=false -Dmaven.build.cache.enabled=false with the matching Thrift 0.24.0 compiler: BUILD SUCCESS, including FE Checkstyle.
  • Iceberg connector: 1,734 discovered, 1,720 passed, 14 skipped. New tests: 45 discovered, 36 passed, 9 intentionally disabled defect reproductions.
  • Both Groovy suites compile with Groovy 4.0.19. They use existing REST/MinIO/Spark fixtures and dynamic comparisons, with no handwritten golden results.
  • SQL suites were not executed: the managed QA/Jenkins endpoints are unreachable from the validation host. BE unit tests and the full backend/deployment matrix were not run.

Check List (For Author)

  • Test
    • Regression test (added; compilation checked; SQL execution pending)
    • Unit Test
  • Behavior changed:
    • No.
  • Does this need documentation?
    • No. Test coverage inventory is included.

### What problem does this PR solve?

Problem Summary: Add connector semantic tests, external regression cases and
an operation coverage inventory. Preserve correct, individually disabled
reproductions for known issues without changing production behavior.

### Release note

None

### Check List (For Author)

- Test: Unit Test; full connector reactor and FE Checkstyle passed.
  Groovy compilation passed; SQL execution pending managed environment.
- Behavior changed: No
- Does this need documentation: No
@hello-stephen

Copy link
Copy Markdown
Contributor

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@Gabriel39

Copy link
Copy Markdown
Contributor Author

run buildall

@Gabriel39

Copy link
Copy Markdown
Contributor Author

/review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Static review of all 12 changed files at 1014a63 found no verified new defects. The PR adds nine Java test classes, two external SQL suites and a coverage inventory; production behavior is unchanged. There are no existing inline findings to carry forward and no additional user-provided focus points.

Critical checkpoint conclusions:

  1. Goal and proof: the additions strengthen snapshot/schema/ref isolation, write publication, type/partition/predicate oracles, and delete/history coverage. The 45 test methods include nine explicitly disabled reproductions of pre-existing issues; those are not passing coverage or newly introduced defects.
  2. Scope and clarity: changes stay within Iceberg tests and their inventory, following existing JUnit 5, recording-fake and Spark/REST fixture patterns.
  3. Concurrency and locks: no new threads or production locking; the transaction tests model an external commit between begin and commit using separate table instances.
  4. Lifecycle: fixtures are per test, file-scan iterables close deterministically, begin-failure/close guards are checked, and the SQL suite restores its modified TopN threshold in finally.
  5. Configuration: no configuration item added. Existing scanner defaults, fixture guards and explicit merge-on-read table properties support the exercised paths.
  6. Compatibility: no production symbol, API, plugin surface or storage-format change; V1/V2/V3 are test inputs.
  7. Thrift/protobuf: no definitions or field IDs changed.
  8. Parallel paths: reviewed branch/tag/explicit-snapshot and metadata-table schemas; both lineage names; all predicate modes; nested mapping flags; static/dynamic/branch overwrite; UPDATE/MERGE; and V2/V3 Parquet/ORC SQL cases.
  9. Conditional checks: enablement, unsupported DATE/hour transforms, and stale/fresh or position/equality test branches have concrete purposes.
  10. Test coverage: independent scalar comparisons, SDK transforms, file sets, historical snapshots and unchanged metadata provide meaningful positive and negative oracles. The future-cutoff retention case has a real unreferenced-snapshot control. TopN eligibility and physical delete-coordinate assumptions match the current call chain.
  11. Expected results: no golden result files changed. Ordered SQL comparisons preserve pre-mutation coordinates and ref contents; no incorrect new expectation was established.
  12. Observability: no new production path requires logs or metrics; relevant assertions identify mode, type or state.
  13. Transactions and persistence: publication, parent ancestry, branch isolation and failed-mutation atomicity are checked; no EditLog, replay or failover logic changed.
  14. Data writes: test fragments match the existing BE commit protocol, including UPDATE data/delete pairing and disjoint MERGE actions. No production atomicity or crash-handling behavior changed.
  15. FE/BE variables: no transmitted variable or protocol field added.
  16. Performance: small bounded test matrices and metadata histories; no production hot-path work added.
  17. Other concerns: all inventory links resolve and its 84 support rows match the linked published capability matrix. Its implementation/documentation differences and partial coverage are explicitly identified.

Validation limits: this review was static only; no builds, tests, SQL, Docker fixtures or optimizer EXPLAIN plans were executed. Managed SQL execution, runtime failure/restart/failover cases and the full backend/scanner/storage matrix remain unverified, as the PR already states. Source tracing supports the TopN path, but this new suite does not itself assert its EXPLAIN shape; the neighboring metadata suite does. These are execution and coverage limits, with no unresolved introduced-defect candidate in the reviewed changes.

Review converged after 2 round(s).

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 28366 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 1014a633b40f0941d32a08f591b82ee5d4292fb6, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17603	5264	5083	5083
q2	2126	304	262	262
q3	10246	1377	822	822
q4	4685	459	340	340
q5	7428	801	527	527
q6	180	182	149	149
q7	743	806	602	602
q8	9259	1335	1102	1102
q9	5450	4205	4172	4172
q10	6820	1292	1021	1021
q11	420	246	225	225
q12	638	401	274	274
q13	18122	3645	2988	2988
q14	272	277	238	238
q15	q16	729	715	667	667
q17	1190	755	575	575
q18	6955	6162	6100	6100
q19	1133	971	602	602
q20	399	334	222	222
q21	4614	2148	2284	2148
q22	350	303	247	247
Total cold run time: 99362 ms
Total hot run time: 28366 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5632	5609	5601	5601
q2	687	566	541	541
q3	5207	5391	4877	4877
q4	1991	2118	1573	1573
q5	5231	5122	5501	5122
q6	265	205	160	160
q7	2350	2071	1866	1866
q8	3103	2748	2969	2748
q9	8029	7898	8073	7898
q10	3746	3662	3217	3217
q11	605	428	407	407
q12	728	694	518	518
q13	3513	3791	3382	3382
q14	321	319	310	310
q15	q16	733	721	628	628
q17	8273	7447	7340	7340
q18	13110	12224	13027	12224
q19	917	824	811	811
q20	2153	2153	1937	1937
q21	5776	4678	4716	4678
q22	495	482	418	418
Total cold run time: 72865 ms
Total hot run time: 66256 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 150985 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 1014a633b40f0941d32a08f591b82ee5d4292fb6, data reload: false

query5	4313	600	449	449
query6	435	204	190	190
query7	4803	443	232	232
query8	343	171	150	150
query9	8778	3105	3112	3105
query10	486	320	264	264
query11	6111	3861	3592	3592
query12	159	90	86	86
query13	1273	436	327	327
query14	6147	3909	3663	3663
query14_1	3381	3441	3425	3425
query15	208	193	181	181
query16	956	424	405	405
query17	869	660	537	537
query18	2426	430	310	310
query19	203	173	138	138
query20	87	88	87	87
query21	211	133	106	106
query22	13138	12946	12912	12912
query23	13445	12757	12398	12398
query23_1	12427	12499	12440	12440
query24	7394	826	472	472
query24_1	479	471	499	471
query25	538	421	362	362
query26	1276	261	145	145
query27	2766	443	272	272
query28	4626	1941	1963	1941
query29	1573	610	454	454
query30	298	220	189	189
query31	1000	934	815	815
query32	160	92	95	92
query33	528	293	237	237
query34	881	849	496	496
query35	747	768	641	641
query36	785	808	721	721
query37	128	99	84	84
query38	1781	1755	1709	1709
query39	780	790	750	750
query39_1	726	740	748	740
query40	222	123	99	99
query41	72	69	68	68
query42	93	87	90	87
query43	345	367	316	316
query44	1278	685	695	685
query45	182	183	172	172
query46	827	972	569	569
query47	2762	2961	2897	2897
query48	296	306	213	213
query49	570	391	291	291
query50	676	271	221	221
query51	10525	10540	10636	10540
query52	85	77	72	72
query53	190	209	147	147
query54	242	193	175	175
query55	72	71	65	65
query56	232	211	206	206
query57	1642	1602	1592	1592
query58	292	257	256	256
query59	2142	2120	1953	1953
query60	292	241	210	210
query61	149	153	136	136
query62	386	332	281	281
query63	180	158	157	157
query64	2710	968	764	764
query65	3355	3316	3259	3259
query66	1778	418	298	298
query67	20000	20020	19838	19838
query68	3095	1004	614	614
query69	381	285	245	245
query70	847	780	758	758
query71	289	235	208	208
query72	2670	2545	2333	2333
query73	504	522	302	302
query74	4585	4506	4332	4332
query75	2316	2263	1904	1904
query76	2308	1016	573	573
query77	346	355	255	255
query78	9813	9728	9206	9206
query79	976	838	510	510
query80	1228	409	362	362
query81	583	318	269	269
query82	621	130	107	107
query83	301	194	187	187
query84	309	126	97	97
query85	866	422	367	367
query86	396	231	233	231
query87	2013	1961	1800	1800
query88	3676	2664	2672	2664
query89	334	280	243	243
query90	1919	167	155	155
query91	158	147	126	126
query92	97	92	90	90
query93	1027	1015	575	575
query94	646	291	285	285
query95	588	387	318	318
query96	653	472	229	229
query97	2441	2425	2325	2325
query98	159	148	152	148
query99	775	761	645	645
Total cold run time: 234981 ms
Total hot run time: 150985 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 24.54 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 1014a633b40f0941d32a08f591b82ee5d4292fb6, data reload: false

query1	0.00	0.00	0.01
query2	0.09	0.05	0.05
query3	0.26	0.09	0.09
query4	1.61	0.10	0.10
query5	0.23	0.23	0.24
query6	1.17	0.69	0.71
query7	0.04	0.01	0.01
query8	0.06	0.04	0.04
query9	0.39	0.35	0.35
query10	0.57	0.59	0.56
query11	0.20	0.15	0.14
query12	0.18	0.15	0.15
query13	0.50	0.49	0.47
query14	1.02	1.00	1.01
query15	0.63	0.61	0.61
query16	0.34	0.36	0.35
query17	1.09	1.14	1.14
query18	0.22	0.21	0.21
query19	2.08	1.98	1.95
query20	0.02	0.01	0.01
query21	15.51	0.20	0.13
query22	4.92	0.05	0.06
query23	16.27	0.30	0.12
query24	2.78	0.54	0.56
query25	0.12	0.09	0.06
query26	1.67	0.21	0.14
query27	0.06	0.05	0.05
query28	4.17	0.76	0.38
query29	12.50	4.13	3.27
query30	0.30	0.13	0.09
query31	2.78	0.57	0.32
query32	3.21	0.60	0.49
query33	3.20	3.24	3.25
query34	15.33	3.99	3.40
query35	3.34	3.35	3.36
query36	0.55	0.42	0.41
query37	0.10	0.07	0.06
query38	0.05	0.04	0.03
query39	0.04	0.03	0.03
query40	0.17	0.14	0.14
query41	0.09	0.03	0.03
query42	0.03	0.03	0.03
query43	0.05	0.03	0.04
Total cold run time: 97.94 s
Total hot run time: 24.54 s

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 100% (0/0) 🎉
Increment coverage report
Complete coverage report

@Gabriel39
Gabriel39 merged commit 7224a2d into apache:master Oct 25, 2026
37 checks passed
xylaaaaa added a commit to xylaaaaa/doris that referenced this pull request Oct 26, 2026
…merged from master

### What problem does this PR solve?

Issue Number: None

Related PR: apache#69392

Problem Summary: `IcebergConnectorTransaction.addCommitData` now rejects a reported file that is not under a raw location registered by `planWrite`. `IcebergWriteTransactionCoverageTest` (added on master by apache#69551) feeds commit data to a transaction directly, without `planWrite`, so 11 of its cases failed with that rejection after the merge. The test now registers `s3://bucket/events`, under which all its files live, as `IcebergConnectorTransactionTest` already does. `IcebergWriteKnownBugsTest` builds its transactions the same way; its cases are disabled, but they would fail for this unrelated reason once re-enabled, so it registers the location too.

### Release note

None

### Check List (For Author)

- Test: Unit Test (FE UT in CI)
- Behavior changed: No
- Does this need documentation: No
hubgeter added a commit to hubgeter/doris that referenced this pull request Oct 28, 2026
### What problem does this PR solve?

Related PR: apache#69551

Problem Summary:
UPDATE and SQL MERGE share the physical row-level sink and BE merge
dialect. PhysicalPlanTranslator hardcoded WriteOperation.MERGE for both,
so SQL UPDATE still selected write.merge.isolation-level after the
connector began honoring operation-specific properties.

Use the sink's existing SQL-MERGE cardinality marker to preserve UPDATE
versus MERGE when constructing the connector write handle. Also validate
write-provider support against the concrete operation instead of accepting
any DELETE/MERGE-capable provider.

Add translator assertions for both paths and include UPDATE in the mocked
provider capabilities.

### Release note

None

### Check List (For Author)

- Test: Unit Test
  - PhysicalPlanTranslatorIcebergRowLevelDmlTest
  - ExternalRowLevelUpdatePlanBuilderTest
- Behavior changed: Yes, SQL UPDATE now reads write.update.isolation-level.
- Does this need documentation: No
Gabriel39 pushed a commit that referenced this pull request Oct 28, 2026
### What problem does this PR solve?

Issue Number: N/A

Related PR: #69551

Problem Summary:
`expire_snapshots` built its delete-file kind map from a table handle
that could predate delete files committed by another writer. Iceberg
refreshes table metadata during expiration, so the callback could
receive an unmapped position or equality delete file and count it as a
data file.

Refresh the table before building the file-kind map so classification
and expiration operate on the same metadata generation. Add regression
coverage for position and equality delete files committed after the
table was loaded.

Before the fix, both cases returned `[1, 0, 0, 2, 3, 0]`. After the fix,
position deletes return `[0, 1, 0, 2, 3, 0]` and equality deletes return
`[0, 0, 1, 2, 3, 0]`.

### Release note

Fix `expire_snapshots` misreporting position and equality delete files
as data files after concurrent metadata commits.

### Check List (For Author)

- Test
    - [ ] Regression test
    - [x] Unit Test
    - [ ] Manual test (add detailed scripts or steps below)
    - [ ] No need to test or manual test. Explain why:
- [ ] This is a refactor/code format and no logic has been changed.
        - [ ] Previous test can cover this change.
        - [ ] No code files have been changed.
        - [ ] Other reason

Validated on latest `apache/master`: `IcebergExpireSnapshotsActionTest`,
15 tests passed. The full `fe-connector-iceberg` suite previously passed
1739 tests with 14 skipped.

- Behavior changed:
    - [ ] No.
- [x] Yes. The reported position/equality delete counters are corrected.

- Does this need documentation?
    - [x] No.
    - [ ] Yes.

### Check List (For Reviewer who merge this PR)

- [ ] Confirm the release note
- [ ] Confirm test cases
- [ ] Confirm document
- [ ] Add branch pick label
Gabriel39 added a commit to Gabriel39/incubator-doris that referenced this pull request Oct 29, 2026
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.
yiguolei pushed a commit that referenced this pull request Oct 30, 2026
### 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`.
Gabriel39 pushed a commit that referenced this pull request Nov 4, 2026
### What problem does this PR solve?

Issue Number: N/A

Related PR: #69551

Problem Summary:
Doris Iceberg DELETE, UPDATE, and MERGE all used the non-standard
`delete_isolation_level` property. As a result, the standard
per-operation table properties `write.delete.isolation-level`,
`write.update.isolation-level`, and `write.merge.isolation-level` were
ignored. A table configured for `snapshot` isolation therefore still
performed serializable data-file conflict validation and rejected normal
concurrent appends.

This change selects the Iceberg `TableProperties` key based on
`WriteOperation` and parses it with `IsolationLevel.fromName()`. The
existing delete-file, base-snapshot, conflict-filter, and
referenced-data-file validations remain enabled; only
`validateNoConflictingDataFiles` is gated on serializable isolation.
Invalid isolation-level values now fail explicitly instead of being
treated as snapshot isolation.

The three disabled regressions from #69551 are enabled. Unit coverage
also verifies per-operation key selection, serializable defaults, and
invalid values.

### Release note

Iceberg DELETE, UPDATE, and MERGE now honor their standard per-operation
isolation-level table properties.

### Check List (For Author)

- Test
    - [ ] Regression test
- [x] Unit Test: `IcebergConnectorTransactionTest` and
`IcebergWriteKnownBugsTest` pass, including all three concurrent-append
snapshot-isolation regressions.
    - [ ] Manual test (add detailed scripts or steps below)
    - [ ] No need to test or manual test. Explain why:
- [ ] This is a refactor/code format and no logic has been changed.
        - [ ] Previous test can cover this change.
        - [ ] No code files have been changed.
        - [ ] Other reason

- Behavior changed:
    - [ ] No.
- [x] Yes. Snapshot isolation now permits concurrent data-file appends
while retaining the other row-delta validations.

- Does this need documentation?
    - [x] No.
    - [ ] Yes.

### Check List (For Reviewer who merge this PR)

- [ ] Confirm the release note
- [ ] Confirm test cases
- [ ] Confirm document
- [ ] Add branch pick label
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants