4.0.16
Release Date: September 30, 2026
Behavior Changes
- The default HTTP client for the AWS SDK is switched from Poco back to the SDK's own client:
enable_poco_client_for_aws_sdknow defaults tofalse. Set it totrueto restore the previous behavior. #78375 - jemalloc's dedicated oversize arena is enabled by default, so large allocations no longer land in the per-CPU arena of the calling thread. This improves reuse of large buffers and reduces fragmentation, and changes how BE and CN memory is distributed across arenas. #78396
- A shared-data transaction whose combined txn log was not fully written is now refused at commit instead of committing and then failing publish forever with
txn log list does not contain txn log of tablet.replication_numno longer weakens the shared-data write quorum. #78162 - A shared-data partition now advances straight to the final version of a batch publish instead of through each intermediate version, so a query can no longer request an intermediate version that has no tablet metadata object, which surfaced as
The specified key does not exist. #79175 - A shared-data publish that keeps failing now backs off and throttles its retry logging instead of emitting the
previous publish version task has not finishedmessage on every attempt, which could dominate the FE leader's CPU and log volume during an incident. #79299 - A shared-data load cancelled by a user error now reports that error instead of the derived
AsyncDeltaWriter has been closed. #78632 - HDFS files are no longer
hsynced before they are closed. Thehsyncwas a workaround for a crash that a separate change had already fixed, and it forced anfsync()on every DataNode replica on each close. #78864 - A Parquet
null_countthat under-reports NULLs is no longer taken at face value during decoding and pruning. Files written by older parquet-mr versions previously returned corrupted values or dropped rows. #78329 - List partition pruning of
!=,NOT IN, andIS NOT NULLno longer discards a multi-value partition just because its value list also containsNULL. Queries on such a table, including joins that deriveIS NOT NULLon the join key, return the non-null rows that were previously lost. #78946 - Batch DDL can now build date range partitions that start at year
0000, which is a legalDATEvalue. Such a statement previously failed withthe range of the partition is invalid. #78746 - Serialized datetime partition bounds now keep their microseconds. An operator-precedence error previously added the fractional seconds to the shift distance instead of the shifted value, corrupting the bound and potentially blocking metadata replay. #78922
max_partitions_in_one_batchand the partition-number limit now count the partitions the request in hand is about to create. An oversized batch is rejected up front instead of being admitted and only failing the following batch. #79379- Streaming aggregation tuning is now driven by the group-by cardinality instead of the rows left after
HAVING, so a query whoseHAVINGclause filters most groups away no longer loses its local pre-aggregation. #79064 - Audit log rows now carry
scanBytes,scanRows,returnRows,cpuCostNs, andmemCostBytesfor DML that targets an external Iceberg or Hive table or theFILES()table function, and for asynchronous materialized-view refreshes. These fields previously reported0. #74072 #74954 - Internal queries issued while filling
information_schema.materialized_viewsandSHOW MATERIALIZED VIEWSare now bounded by the outer statement'squery_timeoutinstead ofstatistic_collect_query_timeout(default one hour), so such a statement can no longer hang far past its own timeout. #77585 - SQL blacklist verification no longer holds a global read lock while matching, so an expensive pattern or a concurrent
ADD/DELETE SQLBLACKLISTno longer stalls every query at the SQL entry point. #78476 paimon.option.cache-enabled = falsedisables the Paimon metadata cache again. #78271- The background metadata refresh for a Paimon catalog now visits only tables that were recently accessed and have changed, instead of enumerating and reloading the whole warehouse every cycle. A table that StarRocks has never queried is no longer refreshed. #78057
- A
VARCHARcolumn of a Paimon table now reports the length declared in the Paimon schema instead of an incorrect one. #68383 ALTER TABLE ... RENAMEon an Iceberg REST catalog no longer fails with aNullPointerException. #76498- Reading the
$partitionsmetadata table of an Iceberg table with aDECIMALpartition field, or with a nulltimestamptzpartition value, no longer fails with aNullPointerException. #77742 - A table with many stale partitions no longer reports a statistics health pinned near
1.0, so auto-ANALYZE is triggered when it should be. Tables that were previously considered healthy may now be re-analyzed. #76927 - A column whose name contains a special character such as
#no longer fails the low-cardinality dictionary collection query with aParsingException; the generated alias is quoted. #77132 - A
GROUPING SETSaggregation joined to another one on its group-by keys no longer fails at planning withno executable plan for this sql. #77296 encode_sort_keynow expands a constant argument once per row instead of writing the single stored element into every row buffer. #77847- A statement forwarded to the Leader FE now keeps its original SQL text in the audit log and the query profile, instead of a form rebuilt from the AST. #77982
- A connection ID that wraps the 24-bit per-FE counter no longer collides with a live connection, which previously hid the older session and drifted the global and per-user connection accounting. #78217
- A column that is missing from the tablet schema no longer aborts the BE during predicate push-down; the predicate is simply not pushed down. #79234
- When
OlapTableSinkinitialization fails, the partially initialized sink is no longer taken through the full close path, which could dereference state that was never created and abort the BE. The original initialization error is returned instead. #79370 - Short key index page geometry is now validated without 32-bit overflow, so a corrupted page footer is rejected instead of wrapping and causing a heap out-of-bounds write. #79048
- An HTTPS request whose TLS handshake times out is no longer treated as connected and retried on the same socket. A stalled request now fails after approximately one timeout instead of
connect_timeoutplus two receive timeouts. #79369 - An expression returning
ARRAYorSTRUCTover a low-cardinality column is no longer rewritten to operate on dictionary ids, which crashed the BE at fragment prepare. #78488 starrocks_fe_max_tablet_compaction_scoreis reported correctly on a shared-nothing cluster after an FE restart; the activeget_tablets_inforesponse now carries the maximum tablet compaction score. #78496- FE feature log files are written under
feature_log_dirinstead of the general log directory. #77221 be.confandfe.confentries on a last line without a trailing newline are now read instead of silently dropped. #78065
Improvements
- Supported Fast Schema Evolution for materialized views. #67915
- Extended the grouping-sets push-down rule to
AVGandCOUNT, in addition toMAX,MIN, andSUM, which speeds upROLLUP,CUBE, andGROUPING SETSqueries with more than three levels. #77832 - Removed the process-wide lock in front of the lake segment metadata cache, leaving the sharded LRU cache to do its own locking. #78260
- Compaction and replication now drop the never-read
delete_predicatewhen they archive a rowset intocompaction_inputs, which reclaims tablet-metadata bloat at its source in shared-data clusters. #76870 - Added server-level spill metrics that aggregate spill activity across all spillable operators, broken down by local and remote storage backend. #71827
- Added the leader-FE gauge
max_journal_replay_lag, which reports how far the furthest-behind follower or observer trails the leader in replayed journal ids. #78382 - The jemalloc runtime options a BE or CN was started with are now visible through the
jemalloc_confconfiguration item, and its mutable options such asdirty_decay_msandmuzzy_decay_mscan be changed at runtime without a restart. #75344 #78333 - Extended jemalloc observability: added dirty and muzzy page metrics, broke the metadata total down into extent metadata and the rtree, dumped
stats.mappedandstats.retainedinbe.INFO, and let/memztake jemalloc's own statistics options so the per-arena section and the extent size-class breakdown are reachable from a running BE. #78159 #78225 #78320 #79090 - On arm64, a 4K-page jemalloc variant is built alongside the 64K one and selected at runtime, which avoids the memory overhead of 64K page granularity on the common 4K-page kernels. The jemalloc libraries now live in dedicated directories selected through
LD_LIBRARY_PATHinstead of runtime symlink manipulation. #77886 #67667
Bug Fixes
The following issues have been fixed:
SHOW PROFILELIST,ANALYZE PROFILE,get_query_profile(), and/api/profilereturned every cached profile, including other users' SQL text and plans, to any authenticated user. The new FE configurationauthorization_enable_query_profile_access_checkrestricts a cached profile to the user who ran the query and to holders ofSYSTEM OPERATE. #79375- In Ranger mode, the column privilege check mishandled views and materialized views over external tables. #56316
- Addressed security vulnerabilities (CVE): upgraded Apache Ranger to 2.9.0 and Bouncy Castle to 1.85, Apache HttpClient5 to 5.6.4 and HttpCore to 5.4.3, Netty to 4.1.137.Final, ZooKeeper to 3.8.7 and 3.9.6, the broker's Tomcat to 9.0.121 and its commons-lang3 to 3.20.0, and aligned all
io.grpcartifacts throughgrpc-bom. Test-scope jars are no longer shipped in the java-extensions reader lib directories. #79331 #79538 #77753 #78287 #79707 #79719 #77748 #77171 #77752 - Upgraded StarOS, starlet, and starcache to v4.0.8. #79478 #77717
- The authorization check,
INSERTplanning, view expansion, the privilege check,inspect_mv_refresh_info, andFILES()schema inference forCREATE TABLE AS SELECTall made external-catalog round trips while holding an FE metadata lock, so a slow metastore stalled every DDL waiting on the same lock. Those calls now happen outside the lock. #79319 #79226 #78772 PlannerMetaLockerunlocked metadata it had never successfully locked whenlock()failed part way through. #74041FULL OUTER JOIN ... USING (c1, c2, ...)returned the wrong values: the firstUSINGcolumn was correct and every later one carried the previous column's value. AddingORDER BY <ordinal>to the same query failed with anIndexOutOfBoundsException. #79298- A
HAVINGpredicate was lost whenGROUPING SETS,ROLLUP, orCUBEwas rewritten into a union, so the query returned rows it was supposed to filter out. #79415 GROUP BY ROLLUP(a, b, a), andCUBEorGROUPING SETSnaming a column twice within one set, produced a grouping set that carried the same key twice. #78261- Removing the aggregation above an aggregate-key table dropped the query's
LIMITbefore it reached the storage layer, so the BE read the whole table. #79414 - Splitting an
ORjoin into a union lined up the branches inconsistently, because the union's output columns and the first branch were ordered by column id while the other branches followed the projection map's iteration order. #79473 - The skew-join rewrite replicated the preserved side of an outer join, so one input row could be returned several times and the result moved between runs. Salting is now skipped in that case. #79168
- A predicate under an
ORwhose branch was only partially covered by bitmap indexes was erased once its bitmap range had been applied, which produced false positives such as(a = 1 AND b = 2) OR (a = 2 AND b = 3)matching(a = 1, b = 3). #76275 - A column read only by a predicate inside an
ORsubtree was pruned from the read set after GIN inverted index filtering, so the surviving predicate evaluated against a column that was never read. #77659 - A predicate-free
COUNT(*)could be folded from tablet row counts that never covered the visible version, because the guard only checked that a collection cycle had finished, not that its RPCs had succeeded. #77190 SELECT DISTINCTover a window aggregate left dropped columns in a projection after the distinct push-down below the window. #77218- Ranking-window pre-aggregation was applied when the aggregate window and the rank-related window were not in the same sort group. #77068
- A window over an always-non-null aggregate such as
bitmap_union_count()lost its declared nullability, so aDISTINCTorGROUP BYover it failed witherror nullablel column. #79009 - An analytic frame starting at a
FOLLOWINGoffset dropped the current row. #77342 - A subquery in a window's
PARTITION BYorORDER BYclause failed to plan withslot type shouldn't be invalid. #77087 Analytor::prepare()filled its function list only at the very end, so an error part way through left the destructor reading past the end of an empty vector and killing the BE. #77758- A merge-phase aggregate re-appended an already-replaced constant argument, which shifted every following constant argument one slot to the right. #77069
count()over an array of decimal produced anINVALIDresult type and failed withslot type shouldn't be invalid. #77092- The
if()built for a multi-columncount(DISTINCT)lost its decimal type, so the BE received an expression typedDECIMAL(-1,-1)and aborted. #77346 - Common plan fusion skipped the
_ifcombinator fall-back check, andGROUP BYrules were applied to only some children of an expression, soSELECT max(s) LIKE s FROM tfailed withInvalid plan. #77099 corr,covar_pop, andcovar_sampcrashed the BE when the optimizer folded an argument into a constant after analysis. #77216percentile_contmerge tracked exhaustion by value instead of by position, which could abort the BE. #77261- A global dictionary was used for aggregate-state columns and their subfields were pruned, both of which aborted the BE on a failed down-cast. #77096 #77901
- A JSON subfield aggregate on an aggregate table failed with a raw
NullPointerException, because the synthetic subfield column has no aggregation type. #77952 CTEAnchorwas not pruned when its child was a value operator, which surfaced asMultiCastPlanFragment don't support return result. #64491- Duplicating a plan threw
ClassCastExceptionon everyLogicalLimit, because the duplicator treated a limit as a set operator. #77692 - UKFK constraints were collected conditionally during join reorder, so
enable_ukfk_join_reordercould fail with aNullPointerException. #77197 - Planning a query over a colocate table could fail with
Cannot invoke "PhysicalPropertySet.equals(Object)" because "enforcedProperty" is null, because colocate-group stability was re-evaluated while the optimizer ran. #77091 - A colocate
UNION,EXCEPT, orINTERSECTcould hang, because a branch whose source cannot local-shuffle stayed in the colocate execution group without a grouped exchange. #77025 - A non-positive ranking predicate was pushed into a TopN, which aborted the BE. #77445
- The global limit shared by parallel streaming-distinct instances truncated results incorrectly. #77086
DeferProjectAfterTopNRulematched a scan's access paths by column name instead of column id, so a renamed column lost its subfield pruning. #77987- An OLAP scan's complex type was narrowed even when the BE did not prune it by an access path, so downstream operators built columns from a type the BE never materialized. #77894
- Dead subfield slots pulled out of the scan by predicate expression reuse were not dropped, which aborted the BE. #77456
PruneComplexTypeUtildisabled complex-type subfield pruning for every column in the statement when it met a single expression it could not describe, such as aCASE WHENover a complex column. The bail-out is now scoped to the expression that caused it. #79181- Scan heavy-expression result columns were not normalized to the slot's nullability, which crashed the BE. #77242
- The query cache could serve an entry built below a
TOPN_FILTERthat aSortNodeproduced, and its digest did not cover the scan schema, an ASOF join's temporal condition, a join predicate's common sub-expressions, or an ANN search specification, so unrelated queries could collide. #77404 #77559 #77563 #77565 #77586 - The query cache crashed the BE when it reused a lane for a partitioned hash join, and hung when a lane's join had an empty build side. #77564 #77571
- A view scan's projection was dropped when a partially rewritten view-based materialized view rewrite replaced the scan back with its inlined plan. #77613
- A materialized view refresh on a Paimon base table performed a full scan because the partition predicate was not pushed down. #61813
REFRESH MATERIALIZED VIEW ... FORCEsilently refreshed nothing when the materialized view had apartition_retention_condition. #77671- The column min/max statistics cache was not invalidated by partition or schema DDL, so a stale entry could be served indefinitely. #77441
- Background auto-ANALYZE of an external table could fail with
primary key size exceed the limitwhen the catalog, database, and table names made the encodedtable_uuidprimary key exceed the BE limit. Thetable_uuidis now hashed. #75735 CancelableAnalyzeTask.cancel()could be won by more than one caller, because it read and wrote its state without an atomic compare-and-set. #78593- Hive-family catalogs failed outright when the metastore or AWS Glue denied permission to read column statistics; they now degrade to empty statistics. Glue column-statistics requests also carry
catalogId, so a cross-account deployment reads statistics from the configured catalog. #78455 #78461 - Elasticsearch external tables and Elasticsearch catalogs rejected clusters running version 8 or 9 with
Unsupported/Unknown ES Cluster version, and concurrent queries could overwrite each other's request URL parameters, which surfaced as unrelated analysis errors such asColumn 'id' cannot be resolved. #78267 #79391 - Predicates on a
DECIMALcolumn of a Paimon table were converted using the StarRocks type family's default precision and scale instead of the column's PaimonDecimalType, so the literal could not represent the value. #78760 - Table references inside a connector view were qualified incorrectly when the Iceberg view metadata recorded no
default-catalog, and when the view body referenced a CTE. #77887 - An Iceberg table whose metadata file is missing from storage could not be dropped, not even with
DROP TABLE IF EXISTS ... FORCE. #77786 ALTER TABLE ... EXECUTE rewrite_data_files() WHERE <filter>on an Iceberg table silently dropped rows when the filter did not align with partition boundaries. #77797- Azure Blob credential lookup failed when the endpoint was configured as a full URL, because the Hadoop configuration key embedded the scheme. Endpoints are now normalized to the filesystem authority. #78241
- The send and receive timeouts computed for an object-storage request were dropped when the pooled Poco session was reused, so only the connection timeout applied. #78361
- Querying a Parquet
DECIMALcolumn stored asFIXED_LEN_BYTE_ARRAYthrough a connector scan could return corrupted values and silently drop rows, non-deterministically between runs of the same query. #78685 - A corrupt
DELTA_BINARY_PACKEDpage header was thrown rather than returned, and sinceStatusis not an exception type nothing caught it. #77446 - Parquet decoder scratch buffers were sized as variable-length arrays on the stack, which a large data page could overflow. #77616
- A JSON path with an array index such as
'[0].value.url'threw a C++ exception for every row whose array was shorter than the index, which turned a large scan into a lock convoy inside the stack unwinder. The index is now bounds-checked. #78569 JsonColumn::appendread out of range and silently lost rows when flat-JSON schemas differed between segments. #77090- The JSON key column was not rebuilt when a set operation deserialized its keys, which aborted the BE. #77215
- Flat JSON vertical compaction in shared-data mode used more memory than necessary, because the merger retained the previous result column and the root metadata did not account for its children. #77682
- Nested
array_mapandarray_sortlambdas failed to plan or evaluate withInput dependency cols check failedorExpr evaluate meet error: slot_id N not found, because common sub expressions hoisted by an inner lambda escaped the scope that defined them. #78645 #78769 #78915 array_sort's lambda comparator could drive the sort out of bounds, and its comparator validation shared one errorStatusacross drivers, which could double-free it. #77687 #78314unnestandmulti_unnestread array offsets as signed 32-bit integers, so an offset of2^31or more came back negative and crashed the BE. #78480 #78479substr,left,lpad,rpad, andtranslatereturned bytes from neighboring rows, andlocatesearched past the end of a value, when the input ended in a truncated UTF-8 lead byte. #78722strposindexed out of bounds on anINT32_MINinstance argument. #77260timestampdiff(MONTH, ...),timestampdiff(YEAR, ...),months_diff, andyears_diffreturned-1instead of0when both arguments fell in the same month or year and the second was the earlier one. #79037DateValue::weekday()returned a negative index for an out-of-range Julian value, sotrunc_to_week()read before the start of its lookup table. #77310- The Teradata and Joda datetime parsers read past the end of the input string, which aborted the BE. #77098
generate_seriescrashed on a step count that cannot be represented, such asgenerate_series(0, -2147483648, -1). #77103- Constant arguments to
tokenizeandngram_searchthat crash the BE are now rejected. #77102 EXPLAINprinted the wrong number of dictionary keys for adictionary_getcall with multiple keys, because the key count was inferred from the number of children. #78706- A descending sort of an
ARRAY,MAP, orSTRUCTcolumn placed NULLs inconsistently, because the run-sort and run-merge phases applied opposite NULL conventions. #77679 EXCEPTandINTERSECTsized their serialization buffer from the widest row in the chunk, so a single fat row could ask the memory pool for hundreds of gigabytes. Keys are now serialized row by row in that case. #77821- A nested-loop join evaluated conjuncts on an empty chunk, and its null-aware anti join lost probe rows when a joined chunk had no matched rows, so
NOT INqueries silently dropped rows on a multi-BE cluster. #77344 #77970 - The BE read past the end of the output schema in
_switch_contextwhen a segment had to force-encode a string column to global dictionary ids. #77660 ALTER TABLEthat added an ordinary column and a generated column in one statement killed the BE on a table that already had data. #77436ALTER TABLE ... ADD COLUMNon an Aggregate table silently created a key column when neither an aggregate function nor theKEYkeyword was given, changing the grain the table aggregates on. Such a statement is now rejected as ambiguous. #78359PARTITION BY RANGE(<partition-function>())with an empty argument list raised a rawIndexOutOfBoundsExceptioninstead of a parse error. #75080USING GIN("IMP_LIB" = "builtin")was accepted byCREATE TABLEand then broke everyINSERTwithCan not get inverted imp type, because the property key reached the BE with its original casing. #77818- An unchecked
StatusOrunwrap turned a recoverable error into an exception that escaped into the pipeline, a child expression error aborted the BE instead of being propagated, and an exception escaping the Thrift processor aborted the BE. #77052 #77442 #78805 GroupedExecutionSinkOperator::push_chunkswallowed the status returned by the local exchanger, so spill failures and closed-exchanger states went unreported. #77737SystemMetrics::update()shared itsgetline()buffer across threads, which could double-free it. #71040- BE and CN could crash inside jemalloc with unrelated stacks, because
malloc_usable_sizeperformed a full thread-specific-data fetch; the heap profile toggle also wroteprof.thread_active_initandhas_enable_heap_profile()read the booleanprof.activenode into anint, so profiling was reported as disabled and later profiles were damaged. #77625 #78384 #78820 System.print()on a script's foreign objects printedinstance of <Class>instead of the object's text, because thetoStringbindings were registered as methods rather than getters. #78877- An FE dropped with
ALTER SYSTEM DROP FOLLOWERorDROP OBSERVERnever exited and became a zombie that held elections forever. #78215 TabletInvertedIndex.markTabletsForceDelete()resolved tablet backend ids while holding the index write lock, which could deadlock the FE against a replica deletion. #78102- The tablet scheduler threw a
NullPointerExceptionon a disk that reported no storage medium. #76966 - Dropping the auto-increment map waited on dead BEs and CNs, so the operation blocked for the full 60-second timeout whenever a registered node was down. #78561
PrepareCollectMetaTaskthrew aNullPointerExceptionwhen the optimizer had no query id, which happens when materialized-view plan contexts are built on their own thread pool. #77051- Removing a transaction from the dependency graph while its predecessors were still present corrupted the graph, so a later transaction on the same table could lose its dependency edge. #78077
- Three FE paths shipped a raw compute-node hostname to the BE instead of a resolved address, which made compute nodes resolve peer hostnames themselves and could flood the DNS server in containerized deployments. #78390
- The
getLoadsRPC returned every load record in a single message, so a busy cluster filled the leader log withFE RPC failure ... MaxMessageSize reachedand theloads_historyarchive rolled back and permanently lost rows. The RPC is now paginated by job id. #78898 - A task run that migrated between the pending queue, the running map, the in-memory history, and the archived history while
task_runswas being read could be reported twice. #79438 SHOW ALTER TABLE ROLLUPandSHOW ALTER MATERIALIZED VIEWacceptedWHERE,ORDER BY, andLIMITand then ignored them; onlySHOW ALTER TABLE COLUMNapplied them.FinishedTimeis also accepted in aSHOW ALTER TABLE ROLLUPpredicate. #79281 #79498- A client disconnect was handled inline on the XNIO I/O thread rather than on a worker, so killing the running query blocked the event loop. #77590
- Loading the SQL blacklist rebuilt and sorted its immutable snapshot once per rule, which is quadratic in the number of rules and ran at every FE start and checkpoint. #78752
AsyncTaskQueuebusy-spun betweengetOutputs()andtryGetOutputs()after the consumer thread was interrupted, because the interrupt was swallowed without clearinghasMoreOutput. #79297TableKeeperdeclared ajdk.jshellexception type that does not exist on a JRE, so reflection on the class failed withNoClassDefFoundError. #79520- Loading into an expression-partitioned table through the multi-table transaction stream load interface failed at commit whenever the BE had to create a partition, with
automatic create partition failed. error: txn ... not exist. #78790 - A completed merge-commit load could report less than full merge-window progress in
information_schema.loads. #78723 - A
VARCHARcolumn holding non-UTF-8 bytes made protobuf log aninvalid UTF-8 datawarning once per dictionary word on every tablet writer open RPC. #78657 - Data cache read counters were missing from the intermediate query statistics, so the audit log field
CacheHitRatioand the FE cache-hit-ratio metrics under-reported in shared-data mode. #77696 - In combined txn log mode, a coordinator whose own end-of-stream arrived early could wait for the txn log collector indefinitely when the load was cancelled, and the compaction txn log that file bundling skips writing was not cached. #79389 #77578
- A corrupted local cache copy was re-read on every retry when a primary-key index SST compaction or a delvec page checksum hit corruption, so the operation failed the same way until the entry happened to be evicted. The corrupted entry is now dropped and the read retried. #77481 #78086
- A partial-update rewrite that degenerated into a copy dropped the source's encryption metadata, leaving a segment that no reader could open and that compaction could not rewrite. #79053
- A CN could crash with SIGSEGV during graceful shutdown when an in-flight load reached a StarOS-backed filesystem after
shutdown_staros_worker()had released the global worker. #79058 AsyncFlushOutputStream::close()satisfied its promise while still holding the stream's own mutex, so the I/O thread woke futexes on freed memory after the waiter had destroyed the stream. #79182- Snapshot-protected and post-snapshot physical partitions that share a shard group could have the snapshot's shards deleted by StarMgr metadata sync, which made snapshot restoration unsafe and could surface as missing tablet errors. Shard groups already removed by the recycle bin are also ignored during meta sync. #78800 #76604
- Bundled tablet metadata readers probed a per-tablet object that does not exist in a bundled partition and paid an avoidable HTTP 404 first, because the partition marker was keyed differently by producers and readers. A BE counter for
NotFoundlake tablet metadata reads was added. #78466 #78451 - A shared-data partition with the highest compaction score in the cluster could be admitted on every scheduling round and never started, because candidates were not sorted by maximum tablet score. Runtime changes of
compact_threadsalso lost tokens when the limiter shrank. #77482 #78087 - A lake alter job could get stuck after an FE failover, because replaying a pending online rewrite job did not restore its table-state reservation. #78517
- Rowset metadata cache entries kept their initial charge after lazy-loaded indexes had increased segment memory usage, so the cache under-reported its footprint. #77893
- Primary-key compaction estimated its read chunk size from compressed disk size and from rowset metadata that had not been loaded. #78192
Tablet::get_average_row_size()walked_rs_version_mapwithout holding_meta_lock, against the contract that map is declared with. #79250CACHE SELECTcould crash the CN when the read schema contained complex-type columns and was reordered for predicate evaluation. #77245- The
pipe_driver_queue_lenmetric had been missing from the BE/metricsoutput since v3.5.0. #77890 - The profile dictionary carried a misspelled
ZoneMapIndexFiterkey that never matched what the BE emits, and the scanSampleTimecounter reported a block count rather than elapsed time. #78728 #78732 BinaryColumnBase::replicateoverflowed a 32-bit integer when computing the total size, which crashed the BE. #77545- The warning for
JAVA_OPTS_FOR_JDK_11andJAVA_OPTS_FOR_JDK_9_AND_LATERunderstated that these variables overrideJAVA_OPTSoutright and that support for them will be removed. #78328 - A runtime change of
sys_log_levelwas written to the configuration but never applied, even though the item is documented as mutable. #79200 paimon-readerdid not inherit the managedlibthriftversion. #78747