Skip to content

修复 tcp/ 和 http/ 中 buffer/ringbuffer 相关问题 - #2

Open
FluxMind-O wants to merge 4 commits into
importcpp:masterfrom
FluxMind-O:fix/ringbuffer-bugs-and-parse-perf
Open

修复 tcp/ 和 http/ 中 buffer/ringbuffer 相关问题#2
FluxMind-O wants to merge 4 commits into
importcpp:masterfrom
FluxMind-O:fix/ringbuffer-bugs-and-parse-perf

Conversation

@FluxMind-O

@FluxMind-O FluxMind-O commented Aug 17, 2026

Copy link
Copy Markdown

修复 tcp/http/ 中几个 buffer/ringbuffer 相关问题:

  • KRingBuffer 析构时使用 delete[] 释放 new[] 分配的内存。
  • 修复 RingBuffer::append() 回绕时没有推进 writerIndex_ 的问题。
  • 修复 writeFd() 始终返回 0 的问题,并在写失败时保存 errno
  • 合并 Buffer / RingBuffer 的 HTTP 请求解析路径,避免 RINGBUFFER 模式下把整个 buffer 拷贝到 std::string
  • 同时修复 RINGBUFFER 解析路径中的 CRLF 判断问题。

每个改动对应一个 commit。

Tests

已测试:

  • 默认 Buffer 模式编译通过
  • USE_RINGBUFFER 模式编译通过
  • RingBuffer 析构测试
  • 回绕 append()readableBytes() 从修复前的 100 变为预期的 200
  • writeFd() 返回实际写入长度(测试返回 4)
  • RINGBUFFER 模式 HTTP 请求解析:GET /hello?name=flux HTTP/1.1

编译环境:g++ 11.4,-O2 -std=c++11 -DNDEBUG

没有搞 API 签名变化,也没有新增依赖。

buffer_ 由 new char[capacity_] 分配,析构却用 delete,属未定义行为,可能导致内存损坏。改为 delete[]。
当 writerIndex_ < readerIndex_(环形回绕)时,memcpy 后未更新 writerIndex_,新写入数据被后续写入覆盖且索引停滞,导致数据丢失。在 memcpy 后补 writerIndex_ += len。
writeFd 始终返回 0 而非实际写入字节数 n,调用方 TcpConnection::handleWrite 依赖返回值判断写入进度,导致误判已写完。改为返回 n,并在 n < 0 时设置 *savedErrno = errno。
原 RINGBUFFER 模式 parseRequest 通过 retrieveAsString 将整个缓冲区 O(n) 拷贝成 std::string 再解析,丧失零拷贝优势;且 if(crlf) 判断 std::search 返回值永远为真(data()+size() 非空指针),存在解析 bug。线性 Buffer 与环形 RingBuffer 暴露一致的 findCRLF/peek/retrieveUntil 接口,合并两套 parseRequest 为一份零拷贝实现。
@FluxMind-O FluxMind-O changed the title 修复 RingBuffer 严重缺陷并优化 HTTP 解析零拷贝路径 修复 tcp/ 和 http/ 中 buffer/ringbuffer 相关问题 Aug 17, 2026
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.

1 participant