-
Notifications
You must be signed in to change notification settings - Fork 2
fix wasm memory leak #9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
修复 WASM 内存泄漏问题变更概述
变更文件
时序图sequenceDiagram
participant PH as PluginHandleBase
participant WV as WasmVm
PH->>WV: addFailCallback(key, callback)
WV->>WV: fail_callbacks_[key] = callback
PH->>PH: ~PluginHandleBase()
PH->>WV: removeFailCallback(plugin_handle_key_)
WV->>WV: fail_callbacks_.erase(key)
💡 小贴士与 lingma-agents 交流的方式📜 直接回复评论
📜 在代码行处标记
📜 在讨论中提问
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔎 代码评审报告
🎯 评审意见概览
| 严重度 | 数量 | 说明 |
|---|---|---|
| 🔴 Blocker | 0 | 阻断性问题,需立即修复。例如:系统崩溃、关键功能不可用或严重安全漏洞。 |
| 🟠 Critical | 1 | 严重问题,高优先级修复。例如:核心功能异常或性能瓶颈影响用户体验。 |
| 🟡 Major | 2 | 主要问题,建议修复。例如:非核心功能缺陷或代码维护性较差。 |
| 🟢 Minor | 0 | 次要问题,酬情优化。例如:代码格式不规范或注释缺失。 |
总计: 3 个问题
📋 评审意见详情
💡 代码实现建议
以下是文件级别的代码建议,聚焦于代码的可读性、可维护性和潜在问题。
📐 include/proxy-wasm/wasm.h (1 💬)
📐 include/proxy-wasm/wasm_vm.h (1 💬)
- 为WasmVm类增加了失败回调的管理功能,包括添加和移除回调。 (L346-L351)
📄 src/wasm.cc (1 💬)
🚀 架构设计建议
以下是对代码架构和设计的综合分析,聚焦于跨文件交互、系统一致性和潜在优化空间。
🔍1. WASM失败回调机制中的键生成策略可能引发键冲突
在WasmVm::addFailCallback方法中,使用静态整数ID生成键来标识失败回调。这种策略在多线程环境中可能导致键冲突,因为静态变量在多个线程间共享,且未进行同步处理。建议使用线程安全的唯一标识符生成方法,如UUID或原子操作生成的唯一ID,以确保键的唯一性。
📌 关键代码
void addFailCallback(std::function<void(FailState)> fail_callback) {
static int id = 0;
std::string key = std::to_string(id++);
addFailCallback(key, std::move(fail_callback));
}
键冲突可能导致错误的回调被触发或回调无法正确移除,进而引发内存泄漏或程序行为异常。
🔍2. 插件句柄键的生命周期管理不明确
在PluginHandleBase中引入了plugin_handle_key_用于标识插件句柄,但在WasmVm的失败回调管理中,未明确键的生命周期和有效性检查。如果键在回调触发前被销毁或重用,可能导致回调无法正确执行或执行错误的回调。建议在添加和移除回调时进行键的有效性检查,并确保键的生命周期与插件句柄一致。
📌 关键代码
private:
// key for the plugin handle, used to identify the key in fail callbacks
std::string plugin_handle_key_;
void removeFailCallback(const std::string& key) {
fail_callbacks_.erase(key);
}
键的生命周期管理不当可能导致回调执行错误或无法执行,进而引发内存泄漏或程序崩溃。
🔍3. 失败回调的执行顺序未定义
在WasmVm::fail方法中,遍历并执行所有失败回调,但未定义回调的执行顺序。如果回调之间存在依赖关系,可能导致不可预测的行为。建议为回调添加优先级或依赖关系管理,以确保回调按预期顺序执行。
📌 关键代码
void fail(FailState fail_state, std::string_view message) {
integration()->error(message);
failed_ = fail_state;
for (auto & [key, callback] : fail_callbacks_) {
callback(fail_state);
}
}
回调执行顺序不确定可能导致依赖关系无法满足,进而引发程序逻辑错误或数据不一致。
审查详情
📒 文件清单 (3 个文件)
📝 变更: 3 个文件
📝 变更文件:
include/proxy-wasm/wasm.hinclude/proxy-wasm/wasm_vm.hsrc/wasm.cc
💡 小贴士
与 lingma-agents 交流的方式
📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:
-
在当前代码中添加详细的注释说明。
-
请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。
📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:
-
@lingma-agents 分析这个方法的性能瓶颈并提供优化建议。
-
@lingma-agents 对这个方法生成优化代码。
📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:
-
@lingma-agents 请总结上述讨论并提出解决方案。
-
@lingma-agents 请根据讨论内容生成优化代码。
johnlanni
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Add call to removeFailCallback in PluginHandleBase destructor to ensure proper cleanup of fail callbacks.