Skip to content

[fix](fe) Refresh stale external table lookup state - #69501

Open
924060929 wants to merge 8 commits into
apache:masterfrom
924060929:codex/external-refresh-lookup
Open

924060929 wants to merge 8 commits into
apache:masterfrom
924060929:codex/external-refresh-lookup

Conversation

@924060929

@924060929 924060929 commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Issue Number: None

Problem Summary: External table refresh invalidated connector metadata but retained the FE table-name snapshot and object/ID lookup. After a remote drop or same-name recreation, SHOW TABLES and lookups could continue using the old identity. Explicit REFRESH TABLE now invalidates that lookup state and replays the same decision on follower FEs. Case-folding modes invalidate the database lookup domain to cover old remote spellings; ordinary content mutations retain their narrower invalidation and do not reload table names.

An ordinary base-table connector-handle lookup that definitively reports a missing table now also removes the matching FE names/object/ID state and table metadata. The lookup captures exact retained cache registrations before remote I/O and rechecks the catalog, database, names snapshot, table object, and publication generation before committing cleanup. An old missing response cannot remove a refreshed or recreated table. Timeouts and other connector failures propagate without triggering missing-table cleanup. Cleanup is conservative when the matching names snapshot is already cold or the session bypasses shared schema caches.

Logical invalidation happens inside the guarded commit; physical removal and resource-release callbacks run synchronously after the enclosing locks are released. Detached registrations keep cleanup tied to old entries, including when new values are published before cleanup completes. Numeric lookups publish their ID alongside the table object, and newly reloaded objects have an update timestamp before schema loading.

Release note

External table refresh reloads cached table names and lookup identity. A live lookup confirming that a remote table was dropped also clears matching stale lookup state automatically.

Check List (For Author)

  • Test:
    • Unit Test: 313 cache/FE tests plus 33 ES/Paimon tests; cache framework, missing-table races, refresh/replay, numeric-ID publication, case modes, ordinary writes, system tables, and row-count caches.
    • Regression test: test_hive_external_lookup_refresh, generated output and comparison against a local FE connected to real Hive Metastore. Covers explicit refresh, drop/recreate, sibling retention, and automatic cleanup after a missing lookup.
    • Build: ./build.sh --fe -j4, including Checkstyle.
  • Behavior changed:
    • Yes. Explicit refresh and definitive missing-table observations invalidate matching external lookup state; ordinary writes retain narrow invalidation.
  • Does this need documentation?
    • No.

Validation scope: FE unit tests and Hive metadata regression; no BE data-execution validation. The first query that observes a missing table can retain the existing schema-cache error message; this change repairs subsequent lookup/listing state.

### What problem does this PR solve?

Issue Number: None

Problem Summary: Explicit REFRESH TABLE invalidated the connector metadata but kept the external database's cached table-name snapshot, table object, and ID lookup. After a remote table was dropped or recreated, SHOW TABLES and later lookups could keep using the old identity until cache expiry. Invalidate that lookup state for explicit refresh on the leader and during follower replay, including cold replay paths. In case-insensitive mode, invalidate the database scope so an old spelling cannot retain a stale object. Keep content-only refreshes unchanged and treat old edit logs without the new flag as content-only refreshes.

### Release note

Explicit REFRESH TABLE now reloads external table names and table lookup identity.

### Check List (For Author)

- Test: Unit Test
    - ExternalDatabaseTest and RefreshManagerTest: 52 tests passed.
    - FE build and Checkstyle passed.
- Behavior changed: Yes. Explicit REFRESH TABLE reloads external table lookup state.
- Does this need documentation: No
@924060929
924060929 requested a review from CalvinKirs as a code owner October 23, 2026 04:00
@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?

@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

@924060929

Copy link
Copy Markdown
Contributor Author

/review

…fresh

### What problem does this PR solve?

Issue Number: None

Problem Summary: Explicit REFRESH TABLE with case-insensitive table lookup invalidates all FE table identities in the database, but a hot-table replay could invalidate only the selected connector table spelling. If another spelling already had a cached connector snapshot, queries could continue reading that snapshot after refresh. Invalidate the connector database before clearing FE lookup and metadata caches in this mode, while preserving single-table invalidation for other refreshes.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - RefreshManagerTest: 16 tests passed.
    - FE build and Checkstyle passed.
- Behavior changed: Yes. Explicit case-insensitive REFRESH TABLE invalidates database-scoped connector caches.
- Does this need documentation: No
@github-actions

Copy link
Copy Markdown
Contributor

Codex automated review failed and did not complete.

Error: Review context preparation failed before Codex ran; inspect the 'Prepare authoritative PR context and required AGENTS guides' step.
Workflow run: https://github.com/apache/doris/actions/runs/39898038877

Please inspect the workflow logs and rerun the review after the underlying issue is resolved.

@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

@924060929

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 five changed files at head 0da4c6d found one P2 concurrency defect: mode-2 explicit refresh can erase a newly published table ID while its new object remains cached. No P0/P1 finding or existing blocking thread was found. No additional user focus was supplied.

Critical checkpoint conclusions:

  1. Goal and proof: explicit REFRESH TABLE now clears names, table objects and lookup IDs; internal content refresh retains identity. The new unit tests demonstrate sequential clearing, case-equivalent replacement and replay behavior, but do not cover the reported publication race.
  2. Scope and reuse: three production files and two test files form a focused change using existing invalidators and the existing refresh log operation.
  3. Concurrency and locking: SQL lookup, replay, event and cache-refresh workers can overlap. Individual cache stripes, scope-generation barriers and the ID-index lock protect their own state; bulk object invalidation and later ID clearing lack a shared publication window. No additional deadlock or heavy IO under a new lock was identified.
  4. Lifecycle: replay remains cache-only and lazy; explicit refresh discards cached identities while existing query references can remain live. No new resource cycle, executor or static initialization dependency was introduced.
  5. Configuration: no setting was added; existing lower_case_table_names selects database-scoped invalidation in mode 2.
  6. Compatibility: the annotated primitive Gson flag defaults to false for old records; the operation and serialization envelope are unchanged. Legacy records retain content-only refresh behavior.
  7. Thrift/protobuf: no definitions or field IDs changed.
  8. Parallel paths: explicit SQL and hot/cold replay propagate the new flag; mutation, INSERT, DDL, truncate and event refreshes retain the false-default overload. Connector fallback invalidation avoids synchronous remote loading on cold replay.
  9. Conditions and errors: the cold-initialization guard and mode-2 broadening match existing lookup semantics. Nested finally blocks retain FE and engine/row-count barriers when connector invalidation fails, and failures propagate.
  10. Tests and negative cases: JUnit 5 additions cover explicit/content separation, cold objects, database-scoped mode-2 invalidation, flag round-trip and case-equivalent identities. A deterministic test for the reported object/ID publication gap is missing; no end-to-end SQL/schema validation was added.
  11. Expected results and validation: no regression output files changed. Per the review contract, tests and builds were not run; validation here is static inspection only.
  12. Observability: existing logs identify catalog, database, table/ID, update time and replay warmth; no additional metric requirement was identified.
  13. Persistence and failover: the explicit flag is written and read through ExternalObjectLog and the existing EditLog dispatch. Master/replay invalidation scopes match; committed external mutation logging remains before fallible refresh. No additional durable metadata mutation was introduced.
  14. Data writes and crash behavior: no remote data write, transaction, visible-version or delete-bitmap logic changed. The local cache atomicity defect is the inline finding; no separate crash-handling defect was found.
  15. FE/BE propagation: no new cross-process variables or wire fields.
  16. Performance: mode-2 database-wide invalidation deliberately broadens work to fence case-equivalent identities; no separate substantiated performance defect was found.
  17. Other invariants and concerns: no BE memory-accounting or function-system change applies. Mapped names, session bypass and retained-ID consumers were checked. No additional naming/replay defect or unresolved concrete candidate remains.

Coverage limit: static review cannot establish runtime/build success; the reported interleaving is supported by the reachable publication and invalidation control flow. All changed paths and identified risk focuses were reviewed.

Review converged after 3 round(s).

### What problem does this PR solve?

Issue Number: None

Related PR: None

Problem Summary: A catalog-wide table cache invalidation could clear the table ID index after a concurrent lookup published a fresh table. The table object would remain cached while its ID lookup disappeared. Run the index clear at the same publication boundary as cache invalidation, and route warm-value index repairs through that boundary. A concurrent lookup test covers the clear and republish ordering.

### Release note

None

### Check List (For Author)

- Test: Unit Test: FeMetaCacheEntryTest, ExternalDatabaseTest, RefreshManagerTest (72 passed); FE build and Checkstyle passed.
- Behavior changed: Yes (table ID lookup remains consistent across concurrent bulk invalidation)
- Does this need documentation: No
@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

@924060929

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.

Reviewed all nine changed files and the related refresh, replay, name-resolution, cache-publication and row-count paths at 8bd1d68d65ac063430ba54c21e14c32e4288795c. No new PR-introduced finding was accepted; no existing P0/P1 finding applies.

The specific post-invalidation/pre-ID-clear interleaving in existing P2 thread 4356099602 is closed: bulk ID clear shares the table-cache publication gate, and warm index repair uses guarded CAS. A separate delayed-action-token/new-lease window remains in unchanged adapter code: a lookup paused after creating its FE token can acquire a fresh cache lease after invalidation, publish via commit(NO_OP), and skip its ID repair. Comparison with the merge base confirms that this behavior already existed, including the database-reset trigger. It is retained as known context for the same object/ID invariant and is not reposted as a new inline finding. Disabled-cache callback and sibling catalog-index limitations also predate this diff.

The reviewed control flow is:

explicit REFRESH TABLE
  -> connector invalidation
  -> FE names/object/ID invalidation
  -> engine metadata invalidation -> row-count invalidation
  -> journal explicit-refresh flag -> follower warm/cold replay
mutation/event refresh -> existing content-only invalidation
Critical checkpoint Conclusion
Goal and supporting tests Explicit refresh now resets membership and table lookup identity; content refresh retains its owner. Added unit tests cover eviction, replay and case-equivalent names. Source supports the intended change; tests were inspected only.
Scope and clarity Focused refresh intent flag and reuse of shared invalidation/publication mechanisms; no unrelated change found.
Concurrency and protection Query workers, refresh/replay threads, metastore events and async name refresh can overlap. Entry stripes/action tokens, scope generations, publication gates and the ID-index mutex protect the reviewed transitions, subject to the preexisting token/lease limitation above.
Work inside locks Remote loading and connector calls remain outside the new gate callback. ID-map clear runs within the writer; detached-value cleanup runs afterward.
Lock order and deadlocks Publication takes entry stripe before cache guards and index mutex. Bulk stripe scans release each stripe before the writer; the actual clear callback never reenters caches. No new lock cycle identified.
Lifecycle and initialization Ownership stays with existing cache entries; detached registrations are cleaned by identity. Replay misses avoid synchronous remote initialization. No new static-initialization dependency or resource owner.
Configuration No new configuration; existing case policy intentionally selects table versus database invalidation.
Compatibility The additive Gson flag defaults false in older logs; existing three-argument internal refresh callers retain content-only behavior. No connector SPI surface change.
Thrift/protobuf No definitions changed.
Parallel paths Warm/cold database and table replay, modes 0/1/2, mappings, mutation/event/DDL/truncate paths, by-ID access, eviction and reset were checked. No additional changed-flow defect verified.
Conditional branches The mode-2 widening handles distinct preserved-case owners; initialization guards avoid unbuilt caches. Existing validation/error conventions are preserved.
Test coverage JUnit tests cover explicit versus content refresh, cold replay, alternate spelling and bulk publication. The new lookup-start latch precedes the entry call, so it does not force every publication overlap; it is not proof of the broader object/ID invariant. No live connector end-to-end validation.
Test results No golden result files changed. Added assertions were checked against source; no test execution or build result is claimed by this review.
Observability Existing refresh/replay logs and cache metrics cover the changed paths; no additional instrumentation defect found.
Persistence and failover The existing journal operation writes/reads the new intent flag, and replay follows matching invalidation scope. Mutation logging before fallible refresh is preserved; cold replay invalidates conservatively.
Data writes and crash behavior No new remote data-write or transaction path. Nested finally blocks preserve local and row-count barriers on invalidation failure; runtime caches rebuild after restart.
FE/BE propagation and core storage invariants No FE/BE field, committed-data visibility, partition-version, delete-bitmap or BE memory-ownership change.
Performance Ordinary indexed warm lookup still returns without CAS. Database-wide invalidation is limited to explicit mode-2 refresh; index clearing is proportional to index size. No new avoidable hot-path IO or scan found.
Other concerns and user focus No additional user focus was supplied. Follow-up checks covered delayed load initiation, stale names refresh, mapped spellings, update time, callback failures and cleanup ownership. No unresolved new candidate remains.

