Skip to content

Conversation

@Jing-ze
Copy link

@Jing-ze Jing-ze commented Jul 25, 2025

Add call to removeFailCallback in PluginHandleBase destructor to ensure proper cleanup of fail callbacks.

@lingma-agents
Copy link

lingma-agents bot commented Jul 25, 2025

修复 WASM 内存泄漏问题

变更概述
  • 问题修复

    • PluginHandleBase 析构函数中添加对 removeFailCallback 的调用,确保在插件句柄销毁时清理失败回调,防止内存泄漏。
    • PluginHandleBase 添加 plugin_handle_key_ 成员变量,用于标识失败回调中的插件句柄。
    • WasmVm 类中增强失败回调管理机制,支持通过键值添加和移除失败回调,避免回调函数残留。
    • 修改 setPluginFailCallbackgetOrCreateThreadLocalPlugin 函数,确保插件句柄的键值正确设置并注册到失败回调中。
  • 重构

    • WasmVm 中的失败回调存储结构从无键管理改为基于 std::unordered_map 的键值管理,提高回调管理的灵活性和安全性。
变更文件
文件路径 变更说明
include/proxy-wasm/wasm.h 在 `PluginHandleBase` 的析构函数中添加了对 `removeFailCallback` 的调用,并新增了 `plugin_handle_key_` 成员变量及相关设置方法,用于标识和清理失败回调。
include/proxy-wasm/wasm_vm.h 增强了 `WasmVm` 类的失败回调机制,支持通过键值添加和移除回调函数,并使用 `std::unordered_map` 存储回调,避免内存泄漏。
src/wasm.cc 修改了 `setPluginFailCallback` 和 `getOrCreateThreadLocalPlugin` 函数,确保插件句柄的键值正确设置并注册到失败回调中,防止资源未释放。
时序图
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)
Loading

💡 小贴士

与 lingma-agents 交流的方式

📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:

  • 在当前代码中添加详细的注释说明。

  • 请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。

📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:

  • @lingma-agents 分析这个方法的性能瓶颈并提供优化建议。

  • @lingma-agents 对这个方法生成优化代码。

📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:

  • @lingma-agents 请总结上述讨论并提出解决方案。

  • @lingma-agents 请根据讨论内容生成优化代码。

Copy link

@lingma-agents lingma-agents bot left a 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 💬)
📄 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.h
  • include/proxy-wasm/wasm_vm.h
  • src/wasm.cc

💡 小贴士

与 lingma-agents 交流的方式

📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:

  • 在当前代码中添加详细的注释说明。

  • 请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。

📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:

  • @lingma-agents 分析这个方法的性能瓶颈并提供优化建议。

  • @lingma-agents 对这个方法生成优化代码。

📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:

  • @lingma-agents 请总结上述讨论并提出解决方案。

  • @lingma-agents 请根据讨论内容生成优化代码。

Copy link

@johnlanni johnlanni left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@johnlanni johnlanni merged commit 913c1b0 into higress-group:master Jul 25, 2025
2 of 8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants