Overview
Apache Doris 4.0.8 is a maintenance release in the 4.0 series. It focuses on compute-storage decoupled deployments, load and transaction stability, File Cache behavior, security hardening of internal endpoints, and Lakehouse compatibility. All 4.0.x users are advised to upgrade.
Highlights of this release include:
- Security hardening: authentication and a configuration gate for the BE
_stream_load_forwardendpoint, an internal auth token for FE meta-service HTTP calls, auth checks on manager REST APIs, and masking of Kafka Routine Load credentials. - Cloud enhancements: rendezvous hashing for colocate tablet placement, snapshot reads of the table version to avoid transaction conflicts, a bthread-aware tablet header lock, and a new mode that writes only index content into File Cache.
- Upgrade behavior: clusters upgrading from 3.x now enable the Nereids distribute planner instead of silently keeping the legacy one.
- Many correctness and stability fixes covering Group Commit, transactions, Routine Load, Paimon and Iceberg reads, File Cache, memory tracking, and several BE crash and deadlock paths.
Before upgrading, read the Behavior Changes section below.
Behavior Changes
- Upgrading to 4.0 now enables the Nereids distribute planner. A cluster whose variable version is below 400 previously restored a persisted
enable_nereids_distribute_planner=falsefrom its image and kept using the legacy distribute planner after the upgrade; the variable-version-400 migration now enables it (#66604). - Compaction is no longer paused on high memory by default. Pausing made high-Compaction-Score tablets harder to merge, which reinforced the metadata and memory backlog it was meant to relieve (#61288).
- The BE
_stream_load_forwardendpoint is now registered only when the new BE configurationenable_group_commit_streamload_be_forwardis enabled (defaultfalse), and it now requires authentication. Deployments that rely on Group Commit Stream Load forwarding must enable the configuration on both FE and BE (#64935). autobucket_min_bucketsnow defaults to 3 instead of 1, so the auto bucket strategy no longer computes a bucket count too small for reasonable parallelism and data distribution (#63729).- The Recycler no longer enables
enable_mark_delete_rowset_before_recycleorenable_abort_txn_and_job_for_delete_rowset_before_recycleby default, because the feature currently carries a performance cost (#66150). - S3
SlowDownretry handling is configurable again and now differs by role: rate-limited retries remain enabled for BE clients and are disabled for the Recycler, refining the change made in 4.0.7 (#65508). - The unused session variable
plan_nereids_dumphas been removed. It only applied to minidump replay and is now an internal flag set byMinidumpUtils, soPLAY '<dumpfile>'continues to work (#66371). - In Cloud mode, tablet data size is consistently reported as remote size, so
SHOW TABLETSandinformation_schema.partitionsno longer diverge frominformation_schema.backend_tablets(#60887). - In Cloud mode,
SHOW PROC '/colocation_group/{GroupId}'now reportsReplicaAllocationasNULL, andSHOW PROC '/cluster_health/tablet_health'no longer reportsUNRECOVERABLEbecause of local-mode health checks (#60944).
New Features & Improvements
Compute-Storage Decoupling
- Support writing only index content into File Cache through the new BE configuration
enable_file_cache_write_index_file_only(defaultfalse). Rowset writes and Compaction outputs then protect Inverted Index files and Segment index and footer ranges, instead of polluting a limited local cache with large data pages (#64995). - Use rendezvous hashing for colocate tablet placement (#64638).
- Add an option to skip File Cache writes during TopN lazy materialization (#65021).
- Use snapshot reads for the table-version hint in
commit_txn,commit_partition,commit_indexanddrop_partition, removing the read-conflict range that made concurrent commits on the same table fail withKV_TXN_CONFLICT(#64647). - Increase the get-version timeout to 30 seconds (#65625).
- Support multiple configuration files in
start.sh(#63924). - Add an HTTP API to synchronize and export Cloud FE metadata, allowing metadata backup across FE and FDB (#60739).
Security & Access Control
- Add
fe_meta_auth_tokenfor FE meta-service internal HTTP authentication (#65551). - Add auth checks for the manager node and query-error REST APIs (#65042).
- Mask sensitive Kafka properties of Routine Load jobs (#64786).
- Reset
skipAuthon allINSERT OVERWRITEexit paths (#66383).
Observability & Operations
- Show the first error message of a Routine Load job (#65553).
- Record the task finish time when a scheduled job execution fails (#66232).
- Add a virtual compute group switch metric (#63036).
- Add queue time for delete bitmap tasks (#65248).
- Show warm-up timestamps with the date (#64606).
- Report the root cause of a failed Iceberg metadata commit instead of the misleading
Self-suppression not permittedmessage (#66417). - Stop wrapping data and expression errors in a misleading "storage reader" message (#64755).
- Upgrade third-party dependencies (#62858, #64196, #64208).
Performance
- Optimize the
information_schema.tablesstatus scan for large OLAP tables: BE now passes the required columns to FE, so lightweight queries no longer pay for tablet-derived status fields (#64933). - Push down expandable S3 glob prefixes (#64684).
- Speed up the File Cache LRU restore path during BE startup (#65174).
- Cache the credentials provider in
ConfigurationAWSCredentialsProviderfor Glue catalogs (#65165). - Reuse a single Ranger Doris access controller, so a metadata checkpoint no longer leaks two
PolicyRefresherthreads (#65570).
Important Bug Fixes
Query Result Correctness
- Verify injectivity before
SimplifyAggGroupByrewrites aGROUP BYexpression (#64335). - Reject a mismatched compare plan in
PullUpJoinFromUnionAll(#65472). - Guard
UniqueFunctionin the filter and TopN pushdown rules (#62742). - Require the window function partition key chosen by the Partition TopN optimization to be a subset of the co-located keys (#64764).
- Fix missing precision and scale when reading legacy decimal data (#65419).
- Correct
from_base64andto_base64output buffer sizing and invalid input handling (#65141).
Load & Transactions
- Fix a lost row when a prepared statement reuses its plan and Group Commit shares one
load_id(#64362). - Avoid aborting a newer transaction that carries the same label (#64939).
- Fail fast when a Backend restarts during an INSERT (#65525).
- Handle generated columns in delete partial update (#64884).
- Fix Arrow Stream Load with uppercase column names (#65127).
- Support Compute Groups in FE Stream Load routing and planning (#65571).
- Skip decommissioning Backends when assigning load work (#65049).
- Let only load source scanners update load counters (#63781).
- Isolate schemas for CDC snapshot splits in streaming jobs (#65645).
Compute-Storage Decoupling
- Exclude decommissioning Backends from Cloud replica routing, Routine Load assignment, and Kafka proxy selection (#65221).
- Prevent urgent load from preempting the Schema Change lock (#66082).
- Use a bthread-aware shared mutex for the tablet header lock. The write lock can be held across a suspending warm-up call, and a migrating bthread would otherwise unlock a
pthread_rwlock_tfrom a different worker thread (#64574). - Temporarily set
version_cache_ttlto 0 when retrying a query that failed with -230 (#63721). - Inspect and abort failed conflicting transactions while
CloudUpgradeMgrwaits (#60830). - Preserve resource IDs when recycling empty Rowsets (#65862).
- Skip packed slice deletion while recycling Rowsets (#63295).
- Set
requestTimeoutMson the Recycler S3 client to avoid curl-28 errors on slowDeleteObjectscalls (#64758). - Make the S3 rate limiter configuration take effect dynamically in Cloud mode (#64554).
- Cancel rebuilt virtual compute group warm-up jobs when the group is dropped (#65426).
- Clear the warm-up error message after a successful retry (#64813).
- Fix the colocate replica allocation edit log (#65457).
- Resolve conflicting default replica properties, which could leave a stale
default.replication_numin table metadata and makeSHOW CREATE TABLEreport the wrong default allocation (#65836). - Fix a
SchemaVariablesScannercrash caused by an incomplete FE response (#65994).
File Cache & Storage
- Fix File Cache queue evict size metrics (#64897).
- Bound the LRU recorder shadow queue size (#64798).
- Handle asynchronous task submission failures in the S3 file writer (#64779).
Lakehouse & External Data Sources
- Preserve Paimon partition metadata across splits. Partition metadata was generated only when runtime partition pruning was enabled, so count, native and JNI splits reached BE without stable partition values, and the reused prune block was corrupted by inserted replacement columns (#65583).
- Use the split file format for Iceberg scans (#65760).
- Preserve external table column name case for Iceberg and Paimon (#65094).
- Support an IOManager for Paimon JNI reads, and add Paimon JNI scanner observability (#65332, #65354).
- Validate task executor scan handles (#65054).
- Fix an Avro JNI reader crash on a null pointer (#64699).
Memory & Stability
- Avoid a local Runtime Filter merge deadlock (#64866).
- Catch block serialization exceptions instead of letting BE core dump (#64852).
- Make secondary brpc package aliases non-owning, avoiding a double free during
brpc::Servershutdown (#65777). - Disable the SSL BIO buffer in brpc (#64962).
- Force a refresh of the Workload Group configuration when its memory limit changes (#65542).
- Update memory statistics more quickly when the user changes the cgroup limit directly (#65695).
Protocol & Observability
- Fix FE memory issues in Arrow Flight SQL: close the temporary
VectorSchemaRootincreatePreparedStatement(#65311), fix the remaining off-heap leaks (#66437), and keep the coordinator alive acrossGetFlightInfoandDoGetfor external table scans (#64799). - Serve
information_schema.routine_load_jobsfrom the master FE, soFIRST_ERROR_MSGandERROR_LOG_URLSare no longer empty when the query lands on a non-master FE (#65942). - Guard execution profile access with the profile manager read lock (#65353).
- Fix the queued task count reported by the time-sharing executor (#63568).
- Fix a
-parameterserror thrown by the node action REST API, caused by aPathVariableannotation without a declared value (#59708).
These notes focus on user-visible and operations-visible changes. Test-only commits, CI adjustments, external Docker environment work, release version updates, and purely internal changes without external symptoms are omitted. Refer to the complete 4.0.7 to 4.0.8-rc02 comparison for the full commit history.
Acknowledgments
Thanks to all contributors whose pull requests are included in this release:
@0AyanamiRei @924060929 @BiteTheDDDDt @bobhan1 @CalvinKirs @deardeng @freemandealer @Gabriel39 @gavinchou @GJ100 @heguanhui @hello-stephen @hubgeter @jacktengg @JNSimba @Jungzhang @liaoxin01 @luwei16 @morningman @Mryange @mymeiyi @shuke987 @sollhui @stevenpall @suxiaogang223 @w41ter @wyxxxcat @xylaaaaa @yiguolei @yujun777 @zgxme @zhangstar333