ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

深入解读 ClickHouse v23.10.4.25-stable 回移植版本:变更日志精读与核心修复的源码级验证

2026/9/14 14:37:50 拓冰建站 浏览量
深入解读 ClickHouse v23.10.4.25-stable 回移植版本:变更日志精读与核心修复的源码级验证 深入解读 ClickHouse v23.10.4.25-stable 回移植版本变更日志精读与核心修复的源码级验证【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本篇技术指南围绕 ClickHouse 23.10 分支的回移植稳定版 v23.10.4.25-stable 的官方变更日志展开逐条解析该版本包含的 6 个用户可见 Bug 修复与 2 项构建/测试改进并结合仓库源码验证 GCD/FPC 压缩编解码器崩溃修复、Kerberos 初始化段错误修复、备份恢复设置兼容性等关键改动的实际实现。读完后你将理解 23.10 分支回移植版本的发布结构并能将每条 changelog 条目定位到对应的源码模块进行核验。版本定位23.10 分支上的一个回移植稳定版该版本的变更日志位于 v23.10.4.25-stable.md其标题明确声明了版本对照关系ClickHouse release v23.10.4.25-stable (330fd687d41) as compared to v23.10.3.5-stable (b2ba7637a41)这说明 v23.10.4.25-stable 是构建于提交330fd687d41的补丁发布变更范围通过与上一稳定版 v23.10.3.5-stable提交b2ba7637a41其日志见 v23.10.3.5-stable.md的差异确定。从条目构成看这个版本没有 Improvement、Performance、New Feature 等类目仅包含三类内容Bug Fix用户可见的正式稳定版错误行为6 项是本版本的核心价值Build/Testing/Packaging Improvement2 项均为 CI 基础设施回移植NOT FOR CHANGELOG / INSIGNIFICANT3 项属于不影响用户行为的工程性改动。在 23.10 分支的完整版本序列中该分支从 v23.10.1.1976-stable 一路延续到 v23.10.6.60-stable见 docs/changelogs/archive/ 目录v23.10.4.25 处于中段位置。对于锁定 23.10 LTS 分支的生产部署这类“纯 Bug 修复 构建改进”的回移植版本通常是最稳妥的升级目标。Bug Fix 条目全景以下是变更日志中 Bug Fix 类目下全部 6 个修复条目均已在仓库源码中验证了落点修复基于表函数table function的表上查询 system 表的问题修复备份恢复restore from backup在启用flatten_nested与data_type_default_nullable设置时的错误修复 Kerberos 初始化过程中的段错误segfault修复 RabbitMQ 的 OpenSSL 动态加载问题修复 GCD 编解码器在数据中存在零值时的崩溃修复 FPC 编解码器的崩溃。下面按主题对这 6 个修复逐一展开并给出源码级的证据链。压缩编解码器修复GCD 与 FPC 崩溃的根因这是本版本中最值得深入的两条修复两者都指向列级压缩 codec 的崩溃路径。GCD 编解码器零值导致 GCD 为 0 的崩溃修复GCD codec 是一个预处理器型 codec它先求出整列数值的最大公约数再用“各值除以 GCD 的商”替代原值进行存储——商更小、熵更低对后续的通用压缩如 LZ4、ZSTD更友好。从源码注释看该设计对“可整除的整数序列”例如毫秒时间戳、以固定步长递增的 ID特别有效见 CompressionCodecGCD.cpp 第 20–23 行的类注释。v23.10.4.25 对应的 PR #56704 修复的是“数据中存在零值时崩溃”的问题。根因在数学上很直接当列中存在 0 时全列 GCD 的计算结果会退化为 0而 0 不能作为除数。修复后的逻辑体现在当前源码中GCD 计算循环第 110–118 行逐值用boost::integer::gcd归并随后/// GCD compression is pointless if GCD 1 or GCD 0 (happens with 0 values in data). /// In these cases only copy the source to dest, i.e. dont compress. if (gcd 0 || gcd 1) { memcpy(dest, source, source_size); return; }CompressionCodecGCD.cpp 第 123–129 行注释明确写道 “GCD 0 (happens with 0 values in data)”——当 GCD 为 0数据含零值或 1无可整除性时GCD 压缩本身没有意义直接原样拷贝数据而不做压缩从而规避了除零崩溃。解压缩路径在decompressDataForType中做了对称处理第 180–189 行读到gcd_multiplier为 0 或 1 时按未压缩数据还原保证新旧数据格式互兼容。此外从源码还能看到几个与正确性相关的细节均与这次“崩溃修复”主题一脉相承有符号类型的幅度处理GCD 未定义于负数代码对负数取“幅度”magnitude参与 GCD 计算符号通过把商取负来保留第 103–108 行toMagnitude逻辑全程使用无符号运算第 93–97 行的注释解释了为何内部必须用无符号类型——minInt64的幅度2^63无法放入有符号类型取负会产生未定义行为而无符号类型通过模 2^N 语义天然给出正确结果libdivide 加速对 32/64 位整型用libdivide::divider做快速除法第 131–147 行16/32 字节的 UInt128/UInt256 则走普通除法路径。关于适用范围与参数注册函数registerCodecGCD第 307–326 行表明GCDcodec 不接受任何参数传参会报ILLEGAL_SYNTAX_FOR_CODEC_TYPE只可用于Int*、UInt*、Decimal*、Date*、DateTime*类型且值大小须为 1/2/4/8/16/32 字节第 289–303 行getGCDTypeInfo。FPC 编解码器浮点压缩崩溃修复FPCFast Parallel Compressorcodec 实现了 Burtscher 与 Ratanaworabhan 2008 年论文中的双精度浮点压缩算法类注释明确引用了论文出处见 CompressionCodecFPC.cpp 第 20–23 行。其getDescription()返回的描述是 “High Throughput Compression of Double-Precision Floating-Point Data”第 46 行并通过isFloatingPointTimeSeriesCodec()标记为时序浮点专用 codec。v23.10.4.25 中由 Alexey Milovidov 贡献的 PR #56795 修复了 FPC codec 的崩溃。结合当前源码可以印证其结构上的关键点压缩级别level参数FPC(level)中 level 决定预测器表大小为2^level个浮点值第 53 行注释默认值为DEFAULT_COMPRESSION_LEVEL 12上限为MAX_COMPRESSION_LEVEL 28第 33–34 行level 非法小于 1 或大于 28会在建 codec 时抛ILLEGAL_CODEC_PARAMETER第 129–131 行双预测器竞争编码内部维护 FCMFloat Compressor基于前值与 DFCMDouble-Floating Compressor基于增量表两个预测器FcmPredictor第 198–234 行、DfcmPredictor第 156–194 行每个值用两个预测器各做一次异或压缩保留前导零字节更多的结果第 347–360 行compressValue以字节对为单位打包头部 1 字节同时编码两个值的预测器选择位与零字节计数64 值分块与头部格式编码以 64 个浮点值为一个 chunk 进行第 246 行CHUNK_SIZE 64整个压缩块前 2 字节头部存储 float_width 与 compression_level第 470–473 行解压时先校验头部合法性第 490–511 行对非法 level、错误 float_width 一律抛CANNOT_DECOMPRESS而不是产生越界访问解压路径的防御性检查decodePair第 407–443 行对空输入、零字节计数越界、长度溢出__builtin_add_overflow以及长度不足等情形都显式抛异常避免读越界。参数使用上注册函数registerCodecFPC第 108–149 行说明 codec 最多接受 2 个参数第 1 个为压缩级别无符号整数1–28第 2 个为显式指定浮点宽度只能是 4 或 8不传参时宽度从列类型推导且只适用于Float32/Float64第 95–104 行getFloatByteWidth非原生浮点类型会抛BAD_ARGUMENTS。Kerberos 初始化段错误修复变更日志条目 “Fix segfault during Kerberos initialization”PR #56401对应 Kerberos 认证初始化路径。当前仓库中该逻辑位于 KerberosInit.cppKerberosInit类以编程方式实现了kinit的等价流程第 34–36 行注释入口函数kerberosInit第 220–227 行负责解析 keytab、初始化krb5_context、解析 principal、处理凭证缓存cache并获取/续期票据。从源码结构看这段修复涉及的几个关键正确性点都已体现在当前实现中全模块置于#if USE_KRB5条件编译内第 8、228 行未启用 krb5 构建时整个模块不参与编译依赖的 krb5 库来自 contrib/krb5 子模块这也是 v23.10 回移植版本需要修复的构建依赖相关问题背景之一资源释放的成对性析构函数第 196–218 行逐一释放 context、keytab、principal、unparsed name、缓存等且先检查k5.ctx非空再释放——段错误类修复通常就落在“初始化中途失败时部分资源为空指针析构仍去释放/使用”这类路径上这里以空指针判断做了防护keytab 文件存在性前置检查第 72–73 行与每个krb5_*调用返回码的检查避免在错误状态下继续执行进程级互斥锁kerberosInit使用静态std::mutex第 222–224 行注释说明目的是“防止凭证缓存文件损坏”避免并发 kinit 竞争同一 credential cache。备份恢复flatten_nested与data_type_default_nullable兼容性修复PR #56306 修复的是从备份恢复表时若源端会话启用了flatten_nested将嵌套类型Nested展平为带.name后缀的独立列或data_type_default_nullable列定义中未显式写NULL/NOT NULL修饰符的数据类型默认为Nullable这两个设置时出现的错误。data_type_default_nullable这个设置在当前源码中的定义与语义说明位于 Settings.cppDECLARE(Bool, data_type_default_nullable, false, R( Allows data types without explicit modifiers [NULL or NOT NULL] in column definition will be Nullable. ... ));从源码结构看这两个设置都会改变备份中记录的建表语句形态展平后的列名、默认的 Nullable 修饰如果恢复端在反序列化元数据、重建表结构时没有按相同设置做等价处理就会出现列类型不匹配或语句解析失败——这正是该条目要修复的行为。对于使用备份/恢复BACKUP/RESTORE语句实现位于 src/Backups 目录的 23.10 用户升级到本版本可消除这类“备份侧与恢复侧设置不一致”导致的恢复失败。其余三条修复与构建改进system 表与表函数的查询修复PR #55540修复了在“基于表函数的表”如SELECT ... FROM func() AS t这类临时表上查询 system 表时的问题属于查询规划阶段的边界情况修正。RabbitMQ OpenSSL 动态加载修复PR #56703针对 RabbitMQ 字典数据源在运行时动态加载 OpenSSL 符号时的加载问题。该数据源依赖contrib下的 AMQP-CPP 库见 contrib/AMQP-CPP修复确保了 RabbitMQ 字典在依赖 OpenSSL 的构建配置下可正常初始化。构建/测试/打包改进共 2 条均为回移植PR #56214修复测试调度计划setup plan意外出现在日志中的问题——它本应只出现在runner_get_all_tests.log里同时确保失败的 infrastructure 事件能发送到 CI 数据库PR #56689构建容器builder container中不再拉取有变更的 git submodule缩短构建准备时间。此外变更日志的 “NOT FOR CHANGELOG / INSIGNIFICANT” 类目下还有 3 项工程性改动CI 任务改写为 callable workflow#56385、持续将 workflow 改写为可复用测试#56501、改进异常消息可读性#56854。这些条目不影响用户可见行为但反映了 23.10 分支维护期 CI 基础设施与主干的持续对齐。如何核验这类回移植版本对于维护 23.10 分支的读者可以按以下方法把 changelog 条目落到可验证的证据上版本对照先读变更日志标题中的两个 commit 号330fd687d41vsb2ba7637a41确认本次发布相对哪个基线同分支的前后版本日志都在 docs/changelogs/archive/ 中例如下一版本 v23.10.5.20-stable.md、分支末尾的 v23.10.6.60-stable.md定位修复代码按条目关键词搜索对应模块。例如 GCD/FPC codec 修复落在 src/Compression/ 下的CompressionCodecGCD.cpp、CompressionCodecFPC.cppKerberos 修复落在 src/Access/KerberosInit.cpp设置语义可查 src/Core/Settings.cpp 中对应设置的DECLARE定义与文档字符串关注回移植标记条目中的 “Backported in #xxx” 表明该修复先合入主干、再 cherry-pick 回 23.10 分支这类版本的安全性主要来自“只带 Bug 修复、不带行为变更”的构成特征升级决策时可据此评估风险。总体而言v23.10.4.25-stable 是一个典型的补丁式回移植发布6 个用户可见 Bug 修复覆盖了压缩 codec 崩溃GCD 零值、FPC、Kerberos 初始化段错误、备份恢复设置兼容、system 表查询与 RabbitMQ 依赖加载五类问题配合 2 项 CI 改进为仍停留在 23.10 分支的部署提供了一个低风险的稳定升级点。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考