Validation limits: static review only, with no builds, tests or source modifications. The known preexisting races and the concurrency-test limitation above are classified limits, not unverified new findings or unreviewed changed scope.

Review converged after 2 round(s).

### What problem does this PR solve?

Issue Number: None

Related PR: None

Problem Summary: Explicit external-table refresh now invalidates the cached table object. The existing test continued to read the old object after refresh and expected its schema load to advance the old update time, causing FE UT to fail. Resolve the table again and verify the replacement is reachable by both name and ID while the old object's update time stays unchanged.

### Release note

None

### Check List (For Author)

- Test: Unit Test: RefreshTableTest, FeMetaCacheEntryTest, ExternalDatabaseTest, RefreshManagerTest (74 passed); FE build and Checkstyle passed.
- Behavior changed: No (test expectation only)
- Does this need documentation: No
@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

@924060929

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 head de5afec found three new P2 issues: numeric-lookup ID publication, replacement update timestamps, and mode-1 historical remote-key invalidation. No P0/P1 finding was identified.

  • Goal and scope: explicit REFRESH now invalidates FE name membership and object identity, while content/event refresh remains narrower. All 10 changed files and related callers were reviewed; the changes are focused and reuse the existing cache/refresh framework. The inline findings describe the remaining behavior gaps.
  • Concurrency and locks: SQL/query threads, row-count loaders, replay, name refresh, and incremental events were traced. Named cold/warm publication and bulk ID clear share the gate; the numeric path remains uncovered. IO and detached cleanup stay outside the publication gate, with no new lock inversion found.
  • Lifecycle: lazy cache creation, old references, generation fencing, eviction, and detached ownership cleanup were checked. Replacement objects lose the refresh timestamp. No new static-initialization or resource-cycle issue was found.
  • Configuration and conditions: no new configuration was added. Existing modes 0/1/2, mapped names, session cache bypass, and disabled caches were checked. The mode-2 broad-invalidation condition omits mode-1 historical remote spellings.
  • Compatibility and persistence: the additive Gson flag defaults false for old logs; explicit refresh writes it and both hot/cold replay paths consume it without synchronous remote loading. Mutation, truncate, DDL and event refresh retain their content semantics. No gensrc field, storage format, FE/BE variable, or data-transaction write changes are involved; visible-version and delete-bitmap invariants are unaffected.
  • Errors and observability: nested finally blocks preserve FE and row-count invalidation after connector failure. Existing identity-bearing logs remain adequate; no new metric requirement was identified. The visible UPDATE_TIME regression is inline.
  • Tests and results: the new JUnit coverage checks name/object replacement, ID lookup, cold replay, mode-2 connector invalidation, JSON round trip and bulk named publication. It misses numeric capture/resume, timestamps before schema load, and mode-1 historical connector keys. The new lookup-start latch precedes the actual cache call, so it does not force gate contention on every schedule. No regression result files changed. Per the review contract, no build, tests or runtime experiments were executed.
  • Performance, reuse and remaining checks: hot named hits keep their fast path; warm repair adds bounded publication work; bulk ID clearing is proportional to retained identities and cleanup remains outside the gate. No additional substantiated performance, memory-ownership, or error-handling defect was found.

Existing thread 4356099602 was independently revalidated: its original mode-2 named-publication/late-clear interleaving is fixed. It is not reposted; the numeric-path finding is a separate single-key case. There are no existing P0/P1 comments to retain. No additional user focus was supplied. Coverage is complete for a static review; execution remains unvalidated as required by the environment.

