Skip to content

Plain merge tree partition exports - #2290

Open
arthurpassos wants to merge 39 commits into
antalya-26.6from
feature/antalya-26.6/export-partition-plain-merge-tree
Open

Plain merge tree partition exports#2290
arthurpassos wants to merge 39 commits into
antalya-26.6from
feature/antalya-26.6/export-partition-plain-merge-tree

Conversation

@arthurpassos

@arthurpassos arthurpassos commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

List of changes:

  1. Implements partition export for plain merge tree using Json task descriptors stored on disk, the structure is simplified because it is much simpler than the replicated case
  2. Introduces the system.partition_exports table that keeps track of both plain and replicated cases. The old system.replicated_partition_exports is aliased to this new one for backwards compatibility.
  3. Escapes each portion of the partition export key - this is not backwards compatible.
  4. Stop shipping empty parquet files on plain object storage for exports with zero rows
  5. Throws on a few errors zk that were left as todo
  6. Refactor the test suite so that it is parametrized for both engines instead of duplicating the tests

Changelog category (leave one):

  • New Feature

Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md):

Export partition on plain merge tree. Should close #1908

User facing & functional changes:

  • Implements partition export for plain merge tree
  • Stop shipping empty parquet files on zero rows exports
  • New system.partition_exports table that covers both the previous replicated_partition_exports and the new one for plain merge tree

Documentation entry for user-facing changes

...

CI/CD Options

Exclude tests:

  • Fast test
  • Integration Tests
  • Stateless tests
  • Stateful tests
  • Unit tests
  • Performance tests
  • Aarch64 tests
  • All with ASAN
  • All with TSAN
  • All with MSAN
  • All with UBSAN
  • All with Coverage
  • All Regression
  • Disable CI Cache

Regression jobs to run:

  • Fast suites (mostly <1h)
  • Aggregate Functions (2h)
  • Alter (1.5h)
  • Benchmark (30m)
  • CAS (content-addressed storage; Antalya only)
  • ClickHouse Keeper (1h)
  • Iceberg (2h)
  • LDAP (1h)
  • OAuth (5m)
  • Parquet (1.5h)
  • RBAC (1.5h)
  • SSL Server (1h)
  • S3 (2h)
  • S3 Export (2h)
  • Swarms (30m)
  • Tiered Storage (2h)

@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown

Workflow [PR], commit [2662683]

@arthurpassos

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Aug 29, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-04T12:10:15.243704Z c8d038d Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@arthurpassos
arthurpassos marked this pull request as ready for review August 29, 2026 17:20
@arthurpassos

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 240da8173c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/Storages/MergeTree/MergeTreePartitionExportScheduler.cpp Outdated
Comment thread src/Storages/MergeTree/MergeTreePartitionExportScheduler.h Outdated
Comment thread src/Storages/MergeTree/MergeTreePartitionExportScheduler.cpp Outdated
Comment on lines +286 to +291
catch (...)
{
replicated_error = std::current_exception();
tryLogCurrentException(getLogger("InterpreterKillQueryQuery"),
"KILL EXPORT PARTITION: could not read system.replicated_partition_exports (the WHERE may "
"reference columns that only exist for plain MergeTree); ignoring ReplicatedMergeTree tables");

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Propagate system-table read failures during KILL

If either system-table query fails for an operational reason such as a memory limit, timeout, or internal exception, this broad catch treats it like an engine-specific unknown column and continues with the other table. The command can therefore report successful results while silently leaving matching exports from the failed table running. Only suppress the specific predicate-resolution error that proves the filter belongs exclusively to the other table; propagate all other failures.

AGENTS.md reference: AGENTS.md:L153-L153

Useful? React with 👍 / 👎.

@arthurpassos

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c8d038d350

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/Storages/MergeTree/MergeTreePartitionExportTask.h Outdated
Comment thread src/Storages/MergeTree/MergeTreePartitionExportScheduler.cpp
Comment thread src/Storages/System/StorageSystemPartitionExports.cpp Outdated
Comment thread docs/en/antalya/partition_export.md Outdated
Comment thread docs/en/antalya/partition_export.md Outdated
@arthurpassos arthurpassos changed the title Feature/antalya 26.6/export partition plain merge tree Plain merge tree partition exports Sep 4, 2026
@arthurpassos arthurpassos added the port-antalya PRs to be ported to all new Antalya releases label Sep 8, 2026
arthurpassos and others added 7 commits September 8, 2026 13:51
…n-plain-merge-tree

Keep the skip-policy commit-file short-circuit from antalya-26.6 together with
lazy first-sink creation, and port the new skip-policy tests into the unified
object-storage suite.

Co-authored-by: Cursor <cursoragent@cursor.com>

### Pending mutations {#plain-merge-tree-pending-mutations}

The pending-mutation gate is more conservative than on a `Replicated*MergeTree`. A plain `MergeTree` does not scope its mutation snapshot by partition, so a mutation restricted with `IN PARTITION` still marks the parts of every other partition as having pending mutations, and exporting an unaffected partition is refused with `PENDING_MUTATIONS_NOT_ALLOWED`. The gate fails closed - it never exports data that a pending mutation would have changed - so the effect is that you may have to wait for an unrelated mutation to finish, or set `export_merge_tree_part_throw_on_pending_mutations` to `false`.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

I should check ways around this later

Comment thread docs/en/antalya/partition_export.md Outdated
### Commit info columns

These columns surface paths produced by the destination storage during commit, so it is possible to inspect what was written without consulting the destination directly:
These columns surface paths produced by the destination storage during commit, so it is possible to inspect what was written without consulting the destination directly. They are populated for `Replicated*MergeTree` sources only; a plain `MergeTree` does not persist the commit paths, so they stay empty there even after a successful commit.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

This shall be implemented for plain merge tree as well

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Is this going to be covered in another PR?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

I plan to cover it in this pr unless it is too complex (I doubt it is).

For now I am reviewing my own code (AI code :D)

@DimensionWieldr

Copy link
Copy Markdown
Collaborator

Iceberg export partition regression suite is fully passing on no/ice/glue catalogs with plain merge tree tables.

I will wait for dev review and the CI run to do a final CI triage to confirm no PR caused failures.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

antalya antalya-26.6 port-antalya PRs to be ported to all new Antalya releases

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support ALTER TABLE ... EXPORT PARTITION for non-replicated MT tables

3 participants