问题现象
当集群对象产生同名冲突(对象名字不唯一,代码 BUG),在使用 RPM 版本的集群上,发生同名冲突后一段时间,SQL 可能会随机 core。
示例如下:
查看日志文件,发现在生成 core 文件。
[admin@ob171:/data/l]# ls -tlr
total 953747200
drwxrwxrwx 5 admin admin 65 jul 9 2001 ob_poc_ssd
-rw-r--r-- 1 admin admin 493328707584 Dec 8 16:35 core-TNT-LO_l-317100-1670488080
-rw-r--r-- 1 admin admin 167275270144 Dec 8 17:05 core-TNT-LO_l-183504-1670490209
-rw-r--r-- 1 admin admin 492954107904 Dec 8 18:57 core-TNT-LO_l-76444-1670496672
关键诊断信息
触发条件
创建了会产生同名冲突的对象。
问题原因
触发问题的两个必要原因:
有同名冲突风险的版本(历史有若干同名冲突的问题已修复)。
集群使用了 RPM 版本的 binary。
具体原因:
同名冲突问题: 本次同名冲突是因为约束名为空的时候没有进行校验,导致出现了两个名字为空的约束,会触发 schema 的 rebuild 逻辑。
RPM 版本问题: OceanBase 的
right_to_die()逻辑在非 RPM 版本的行为是会 hang 住线程;而在 RPM 版本的行为是会抛异常释放当前线程,可能会导致上下文没清理或有内存泄漏等风险。Schema 问题: 触发 Schema 刷新前会先设置线程局部 allocator 为栈上 allocator,Schema 刷新结束后 reset 线程局部 allocator。但同名冲突会触发 Schema 的 Rebuild 逻辑并触发
right_to_die()逻辑,抛异常释放线程后线程局部 allocator 未清理,导致线程局部 allocator 会引用非法的栈上内存。SQL: 某线程曾经因为抛异常释放后,若该线程接收请求,其临时栈上的 Schema 对象会优先使用线程局部的 allocator 申请内存,导致可能触发 core。
问题的风险及影响
同名冲突问题可能会导致操作对象非预期,进而触发正确性问题。
在发生同名冲突后的一段时间内,SQL 可能会随机触发 core。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响的版本
OceanBase 数据库 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220419)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法及规避方式
业务规避产生同名冲突的场景。
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V2.2.77 BP15(oceanbase-2.2.77-115000012023010607)、V3.1.2 BP11(oceanbase-3.1.2-111000052023010412)、V3.2.3 BP7(oceanbase-3.2.3.3-107000092023011911)、V3.2.4 BP1(oceanbase-3.2.4.1-101000052023010822)。