Skip to content

fix(sync): 避免 sync_aof=false 时缓存增量流#1050

Merged
suxb201 merged 3 commits into
tair-opensource:v4from
DCjanus:fix/sync-aof-false-no-backlog
May 18, 2026
Merged

fix(sync): 避免 sync_aof=false 时缓存增量流#1050
suxb201 merged 3 commits into
tair-opensource:v4from
DCjanus:fix/sync-aof-false-no-backlog

Conversation

@DCjanus
Copy link
Copy Markdown
Contributor

@DCjanus DCjanus commented May 17, 2026

背景

sync_reader.sync_aof=false 表示只同步 RDB、跳过增量 AOF,并在全量同步完成后退出。

当前实现会在 RDB payload 接收完成后无条件启动 AOF receiver,导致后续 replication stream 仍被写入本地 AOF backlog,但这部分数据不会发送到目标端。

改动

  • 仅在 sync_aof=true 时启动 AOF receiver 和 PSYNC ACK。
  • sync_aof=false 时关闭源端 replication 连接,避免缓存无消费者的增量流。
  • 新增端到端回归测试:先等 reader 进入 syncing rdb,再写入增量 key,确认不会生成 .aof backlog,也不会增加 aof_received_bytes
  • 保留测试用例传入的 advanced 配置,避免测试 helper 覆盖它。

验证思路

这个 PR 保留三个提交,用来分别确认测试和修复有效:

这些测试任务来自 fork 分支 push 自动触发的 workflow。

@CLAassistant
Copy link
Copy Markdown

CLAassistant commented May 17, 2026

CLA assistant check
All committers have signed the CLA.

@DCjanus DCjanus force-pushed the fix/sync-aof-false-no-backlog branch from 1133fc7 to 525504b Compare May 17, 2026 01:48
@DCjanus DCjanus force-pushed the fix/sync-aof-false-no-backlog branch from d921444 to 05b442b Compare May 17, 2026 02:16
@suxb201
Copy link
Copy Markdown
Member

suxb201 commented May 18, 2026

仅在 sync_aof=true 时启动 AOF receiver 和 PSYNC ACK。

不行。如果 RedisShake 不接收数据,会导致源端 TCP ouput buffer 堆积。

@DCjanus
Copy link
Copy Markdown
Contributor Author

DCjanus commented May 18, 2026

这个改动不是保留 replication 连接但不接收数据。之前 RDB payload 接收完成后,会无条件启动 AOF receiver:

go r.sendReplconfAck()
go r.receiveAOF()

现在 sync_aof=false 时,RDB payload 完整接收后会立即 close 源端 replication connection:

if r.opts.SyncAof {
    go r.sendReplconfAck()
    go r.receiveAOF()
} else {
    r.client.Close()
}

Redis 端连接断开后会按 replica 断连路径清理 client:CLIENT_SLAVE cleanup 分支,并从 server.slaves 删除:listDelNode(l, ln)。因此 RDB 接收完成后,源端不会继续为这个连接积压 output buffer。

RDB 传输期间的正常增量积压仍然存在,这是 full sync 本身的行为,这个 PR 没有改变这部分行为。

总结一下:这个 PR 只是把 RDB 接收完成后的无效 AOF 缓存去掉,没有引入额外的源端 output buffer 积压问题。


补充:后续也可以考虑对支持 REPLCONF rdb-only 1 的 Redis / Valkey 版本做能力探测和适配。

这个语义会把复制连接标记为只需要 RDB snapshot、不需要 replication buffer:rdb-only 解析canFeedReplicaReplBuffer() 跳过该 client。这可以进一步减少 RDB 传输期间的复制缓存开销。

这部分这个 PR 先没有做,主要是因为它需要增加能力探测和兼容分支,改造范围会比当前问题大不少。我希望这个 PR 先保持小而确定:只修复 RDB 接收完成后继续缓存无消费者 AOF 的问题。

@suxb201 suxb201 merged commit 650e49a into tair-opensource:v4 May 18, 2026
10 checks passed
@DCjanus DCjanus deleted the fix/sync-aof-false-no-backlog branch May 18, 2026 09:28
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.

3 participants