Repository navigation
fix(relay): enlarge sender send buffer to prevent slow-client kicks - #286
Conversation
Reviewer's guide (collapsed on small PRs)Reviewer's GuideThe relay dispatcher now enlarges the sender-side socket buffer, with a capability-aware fallback, so burst traffic is less likely to produce Sequence diagram for relay burst buffering and slow-client protectionsequenceDiagram
participant Dispatcher
participant SenderSocket
participant ClientSocket
participant RelayClient
Dispatcher->>SenderSocket: setsockopt(SO_SNDBUFFORCE, 8 MiB)
alt SO_SNDBUFFORCE fails
Dispatcher->>SenderSocket: setsockopt(SO_SNDBUF, 8 MiB)
end
Dispatcher->>ClientSocket: setsockopt(SO_RCVBUFFORCE, 8 MiB)
Dispatcher->>SenderSocket: send(event)
SenderSocket->>ClientSocket: buffered relay event burst
ClientSocket->>RelayClient: deliver events
Note over SenderSocket,RelayClient: Larger sender buffer reduces EAGAIN/EWOULDBLOCK slow-client kicks
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
The relay dispatcher's socketpair only enlarged the receive buffer on the client end (fds[1]) via SO_RCVBUFFORCE/SO_RCVBUF, but left the sender end (fds[0]) at the default send buffer size. When event bursts exhaust the sender's kernel send queue, the non-blocking send() in event_relay_dispatcher_send() returns EAGAIN/EWOULDBLOCK, causing the client to be kicked with "relay: slow client fd %d, kicking". Fix: add SO_SNDBUFFORCE (8 MiB) on fds[0] with fallback to SO_SNDBUF, mirroring the existing receive buffer configuration on fds[1]. The CAP_NET_ADMIN capability already granted by the systemd unit (added in the previous fix) satisfies SO_SNDBUFFORCE for both directions. PMS: TASK-395961 Log: 增大relay发送端缓冲区,防止突发事件时慢客户端被踢出 Influence: relay事件广播在突发场景下的稳定性提升
83f3b4c to
90e87bf
Compare
deepin pr auto reviewAI 代码审查报告
总体评价
本次提交修复了 relay 事件分发器中发送端缓冲区未增大的问题。代码修改质量优秀,新增的发送端缓冲区配置逻辑与已有的接收端配置完全对称,注释详尽,错误处理完善。未发现任何安全漏洞或代码质量问题。 漏洞统计
漏洞对比统计:新增漏洞 0 个,减少漏洞 0 个,持平 0 个 四维度评分
维度1:语法逻辑(25/25 ✓)评价: 语法正确,逻辑清晰 变更分析:
潜在问题: 无 维度2:代码质量(25/25 ✓)评价: 代码结构清晰,注释完整 变更分析:
潜在问题: 无 维度3:代码性能(20/20 ✓)评价: 性能良好,资源使用合理 变更分析:
潜在问题: 无 维度4:代码安全(30/30 ✓)评价: 存在0个安全漏洞 安全分析:
漏洞对比统计: 新增漏洞 0 个,减少漏洞 0 个,持平 0 个 安全漏洞清单: 无 代码变更详情文件:
|
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: lzwind, wangrong1069 The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
|
/merge |
Root Cause Analysis
The relay dispatcher's socketpair only enlarged the receive buffer on the client end (
fds[1]) viaSO_RCVBUFFORCE/SO_RCVBUF, but left the sender end (fds[0]) at the default send buffer size. When event bursts exhaust the sender's kernel send queue, the non-blockingsend()inevent_relay_dispatcher_send()returnsEAGAIN/EWOULDBLOCK, causing the client to be kicked with"relay: slow client fd %d, kicking".Key evidence:
src/dispatcher/event_relay_dispatcher.c:107-118only configuresSO_RCVBUFonfds[1];:144sends viafds[0];:148kicks onEAGAIN. The same repo'sevent_dispatcher.calready appliesSO_SNDBUFon its sender end (commit36b42fb).Fix
Add
SO_SNDBUFFORCE(8 MiB) onfds[0]with fallback toSO_SNDBUF, mirroring the existing receive buffer configuration onfds[1]. TheCAP_NET_ADMINcapability already granted by the systemd unit (added in commitd92fea0) satisfiesSO_SNDBUFFORCEfor both directions. No API change, no logic change — only adds buffer configuration code.Change Safety Assessment
Code Safety
62b9db7), not a previous bug fix; this change does not revert any historical fix.event_relay_dispatcher_get_event_channel()is unchanged; all 19 callers (server module + tests) use only the return value and are unaffected.Business Impact Scope
Affects the
deepin-anything-serverevent relay broadcast functionality. When file system events burst (e.g., bulk file operations), relay clients consuming events at a slower rate will no longer be prematurely disconnected due to sender buffer exhaustion. The fix improves relay stability under high event throughput scenarios.Verification Suggestion
根因分析
relay 调度器的 socketpair 创建后只放大了客户端端
fds[1]的接收缓冲区(SO_RCVBUFFORCE/SO_RCVBUF),没有放大服务端发送端fds[0]的发送缓冲区。突发事件耗尽发送端内核发送队列后,event_relay_dispatcher_send()的非阻塞send()返回EAGAIN/EWOULDBLOCK,代码随即踢出客户端并输出"relay: slow client fd %d, kicking"。关键证据:
src/dispatcher/event_relay_dispatcher.c:107-118只配置了fds[1]的SO_RCVBUF;:144通过fds[0]发送;:148收到 EAGAIN 后踢出。同仓库event_dispatcher.c已在发送端配置SO_SNDBUF(commit36b42fb)。修复方案
为
fds[0]增加SO_SNDBUFFORCE(8 MiB)发送缓冲区,失败时回退SO_SNDBUF,与现有接收端配置对称。systemd unit 中已授予的CAP_NET_ADMIN(commitd92fea0)同时满足双向 force 配置需求。无 API 变化,无逻辑变化,仅新增缓冲区配置代码。改动安全评估
代码安全评估
62b9db7)引入,非历史 bug 修复产物,本次修改不会撤销任何已有修复。event_relay_dispatcher_get_event_channel()未改变,全部 19 处调用者(服务端模块 + 测试)仅使用返回值,不受影响。业务影响范围
影响
deepin-anything-server事件中继广播功能。文件系统事件突发时(如批量文件操作),消费速度较慢的 relay 客户端不再因发送端缓冲区耗尽而被提前断开。修复提升了高事件吞吐场景下的 relay 稳定性。验证建议
Summary by Sourcery
Bug Fixes: