Apache AGE遍历子Oid时PostgreSQL崩溃问题求助
解决Apache AGE中遍历继承子表Oid导致PostgreSQL崩溃的问题
可能的崩溃原因
- 传入的
edge_label_table_oid无效,导致find_inheritance_children返回异常List结构 - 使用
NoLock锁级别时,并发场景下继承表结构被修改,遍历过程中访问了已失效的内存 - 未对返回的List做合法性校验,直接遍历空指针或损坏的List数据
修正后的代码实现
// 校验父表Oid的有效性 if (!OidIsValid(edge_label_table_oid)) { elog(WARNING, "Invalid edge label table OID: %u", edge_label_table_oid); return; // 依据函数实际逻辑做对应处理 } // 调整锁级别避免并发冲突,获取子表Oid列表 List *child_edges_oid = find_inheritance_children(edge_label_table_oid, ShareLock); // 遍历子表Oid,提前判断列表非空 if (child_edges_oid != NIL) { ListCell *lc1; foreach (lc1, child_edges_oid) { Oid child_edge_oid = lfirst_oid(lc1); // 校验子表Oid有效性 if (!OidIsValid(child_edge_oid)) { elog(WARNING, "Invalid child edge table OID: %u", child_edge_oid); continue; } // 此处添加你的业务逻辑代码 } } // 手动释放List内存(若当前内存上下文不会自动回收该内存) list_free(child_edges_oid);
关键修复点说明
- Oid有效性校验:拦截无效的父/子表Oid,避免访问非法内存地址
- 锁级别调整:替换
NoLock为ShareLock,防止遍历期间其他进程修改继承表结构,保证数据一致性 - 内存管理:显式调用
list_free释放find_inheritance_children返回的List,避免内存泄漏 - 空列表判断:提前过滤空列表场景,减少不必要的遍历开销
内容的提问来源于stack exchange,提问作者Muhammad Zahid
相关产品推荐
相关产品推荐

