Skip to main content
GLink 故障通常落在以下四个方面之一:传输始终不可用、版本协商失败、通道无法进入已连接状态,或者在传输或重启后数据所有权未归还。

首先检查传输状态

传输必须从 down 状态经过协商进入 opened 状态,通道才能通信。永久 down 或失败的传输指向的是传输插件、其物理链路或其依赖初始化,而不是客户端通道。 传输插件负责:
  • 从物理传输读写数据
  • 报告可读数据和可写空间
  • 转换核心命令和载荷
  • 干净地关闭传输
共享内存原生传输还依赖于双向的共享内存和中断。其他插件有其各自的传输特定依赖。

检查通道状态和回调

通道并不因为打开调用返回了句柄就已就绪。请确认:
  1. 所请求的 edge、传输和通道名称与远端匹配。
  2. 收到了已连接通知。
  3. 接收端排队了足够大小的意图,能够容纳预期的报文。
  4. 触发了接收通知。
  5. 接收端调用了完成函数。
  6. 发送端收到了发送完成通知。
缺失发送完成通知通常意味着远端尚未消费接收缓冲区;而缺失接收通知通常意味着没有匹配的意图,或者报文在传递前被拒绝。

启用日志

GLink 核心和 loopback 服务器提供日志控制。支持的日志模式有:
  • Informational —— 默认信息性消息
  • Debug —— 详细的协议和状态调试信息
  • Performance —— 仅性能日志
这些模式可以组合使用。Performance 模式会抑制其他日志,仅保留通过性能日志宏发出的消息。

诊断协商失败

两端独立启动版本协商。这不是竞争条件:只有两端协商序列都完成之后传输才会打开,两端最终会收敛于兼容的版本和特性集。 请检查:
  • 无版本确认
  • 所选版本为零(未找到兼容版本)
  • 对端未接受某些特性
  • 协商在传输能可靠交换命令之前开始
  • 传输配置声明了错误的支持版本
版本不匹配时应选择双方共同支持的较低版本。仅当双方都声明支持时才应启用可选特性。

诊断缓冲区所有权

在每个阶段追踪传入的私有令牌:
  1. 排队一个接收意图。
  2. 带数据的接收通知。
  3. 调用完成函数。
  4. 收到发送完成通知。
如果通道在报文或意图仍处于挂起状态时关闭,客户端必须为接收意图和发送报文的私有数据处理 abort 回调。在收到 abort 通知之前释放属于回调的内存可能导致 use-after-free 或缓冲区所有权永久泄漏。

子系统重启的症状

一次重启可能影响连接到某条 edge 的所有通道。请确认重启路径:
  • 识别受影响的子系统及其 GLink edge
  • 通知相关端点
  • 关闭或中止受影响的通道
  • 归还接收意图和发送私有数据
  • 在重启完成前等待清理
  • 在远端再次可用后重新打开通道
不要以传输重新连接作为所有通道都已恢复的证据;通道状态和缓冲区所有权必须单独检查。