首批通过分布式安全可靠测评,为关键业务系统打造
创建租户和更新配置项形成死锁
更新时间:2026-06-10 01:56
问题现象
创建租户时,出现sys租户队列积压,创建租户任务超时。
关键诊断信息
触发条件
创建租户时,遇到正在有配置项更新(可能是外部触发的租户配置项更新、集群配置项更新;也可能是加机器、RS 切主时分别触发的 server_list 和 rootservice_list 更新)。有概率导致创建租户任务超时失败。
事前巡检
检查触发场景,是否近期做过 租户创建、修改配置项、加机器、RS 切主这些操作中的两个或以上。
事后诊断
检查系统租户队列积压,且无法恢复。

如图,系统租户队列
total_size上涨的速度等于累计收到 RPC 请求recv_np_rpc_cnt增长的速度,说明 RPC 来一个排队一个,没有在消化,反映线程大概率死锁。抓取obstack,分析堆栈,看是否有以下三个堆栈。
抓取命令,如下。
obstack -ao pid > obstack.logpid 替换为 OBServer 的 pid。
尝试找这三个堆栈。
线程 1:
ConfigMgr线程卡在dump2file里面的wrlock。
线程 2: 某个
TNT_L0_1线程卡在ObTenantConfig::got_version里面的Mutex::lock()。
线程 3: 另一个
TNT_L0_1线程卡在ObTenantNodeBalancer里面,最上层显示卡在wrlock。
问题原因
上面所示的三个线程: 线程 1: ConfigMgr,线程 2: TNT_L0_1, 线程 3: TNT_L0_1。
涉及三把锁: A: config_map_lock,B: serialize_lock,C: config_update_task_lock。
形成死锁的条件:
线程 1 持有 锁 C,获取写锁 A 卡住。
线程 2 持有读锁 A,获取写锁 B 卡住。
线程 3 持有读锁 B,获取锁 C 卡住。
详见堆栈。
问题的风险及影响
上述所说的线程 2,正在执行创建租户动作中的一步 add_tenant_config,因此会阻塞创建租户的过程,导致建租户超时失败。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版本 V3.2.3 BP6(oceanbase-3.2.3.3-106000102022111521)及之后版本。
解决方法及规避方式
解决方法:
重启队列积压的 OBServer。
规避方式:
事前规避,尽量避免创建租户和修改配置项的动作同时发生。