Review converged after 3 round(s).

}
String localTableName = resolveTableNameForInvalidation(tableName);
try {
invalidateTableCache(localTableName);

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.

[P2] Preserve ID publication for in-flight numeric lookups

With enabled caches and ordinary lower_case_table_names=0, an ExternalRowCountCache worker can enter getTableNullable(long), read the indexed name at line 779, and pause before tables.get(name). This new per-table invalidation can then finish removing the object and its ID. When the worker resumes, tables.get acquires a fresh post-refresh generation and caches a replacement object, but that plain getter never restores the ID mapping. Subsequent numeric lookups fail despite the object being cached, and row-count/statistics callers return unknown until a lookup by name repairs it. Make numeric loads revalidate or publish their ID within the guarded object-publication action, and cover this capture/refresh/resume interleaving. This is distinct from the existing mode-2 late bulk-clear thread: it uses the single-key branch and publishes through the numeric path after ID removal has completed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in a099bd2: numeric lookups now use the guarded getTableAndPublishId path, so a replacement loaded after refresh republishes its ID. 584871c adds a capture/refresh/resume test that verifies the replacement object and ID mapping.

Env.getCurrentEnv().getExtMetaCacheMgr().invalidateTable(table);
try {
if (invalidateTableLookup) {
db.invalidateTableLookup(table.getName());

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.

[P2] Retain the refresh timestamp for the replacement object

refreshTableInternal writes updateTime onto the old table immediately above, but this call evicts that object. Its replacement starts with ExternalTable.updateTime = 0, so REFRESH TABLE followed by an information_schema.tables query projecting only UPDATE_TIME now returns NULL instead of the refresh time: FrontendServiceImpl reads the field directly, and the schema scanner converts zero to NULL. It stays unset until a later schema load calls initSchemaAndUpdateTime. Preserve the refresh time across replacement and test it before loading schema; the modified test currently checks the new timestamp only after getFullSchema().

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in a099bd2: buildTableForInit initializes updateTime when it reloads the replacement object, before schema loading. 584871c adds a replay test that reads the replacement timestamp without calling getFullSchema().


private void refreshTableInternal(ExternalDatabase db, ExternalTable table, long updateTime,
boolean invalidateTableLookup) {
boolean invalidateDatabase = invalidateTableLookup && table.getCatalog().getLowerCaseTableNames() == 2;

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.

[P2] Invalidate historical remote spellings in mode 1 as well

A local name can resolve to a different remote spelling with lower_case_table_names=1 too. For example, configure FE object/name expiry shorter than the Iceberg connector table TTL, query remote Foo as local foo, externally replace it with FOO, and query foo after FE-only expiry. The FE now retains FOO while the independent connector entry for Foo survives. Externally replace FOO with a new Foo containing different data, then refresh before the FE FOO object expires: this condition is false, so only connector key FOO is invalidated. The refreshed names then resolve back to Foo, whose exact-case table/snapshot caches still describe the first incarnation, allowing stale schema/data after successful refresh. Extend the broad invalidation to naming modes that can change the remote spelling, and cover this historical-key reuse case.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in a099bd2: explicit refresh invalidates the connector database in both case-folding modes, clearing historical remote spellings. 584871c adds a mode-1 test with two retained remote spellings.

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 83.67% (41/49) 🎉
Increment coverage report
Complete coverage report

### What problem does this PR solve?

Issue Number: None

Problem Summary: A live connector lookup can confirm a remotely dropped table while FE names, objects, IDs and metadata still retain its old identity. Capture exact retained cache observations before the remote read, and conditionally invalidate matching state only while the catalog, database, names and object registrations are still current. This prevents an old missing response from clearing a refreshed or recreated table. Defer physical removal and resource release until all enclosing guards are released. Keep ordinary write refreshes narrow. Also preserve numeric ID publication across refresh, cover both case-folding modes on explicit refresh/replay, and initialize the timestamp on successful object reload.

### Release note

External table lookups automatically clear matching stale metadata after a live lookup confirms a remote drop.

### Check List (For Author)

- Test: Unit Test: 313 cache/FE cases and 33 ES/Paimon cases; Hive metadata regression with generated output and comparison; ./build.sh --fe -j4 including Checkstyle
- Behavior changed: Yes, definitive missing-table observations invalidate matching external lookup state; ordinary writes do not reload table names
- Does this need documentation: No
@924060929 924060929 changed the title [fix](fe) Refresh external table lookup on explicit refresh [fix](fe) Refresh stale external table lookup state Oct 23, 2026
@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

@924060929

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 25 changed paths at a099bd2 found one new P2 issue: valid Iceberg views reach the table-handle absence branch and unnecessarily lose their shared lookup and metadata caches. The finding is inline. No additional user focus was supplied.

Critical checkpoint conclusions:

  • Goal and evidence: explicit refresh now invalidates names/object/ID lookup state, and definitive missing base-table reads conditionally repair it. Added tests cover these intended behaviors; the healthy-view exception remains.
  • Scope and reuse: changes stay within external metadata refresh and reuse the existing scoped-cache publication and removal mechanisms.
  • Concurrency: traced query/preload, MVCC, row-count, refresh/replay and cache-worker entry points. Catalog -> database observation -> names -> object guard order matches incremental publication; no additional deadlock or replacement-generation defect was substantiated. Remote reads occur before the guarded cleanup; physical resource release occurs afterward.
  • Lifecycle: exact retained registrations reject replaced/recreated objects; detached cleanup preserves new publications, drains after failures and clears its thread-local state. The actual connector classloader policy shares the cache library. C++ static initialization is unaffected.
  • Configuration: no new settings. Existing case modes, name-miss policy and session cache bypass paths were inspected.
  • Compatibility: the additive Gson refresh flag defaults to false for old records; ordinary content refresh retains its prior behavior. The SPI change is documentation only, with no method-surface change or incompatible storage-format change.
  • Thrift/protobuf: no definitions or field IDs changed.
  • Parallel paths: warm/cold replay, ordinary writes/events, name/numeric lookups, system tables and connector failure handling were inspected. SDK views require the additional distinction described inline.
  • Conditional checks: identity, generation, initialization and bypass checks correspond to concrete replacement/reset or session behavior; no additional incorrect condition was verified.
  • Test coverage: new tests cover explicit refresh, stale missing responses, table/database/catalog replacement, ID publication, naming modes, cleanup failure, bypass, sibling retention and ES/Paimon error propagation. Concurrency tests use latches/futures. The added fixture does not exercise healthy SDK views through production MVCC binding.
  • Changed results: the Hive expected-output sections match the suite's listing, schema and drop/recreate steps on static inspection. Output generation and runtime correctness were not independently reproduced.
  • Observability: existing cache/load diagnostics and refresh logs remain; ES failures now include the index and HTTP status, and Paimon failures include the table. No additional required instrumentation was identified.
  • Persistence/failover: explicit refresh journals its lookup-invalidation decision and replays both warm and cold states; older and mutation records retain false semantics. Automatic missing cleanup changes ephemeral local caches.
  • Data writes/atomicity: no new durable-data mutation or transaction protocol is introduced. Auxiliary ID clear/repair shares the publication boundary, and ordinary external writes retain narrow invalidation.
  • FE/BE passing: no new variables or wire payloads cross the boundary.
  • Performance: the reported view case forces unnecessary database-wide names enumeration and metadata reloads. Other observation setup is constant-time, and detached cleanup retains its existing traversal outside the guards.
  • Other concerns and limits: the complete changed-file list and upstream/downstream paths were covered statically; no builds, tests or source modifications were performed in this review environment.

Existing-thread disposition: the reported mode-1 historical-spelling case (4356914869), replacement timestamp (4356914864), numeric ID publication (4356914860), and bulk ID-clear ordering (4356099602) are addressed at this head and were not reposted. No existing P0/P1 finding was confirmed.

Review converged after 2 round(s).

return metadata.getTableHandle(session, dbName, getRemoteName());
Optional<ConnectorTableHandle> handle = metadata.getTableHandle(session, dbName, getRemoteName());
if (!handle.isPresent()) {
observation.ifPresent(Runnable::run);

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.

[P2] Preserve healthy Iceberg views when a table handle is absent

A normal SELECT * FROM iceberg_catalog.db.v on an existing SDK view reaches this branch: Iceberg advertises both MVCC and view support, so its views use PluginDrivenMvccExternalTable, and BindRelation.getLogicalPlan calls StatementContext.loadSnapshots before checking isView(). materializeLatest() then calls this resolver. Iceberg's tableExists() is false for views, so an empty table handle is expected here, as the separate view path in initSchema() already documents. With warm names/object caches, the new observation nevertheless removes the healthy view's object, ID and schema/connector metadata and invalidates the entire database names snapshot. Repeated view queries therefore force full table/view enumeration and rebuild cached metadata even though nothing changed remotely. Exclude known views from missing-base-table cleanup (or skip their table-only MVCC probe), and cover repeated view binding with a cache-retention test.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in 584871c: an empty table handle now triggers missing-table cleanup only when live viewExists is also false. The new test checks repeated healthy-view lookups retain name/object/ID/connector caches, then removes the view and verifies cleanup still occurs.

### What problem does this PR solve?

Issue Number: None

Problem Summary: Iceberg views have no table handle, but the new missing-table observation treated that normal result as a remote drop and evicted healthy view name, object, ID, and connector metadata. Confirm live view existence before clearing a missing table lookup, while still cleaning a truly dropped view. Update the Paimon authentication test for its explicit error propagation, and cover numeric lookup publication, refresh timestamps, and historical remote spellings with focused tests.

### Release note

Avoid unnecessary cache invalidation when querying existing external views.

### Check List (For Author)

- Test: Unit Test: 77 targeted Paimon and FE core tests passed via run-fe-ut.sh; Checkstyle passed.
- Behavior changed: Yes (healthy views retain external lookup caches when a table handle is absent).
- Does this need documentation: No
@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

@924060929

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.

Reviewed all 26 changed paths at 584871c. No new actionable findings were verified. The five existing P2 concerns are addressed on this head: healthy views retain lookup caches, both case-folding modes clear historical connector spellings, replacement objects receive an update timestamp before schema loading, numeric loads republish IDs, and bulk ID clearing shares the object-publication barrier. No existing P0/P1 finding remains to carry forward; no duplicate inline comments are added.

Critical checkpoint conclusions:

  • Goal and evidence: explicit REFRESH TABLE invalidates names/object/ID lookup state and journals that decision; confirmed missing base-table handles conditionally repair matching retained state. Unit and Hive regression additions cover refresh, drop/recreate, sibling retention and missing observations; inspected statically.
  • Scope and reuse: changes stay within external metadata refresh, absence/error handling and shared cache publication/cleanup abstractions. Existing cache generation and CAS mechanisms are reused.
  • Concurrency: query/statistics workers, refresh/event/replay threads and cache loaders were traced. Parent database -> names -> object guards and stripe/publication barriers reject stale observations and order ID updates. Remote handle/view reads precede guarded cleanup; detached removal and resource callbacks drain after enclosing guards. No new lock inversion was verified.
  • Lifecycle: exact registration identity protects replacements, including reinsertion and delayed cleanup. Close/currentness checks reject retired observations; deferred cleanup drains on failure and clears its ThreadLocal. Connector cache classes share the parent loader. C++ static initialization does not apply.
  • Configuration: no configuration item is added; existing cache, naming and session-bypass settings govern the new paths.
  • Compatibility: the annotated additive JSON boolean defaults false for legacy logs. Existing refresh records retain content-refresh behavior; the new factory records explicit lookup invalidation. SPI changes are documentation only, with no method-surface change.
  • Thrift/protobuf: no definitions changed.
  • Parallel paths: checked warm/cold database and table replay, modes 0/1/2, named/numeric lookup, ordinary writes/events, schema/MVCC probes, views and the separate system-table resolver. No additional defect was verified.
  • Conditions: retained names/object/database and publication checks have concrete refresh/replacement races to guard. Live view existence prevents an expected missing table handle from evicting a healthy view. ES and Paimon lookup failures now propagate; the other connector absence probes were traced.
  • Test coverage: added latch/barrier tests exercise delayed missing responses, replacement database/catalog/table, exact-key replacement, bulk/single load fencing, ID publication and cleanup failure. Negative cases cover lookup errors, views, case modes and bypass sessions.
  • Expected results: the Hive output names, schemas, empty listing and expected-error flow agree with the Groovy sequence. Output generation and author-reported test/build results were not reproduced by this static review.
  • Observability: existing refresh/error logs identify affected objects; cache counters remain associated with synchronous cleanup. No additional observability requirement was substantiated.
  • Persistence and failover: explicit refresh writes ExternalObjectLog and OP_REFRESH_EXTERNAL_TABLE dispatches to matching replay branches without synchronous replay-time remote loads. Automatic missing-table repair changes local ephemeral cache state. No transaction persistence change was introduced.
  • Writes and crash behavior: ordinary committed mutations keep narrow content refresh and their existing log-before-fallible-invalidation path. Cache object/ID publication is guarded; no new persisted-data atomicity issue was verified.
  • FE/BE variables: none added; no serialization/send-site change is required.
  • Performance: healthy lookups add bounded local observation work; broader database invalidation in case-folding modes intentionally clears ambiguous historical spellings. Expensive physical cleanup is deferred beyond observation guards. No performance defect was established; no benchmark was run.
  • Core invariants and other issues: no new data-visibility/error-handling violation was verified in the reviewed paths. BE visible versions, delete bitmaps and native memory tracking are unchanged. The final recheck found no additional actionable issue.

User focus: none was supplied beyond whole-PR review. Intended boundary: automatic missing-table cleanup requires a retained matching names snapshot and does not evict shared caches for schema-bypass sessions. Validation limit: source and test inspection only; no builds, tests, live-cluster execution or runtime performance validation were performed.

Review converged after 2 round(s).

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 88.57% (93/105) 🎉
Increment coverage report
Complete coverage report

### What problem does this PR solve?

Issue Number: None

Problem Summary: Connector table tests used real table methods on mocks without an ExternalDatabase. The table lookup observer now requires that database, so 15 FE unit tests failed with a null pointer. Give the affected test fixtures a database mock that returns no cache observation, matching the supported lookup path while keeping the test focus on connector behavior.

### Release note

None

### Check List (For Author)

- Test: Unit Test (PluginDrivenExternalTableTest, 47 tests passed)
- Behavior changed: No
- Does this need documentation: No
@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

@924060929

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 PR #69501 at 738c1a7: two new P2 findings. A delayed missing-table response is not fenced by an ordinary metadata refresh, and the Paimon assertion rewrite leaves two imports that fail the mandatory Checkstyle gate. No new or existing P0/P1 finding was confirmed.

Critical checkpoint conclusions:

  1. Goal and proof: explicit refresh now replaces lookup identity and missing observations repair retained lookup state. The ordinary-refresh race in the inline finding still violates stale-response protection; its interleaving lacks a regression test.
  2. Scope and reuse: changes are focused on lookup invalidation and absence/error semantics, using shared observation and invalidation helpers. No unnecessary connector-specific engine branch found.
  3. Concurrency and locks: query/schema/MVCC and background loaders race with refresh/replay/events. Catalog -> database entry -> names -> object ordering and the publication/index barriers were traced. Remote reads precede guarded mutation and resource callbacks are deferred until hierarchy locks exit. External tables inherit no-op TableIf locks, allowing the reported query/ALTER race. No additional lock-order defect found.
  4. Lifecycle: exact retained registrations, initialized/catalog identity checks and detached ownership fence replaced objects/catalogs/databases and protect new values during old cleanup. Cleanup drains after failures; timestamp initialization covers replacement objects. Metadata-only refresh needs the extra fence described inline; no static ownership cycle found.
  5. Configuration: none added. Existing naming modes 0/1/2 and shared-cache bypass paths reviewed.
  6. Compatibility: ExternalObjectLog adds a Gson boolean defaulting false for old records; the existing log opcode remains. SPI change is documentation only; no changed method symbols or durable table storage format.
  7. Thrift/protobuf: unchanged; branch field-ID checks are inapplicable.
  8. Parallel paths: reviewed explicit versus mutation/event refresh, warm/cold database/table replay, numeric/named lookup, naming modes, views, synthetic tables, session bypass, schema/MVCC/statistics and write-handle callers.
  9. Conditional/error paths: absence requires empty table handle and false live view existence; ES/Paimon failures now propagate. Retained membership/object/catalog checks are concrete, but do not detect the reported content refresh.
  10. Test coverage: inspected new deterministic race, replacement, failure, view, naming, replay, timestamp and sibling-retention tests plus the Hive regression. The ordinary-refresh stale-response interleaving is missing; the Paimon unused imports prevent normal validation.
  11. Expected results: added Hive schema/name output matches the scripted transitions, with ordered table listings. Output-generation provenance and runtime behavior were not independently verified.
  12. Observability: existing identifier-bearing refresh/error logs and cache counters remain applicable. No additional logging/metric defect found.
  13. Persistence/failover: explicit lookup invalidation is persisted through OP_REFRESH_EXTERNAL_TABLE and replayed in warm/cold branches; mutation logging remains before fallible refresh. No synchronous remote load added to replay; no transaction protocol change.
  14. Data writes and crashes: no new remote write/transaction logic. Cache reconstruction remains source-driven; no new committed-data loss or crash leak was identified.
  15. FE/BE propagation: no new variables or wire send paths.
  16. Performance: captures are cache-only; view existence is probed only for an empty handle. Full database invalidation is confined to explicit folding modes; the stale response inline finding causes unnecessary enumeration and cache rebuilding after content refresh.
  17. Further recheck: revisited all changed paths, actual query/ALTER concurrency, generation guards, cleanup exceptions, imports/build configuration and duplicate relationships. No additional verified finding.

Existing threads independently rechecked: bulk ID cleanup (4356099602), numeric ID publication (4356914860), replacement UPDATE_TIME (4356914864), mode-1 historical remote spellings (4356914869), and healthy Iceberg views (4357858293) have their concrete fixes present at this head. They are not reposted. All supplied originals are P2, so existing_blocking_comment_ids is empty.

User focus: no additional focus was supplied. Coverage limits: static inspection only, as required; no builds, tests, BE execution or external-service validation was performed. No unresolved candidate or uncovered changed-file scope remains after the final reviewer pass.

Review converged after 2 round(s).

!= extCatalog) {
return;
}
database.runIfCurrent(() -> membership.invalidateIfCurrent(() ->

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.

[P2] Fence missing observations across metadata-only refreshes

These registrations stay current across refreshTableInternal(..., false). With warm Iceberg names/object caches, let query A receive a delayed missing-table response during an external drop, recreate the same table, then successfully run ALTER TABLE t ADD COLUMN through Doris and reload its schema. afterExternalDdl refreshes connector/schema metadata while retaining the same FE database, names and object registrations. When A resumes, all three guards still pass (viewExists is false for a base table), so it evicts the freshly refreshed metadata, current table object/ID and entire names snapshot. Numeric lookups then fail until name lookup repairs the ID, and listings must enumerate the database again. External table locks are no-ops, so the query/ALTER overlap is possible. Advance/check a metadata-refresh generation while preserving ordinary-write name/object retention, and cover a delayed miss spanning that refresh.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in bee0566. Metadata-only refresh now advances a transient generation on the retained table object. Missing-table cleanup compares the captured generation while holding the same catalog monitor used to advance it, so a delayed missing response cannot evict metadata refreshed after its lookup began. Added a delayed-miss/metadata-refresh interleaving test that verifies the schema, name snapshot, object, ID, and connector cache remain intact. The scoped FE tests pass.

ctx.failAuth = true;
Optional<ConnectorTableHandle> result = metadata(ops, ctx).getTableHandle(null, "db1", "t1");
Assertions.assertFalse(result.isPresent());
Assertions.assertThrows(DorisConnectorException.class,

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.

[P2] Remove the imports made obsolete by this assertion

Replacing the Optional<ConnectorTableHandle> local removes the last uses of both ConnectorTableHandle and java.util.Optional, but their imports at lines 21 and 34 remain. The inherited Maven Checkstyle execution runs during validate, includes test sources and enables UnusedImports with failure on errors, so normal Paimon/FE validation now fails before tests run. Remove both imports alongside this change.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in bee0566. Removed the unused ConnectorTableHandle and Optional imports. The Paimon read-auth test class passes (12 tests), and the Maven Checkstyle validation completed successfully.

### What problem does this PR solve?

Issue Number: None

Problem Summary: A missing-table response started before an ordinary metadata refresh could still evict the refreshed schema, table object, ID, and name snapshot because the refresh intentionally retained the same object registration. Advance a transient per-table metadata generation before refresh invalidation and compare it during guarded missing-table cleanup under the same catalog monitor. A delayed miss now leaves the current refreshed metadata intact. Also remove two unused Paimon test imports that failed Checkstyle.

### Release note

None

### Check List (For Author)

- Test: Unit Test (97 tests across PluginDrivenMissingTableTest, PluginDrivenExternalTableTest, RefreshManagerTest, and PaimonConnectorMetadataReadAuthTest; Maven Checkstyle)
- Behavior changed: Yes (stale missing-table responses no longer evict metadata refreshed after their lookup began)
- Does this need documentation: No
@924060929

Copy link
Copy Markdown
Contributor Author

run buildall

@924060929

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.

Reviewed all 28 changed paths at bee0566. Two verified P2 correctness findings remain in automatic missing-table repair: historical case-equivalent state can survive repair, and an in-flight lookup can republish an absent table object/ID. Both are inline. No new or independently confirmed existing P0/P1 finding was identified.

The seven existing P2 threads were rechecked: obsolete Paimon imports, metadata-only refresh generation, healthy views, explicit-refresh historical spellings, replacement timestamps, numeric ID publication and bulk ID cleanup are fixed for their reported scenarios. The new automatic-path findings are distinct; those existing comments are not duplicated. There was no additional user-provided review focus.

Reviewed flows: REFRESH TABLE -> connector invalidation -> FE lookup invalidation -> engine/row-count invalidation -> journal/replay; query/schema/MVCC -> retained observations -> live handle/view probe -> guarded cleanup -> deferred resource release; named/numeric lookup -> object and ID publication.

Critical checkpoint conclusions:

  1. Goal and evidence: explicit refresh now reloads lookup membership/identity, ordinary mutations retain identity, and confirmed absence repairs caches. Added tests cover the primary flows; the two inline cases remain gaps in automatic repair.
  2. Scope and clarity: production changes and shared cache primitives are focused on external metadata refresh and lookup lifecycle; supporting tests exercise those changes.
  3. Concurrency: SQL queries, row-count/cache workers, refresh/DDL/events and replay can overlap. Checked catalog monitor, stripes, object/registry publication gates and index ordering. Remote probes and resource release are outside the guarded commit; the second finding identifies an incomplete names/object publication boundary. No additional reachable deadlock was established.
  4. Lifecycle: exact registration/generation checks reject refreshed or replaced catalog/database/table state. Deferred cleanup preserves replacement ownership, drains on failure and clears its shared ThreadLocal; current connector loader policy keeps that context parent-owned. No new thread or static initialization dependency was found.
  5. Configuration: no configuration item is added. Existing name-miss refresh, case modes and independent expiry/TTL settings are relevant to the findings.
  6. Compatibility: the journal boolean is additive, absent old fields default false, and the metadata-refresh generation is transient. No plugin SPI signature or FE-BE wire/storage format changes were found.
  7. Thrift/protobuf: no definitions changed.
  8. Parallel paths: reviewed explicit/ordinary/event/post-DDL refresh, warm/cold database/table replay, named/numeric lookup, modes 0/1/2 and mappings, ten connector implementations, views/system tables, MVCC and session bypass. Automatic cleanup differs from the broader explicit-refresh path as described inline.
  9. Conditional checks: initialization, catalog identity, exact membership, registration, generation and session-bypass guards match concrete replacement/stale-response cases. The live view check protects healthy SDK views.
  10. Test coverage: inspected cache, ES/Paimon, FE refresh/lookup/missing-table tests and Hive regression. Failure propagation, failed cleanup, replacement objects/databases/catalogs, metadata-only refresh, numeric publication and latch-controlled races are covered in source; historical-name reuse and the second finding's interleaving are not.
  11. Test results: the added Hive output is consistent with its ordered listings and schema statements by inspection. Runtime correctness and generation provenance were not independently verified.
  12. Observability: existing cache metrics and refresh/error messages retain relevant catalog/database/table context; ES/Paimon now propagate contextual failures. No separate observability defect was established.
  13. Persistence and failover: explicit lookup invalidation is logged and honored by warm/cold replay; ordinary committed-mutation logging remains before fallible local refresh. No additional persistence discrepancy was found.
  14. Writes and crashes: this changes local cache invalidation, not remote transaction commit protocols. Reviewed failure cleanup and retained ownership; the two findings concern stale identity/metadata, without an additional durability issue established.
  15. FE-BE variables: none added.
  16. Performance: observations use retained entries and bounded local guards, physical cleanup is deferred, and broader explicit case-mode invalidation is intentional. No additional substantiated performance issue was found.
  17. Other issues and limits: the final missed-issue recheck covered the complete changed-file set and all risk/candidate dispositions. No unresolved candidate or unreviewed changed path remains. This was static review only: no builds, unit/regression tests or BE execution were run.

Review converged in two rounds on this unchanged finding set. Please address both inline P2 findings.

Review converged after 2 round(s).

ExternalDatabase<?> database = getDb();
Optional<Runnable> observation = database.observeTableLookup(this, () -> {
try {
connector.invalidateTable(db.getRemoteName(), getRemoteName());

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.

[P2] Clear historical spellings during automatic missing-table repair

With lower_case_table_names=2, warm Foo, externally replace it with FOO, and let a names-only refresh discover FOO (for example, a name-miss lookup for a newly created sibling). The old Foo object/schema and connector entries remain cached while foo resolves to FOO. If FOO is externally replaced by a new Foo, an ordinary query through FOO gets an empty handle and runs this callback, which invalidates only FOO; observeTableLookup also removes only that object/ID. The next names reload maps foo to Foo and can reuse the first incarnation's FE object/schema and Iceberg table/snapshot caches, serving stale metadata/data after automatic repair. Mode 1 can retain historical connector keys here too. Apply case-aware domain invalidation to automatic cleanup while preserving observation fencing, and cover the historical-spelling reuse sequence. This is a separate instance from the earlier explicit-REFRESH finding: this automatic callback never runs that now-broadened refresh path.

!= extCatalog) {
return;
}
database.runIfCurrent(() -> membership.invalidateIfCurrent(() ->

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.

[P2] Fence object loads until missing-table names are removed

An ExternalRowCountCache worker can pass getTableNullable(long) initialization and capture the table name, then pause. Here the inner object.invalidateIfCurrent removes the object and releases its stripe/gates before the outer membership.invalidateIfCurrent finally invalidates names. If the worker resumes in that gap, it acquires a fresh table-publication lease and buildTableForInit accepts the table from the still-current names; its capability check can then block on the catalog monitor until this cleanup finishes. It subsequently publishes a replacement object and ID because the later names invalidation belongs to another cache owner and does not fence that lease. The dropped table is therefore cached/indexed again after confirmed-missing repair; subsequent observations skip cleanup once names no longer include it. Keep object publication fenced through retirement of the names snapshot, and add a deterministic numeric-lookup interleaving test.

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 89.38% (101/113) 🎉
Increment coverage report
Complete coverage report

@hello-stephen

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

------ Round 1 ----------------------------------
============================================
q1	17602	5500	5070	5070
q2	2105	345	253	253
q3	10222	1409	831	831
q4	4675	463	346	346
q5	7444	785	518	518
q6	181	180	151	151
q7	754	793	604	604
q8	9257	1390	1084	1084
q9	5484	4204	4200	4200
q10	6823	1289	1028	1028
q11	432	249	225	225
q12	633	395	283	283
q13	18098	4024	3012	3012
q14	273	280	242	242
q15	q16	727	697	659	659
q17	1199	749	586	586
q18	7017	6178	6126	6126
q19	1135	957	596	596
q20	383	337	229	229
q21	5687	2407	2604	2407
q22	385	332	284	284
Total cold run time: 100516 ms
Total hot run time: 28734 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5957	5943	6149	5943
q2	751	591	600	591
q3	5586	5777	5284	5284
q4	2034	2122	1592	1592
q5	5735	5696	5629	5629
q6	239	190	143	143
q7	2186	1987	1818	1818
q8	2980	2635	2634	2634
q9	7930	8002	7655	7655
q10	3625	3580	3161	3161
q11	573	426	376	376
q12	673	680	512	512
q13	3303	3653	3028	3028
q14	281	295	274	274
q15	q16	662	674	620	620
q17	7736	7015	6906	6906
q18	12979	12187	12851	12187
q19	907	781	783	781
q20	2139	2164	1925	1925
q21	5607	4610	4693	4610
q22	497	452	426	426
Total cold run time: 72380 ms
Total hot run time: 66095 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 150809 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 bee05669e8b933c5efb4c3cb2464e6b0db01ec76, data reload: false

query5	4311	589	444	444
query6	426	199	188	188
query7	4792	428	229	229
query8	318	175	153	153
query9	8775	3079	3118	3079
query10	479	299	256	256
query11	6051	3859	3608	3608
query12	142	95	89	89
query13	1265	465	318	318
query14	6141	3922	3638	3638
query14_1	3427	3449	3415	3415
query15	212	193	186	186
query16	963	485	422	422
query17	826	643	513	513
query18	2398	416	302	302
query19	184	156	141	141
query20	84	81	81	81
query21	206	121	108	108
query22	13028	12936	12842	12842
query23	13586	12920	12430	12430
query23_1	12466	12590	12488	12488
query24	7353	804	451	451
query24_1	467	459	456	456
query25	509	406	345	345
query26	1262	261	136	136
query27	2770	436	275	275
query28	4640	1952	1937	1937
query29	1538	573	425	425
query30	303	225	186	186
query31	996	926	810	810
query32	149	90	91	90
query33	502	289	229	229
query34	897	844	495	495
query35	729	764	658	658
query36	811	827	753	753
query37	126	101	83	83
query38	1772	1715	1688	1688
query39	792	785	744	744
query39_1	722	725	740	725
query40	218	119	99	99
query41	71	67	68	67
query42	85	83	83	83
query43	350	358	316	316
query44	1319	680	688	680
query45	173	180	169	169
query46	835	958	578	578
query47	2840	3028	2934	2934
query48	296	321	227	227
query49	598	401	298	298
query50	680	282	212	212
query51	10675	10470	10426	10426
query52	89	80	72	72
query53	188	219	153	153
query54	251	201	201	201
query55	78	71	71	71
query56	256	219	221	219
query57	1690	1640	1540	1540
query58	303	268	269	268
query59	2125	2104	1985	1985
query60	315	258	237	237
query61	165	160	159	159
query62	388	341	314	314
query63	189	159	166	159
query64	2817	1089	743	743
query65	3372	3277	3261	3261
query66	1767	406	299	299
query67	20057	20224	19900	19900
query68	3005	1016	608	608
query69	378	269	242	242
query70	828	759	769	759
query71	293	241	213	213
query72	2746	2619	2201	2201
query73	514	546	296	296
query74	4658	4522	4332	4332
query75	2319	2289	1948	1948
query76	2315	1006	589	589
query77	343	361	252	252
query78	9846	9749	9263	9263
query79	1017	848	516	516
query80	1314	412	327	327
query81	588	310	270	270
query82	936	128	100	100
query83	294	192	176	176
query84	309	121	102	102
query85	987	420	369	369
query86	398	241	232	232
query87	1994	1934	1791	1791
query88	3642	2666	2649	2649
query89	322	287	239	239
query90	1881	164	162	162
query91	163	147	123	123
query92	97	91	92	91
query93	1075	992	583	583
query94	643	297	275	275
query95	575	342	299	299
query96	656	478	237	237
query97	2441	2436	2316	2316
query98	158	151	160	151
query99	769	766	642	642
Total cold run time: 235826 ms
Total hot run time: 150809 ms

@hello-stephen

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

query1	0.01	0.01	0.01
query2	0.09	0.05	0.05
query3	0.27	0.09	0.08
query4	1.61	0.08	0.09
query5	0.23	0.21	0.24
query6	1.17	0.69	0.68
query7	0.04	0.01	0.01
query8	0.06	0.04	0.04
query9	0.40	0.35	0.36
query10	0.56	0.57	0.57
query11	0.19	0.14	0.15
query12	0.19	0.14	0.14
query13	0.49	0.50	0.50
query14	1.03	1.02	1.02
query15	0.63	0.62	0.59
query16	0.33	0.36	0.31
query17	1.13	1.11	1.12
query18	0.20	0.19	0.19
query19	2.06	2.02	2.03
query20	0.02	0.01	0.01
query21	15.50	0.22	0.14
query22	4.79	0.05	0.06
query23	16.29	0.33	0.13
query24	3.11	0.59	0.38
query25	0.10	0.07	0.06
query26	1.17	0.21	0.16
query27	0.04	0.05	0.04
query28	2.66	0.78	0.37
query29	12.51	4.09	3.24
query30	0.28	0.13	0.11
query31	2.77	0.55	0.32
query32	3.22	0.60	0.52
query33	3.19	3.20	3.16
query34	15.16	3.99	3.37
query35	3.32	3.31	3.36
query36	0.57	0.50	0.41
query37	0.10	0.06	0.06
query38	0.05	0.03	0.04
query39	0.04	0.03	0.02
query40	0.17	0.15	0.14
query41	0.09	0.03	0.03
query42	0.04	0.03	0.03
query43	0.05	0.04	0.03
Total cold run time: 95.93 s
Total hot run time: 24.22 s

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 71.68% (81/113) 🎉
Increment coverage report
Complete coverage report

2 similar comments
@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 71.68% (81/113) 🎉
Increment coverage report
Complete coverage report

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 71.68% (81/113) 🎉
Increment coverage report
Complete coverage report

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants