ClickHouse v23.3.21.26 LTS 补丁版本解读:六大用户可见缺陷修复与内部加固
ClickHouse v23.3.21.26 LTS 补丁版本解读六大用户可见缺陷修复与内部加固【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse导读v23.3.21.26-lts 是 ClickHouse 23.3 LTS 分支上的一个维护性补丁版本以修复官方稳定版中的用户可见错误行为为核心目标。本文逐一解析该版本 changelog 中记录的 6 个 Bug Fix 与 3 项内部改动并结合当前仓库源码说明每处修复所涉及的模块、根因方向与影响范围帮助维护者在升级 23.3 系列时快速评估风险并定位问题域。版本概览一次小而精的 LTS 补丁迭代本版本的基础信息记录在 v23.3.21.26-lts changelog 中发布版本v23.3.21.26-lts源码提交d9672a3731f上游基线相比v23.3.20.27-lts提交cc974ba4f81的增量修复版本类型23.3 LTS长期支持分支的第 21 个补丁patch迭代延续v23.3.x.lts的偶数位补丁编号节奏changelog 将改动分为两类分类数量说明Bug Fix用户可见错误行为修复6官方稳定版中用户可观察到的行为缺陷属于必须修复的范畴NOT FOR CHANGELOG / INSIGNIFICANT3内部实现加固、测试基础设施调整不直接改变用户可见行为这种主线功能冻结、只做缺陷修复与稳定性加固的模式正是 LTS 分支的核心运营策略不引入新特性专注让长期运行的生产集群更稳。下面按模块逐条解析这 6 个 Bug Fix。一、修复重启后读取稀疏列sparse columns的问题修复条目#49660Fix reading from sparse columns after restartAnton Popov。ClickHouse 的稀疏序列化Sparse Serialization是一种针对大量默认/零值列的存储优化仅保存非默认值及其位置索引显著降低数据占用。该功能的核心实现位于 SerializationSparse.cpp其配套的类型信息管理在 SerializationInfo.cpp 与 SerializationInfoSettings.cpp 中。该修复解决的是持久化元数据在进程重启后的恢复一致性问题MergeTree 表的稀疏序列化选择某列是否按稀疏方式存储被记录在 parts 的元数据中。若读取路径在重启后未能正确恢复这一信息后续读取就可能按错误的序列化格式解析数据导致读取结果错误甚至数据损坏。修复后重启场景下稀疏列读取能够稳定还原正确的序列化格式信息。从测试覆盖看仓库中的 gtest_sparse_serialization.cpp 对稀疏序列化的读写往返round-trip做了系统验证与本修复的读取一致性目标直接对应。建议使用稀疏列优化即SETTINGS ratio_of_defaults_for_sparse_serialization或显式SPARSE声明的 23.3 用户优先升级到本版本。二、修复 CompressionCodecMultiple 中的缓冲区溢出修复条目#60731Fix buffer overflow in CompressionCodecMultipleAlexey Milovidov。复合压缩编解码器CompressionCodecMultiple允许将多个 codec 串联成一个链例如CODEC(ZSTD, LZ4)或自定义组合是 ClickHouse 列式压缩中最灵活的机制之一。其实现位于 CompressionCodecMultiple.cpp注册逻辑见同文件底部的registerCodecMultiple。从当前源码可以清楚看到该 bug 修复留下的防御性逻辑4 GiB 回绕检测getCheckedReserveSize中若为压缩预留的大小小于输入大小说明 UInt32 算术发生了回绕wrap此时直接抛出CANNOT_COMPRESS异常避免向过小的缓冲区写入数据CompressionCodecMultiple.cpp。链长度上限检查getMaxCompressedDataSize中codec 链的个数被存储在一个字节UInt8内因此超过 255 个 codec 的链会被直接拒绝CompressionCodecMultiple.cpp。压缩后大小再校验doCompressData在写完数据前再次核对written_size是否超出预留的dest_size双保险防止越界CompressionCodecMultiple.cpp。简而言之本修复针对的是极端输入大小接近 4 GiB 的数据块配合多级 codec 链时UInt32 预留大小计算溢出导致的缓冲区写入越界问题。受影响面主要是启用多级 codec 链且处理超大块数据的场景。相关单元测试见 gtest_compressionCodec.cpp 与 gtest_compression_codec_adaptive.cpp。三、清理 SQL/JSON 函数中的不合理行为修复条目#60738Remove nonsense from SQL/JSONAlexey Milovidov。这里的 nonsense 指的是 SQL/JSON 路径函数族如JSON_EXISTS、JSON_VALUE、JSON_QUERY以及json相关变体中存在的不合理语义或死代码行为。SQL/JSON 支持的核心实现在 FunctionSQLJSON.cpp 与其头文件 FunctionSQLJSON.h 中底层依赖JSONPath解析器ParserJSONPath.h和 JSON 解析后端simdjson 等见 SimdJSONParser.h。从源码可以确认SQL/JSON 函数族包含多个可通过设置项调节的行为function_json_value_return_type_allow_complex/function_json_value_return_type_allow_nullable控制JSON_VALUE返回类型的推导约束max_parser_backtracks/max_parser_depth限制 JSONPath 解析器的回溯次数与深度防止恶意/畸形路径导致资源耗尽FunctionSQLJSON.h。该修复属于行为收敛类改动——删除无意义的语义使函数行为更符合 SQL 标准预期。使用 SQL/JSON 函数的用户在升级后应重新验证相关查询的结果一致性特别是依赖旧版非标准行为的场景。四、修复 arrayEnumerateRanked 的崩溃修复条目#60764Fix crash in arrayEnumerateRankedRaúl Marín。arrayEnumerateRanked家族函数arrayEnumerateRanked、arrayEnumerateUniqRanked、arrayEnumerateDenseRanked用于对数组元素按排名rank进行枚举常用于数组内去重统计、Top-N 分析。其实现位于 arrayEnumerateRanked.cpp 及头文件 arrayEnumerateRanked.h。从当前源码可以看出该函数族对参数校验的严格要求这正是本次崩溃修复的上下文第一个参数若是非数组则必须是Const(UInt64)且为正整数否则抛出BAD_ARGUMENTS后续参数须以数组 可选的常量深度成对出现深度值不能超过对应数组的实际维度全局clear_depth不能大于所有数组的最大深度arrayEnumerateRanked.cpp。本修复解决的是特定参数组合如多数组 自定义深度 复杂键列触发未定义行为导致进程崩溃的问题。崩溃类缺陷的危害在于可能导致单次查询把整个 server 进程带崩而非仅报错因此升级收益明确。使用该函数族的分析型查询如商品曝光去重排名应回归测试。五、修复 INSERT SELECT JOIN 中使用 input() 的崩溃修复条目#60765Fix crash when using input() in INSERT SELECT JOINKruglov Pavel。input()是一个特殊函数用于在INSERT INTO ... SELECT ...场景中直接引用正在从客户端流入的原始输入块是高性能导入管线的常用技巧例如配合FORMAT做流式清洗。它与JOIN组合时input()所代表的数据流需要作为查询计划中的一个特殊数据源节点参与执行。本修复解决的是在INSERT INTO t SELECT ... FROM input() JOIN ...这类语句中执行计划生成阶段对input()数据源与 JOIN 的交互处理不当而触发的崩溃。从仓库看这类运行时数据源在查询计划中通常对应 Processors 执行图里的特殊 Source 节点可参考 PipelineExecutor.cpp 的执行模型。建议所有在导入管线中使用input()JOIN组合的用户升级本版本。六、移除读取 S3 数据时的递归修复条目#60849Remove recursion when reading from S3Antonio Andelic。S3 表引擎与 S3 磁盘是 ClickHouse 云原生存储的核心能力。在对象存储S3场景中读取目录/前缀下大量对象时若代码以递归函数调用的方式逐层遍历对象列表当对象数量极大成千上万级或嵌套层级过深时会耗尽进程栈空间导致栈溢出崩溃。本修复将读取路径中的递归遍历改为显式的迭代式遍历如使用显式栈/队列从而把数据量大与调用栈深度解耦。这类改动不影响用户可见语义但显著提升了海量小文件场景如日志类分区、parquet/ORC 文件列表下的稳定性与内存行为。使用s3://表函数、S3 表引擎或 S3 备份的 23.3 用户尤其值得升级。内部加固不进 changelog 的稳定性投入除用户可见修复外该版本还包含 3 项标记为 NOT FOR CHANGELOG / INSIGNIFICANT 的内部改动它们同样值得了解1. 异常时正确取消 PipelineExecutor 的线程派生#57104 / #60499执行器PipelineExecutor负责将查询计划编译成 Processor 流水线并调度线程执行核心实现位于 PipelineExecutor.cpp 与 ExecutorTasks.cpp。该修复含一次重复提交确保在spawnThreads阶段抛出异常时已派生的线程能被正确取消与回收避免线程泄漏、任务悬挂或查询结束后残留线程继续运行。2. 在测试中检测 io_uring#60373io_uring 是 Linux 的高性能异步 I/O 接口ClickHouse 在某些平台/配置下会启用其支持。该改动让测试环境能自动检测 io_uring 的可用性从而在 CI 中正确选择异步 I/O 后端与对应断言避免因平台差异导致误报。升级建议与验证方式综合以上分析v23.3.21.26-lts是一次典型的 LTS 缺陷收敛版本强烈建议升级使用稀疏列、复合 CODEC 链、S3 存储、arrayEnumerateRanked或input() JOIN 导入管线的生产集群回归重点重启后稀疏表读取、多级压缩链的大块数据写入、SQL/JSON 查询结果、数组排名函数查询、S3 海量对象读取变更面小本版本不含新特性与破坏性改动6 个 Bug Fix 均为局部模块修复升级风险可控。升级后可用SELECT version()确认版本号并通过system.query_log观察上述相关查询的执行状态。若需追溯更早的 23.3 LTS 演进历史可浏览 changelogs 归档目录对 23.3 分支更早期补丁的对比可参考同目录下v23.3.20.27-lts等相邻版本的 changelog 文件。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →