#12932·neon

计算: 跨条纹边界的多块预投批次的硬路由错误

作者: reatcat创建于 2026年8月11日更新于 2026年8月11日

□ 问题

在`prefetch register bufferv ()'(pgxn/neon/ communicationtor.c)中,在登记多块批次时,每个块的硬数从base块的标记中计算:

页:1 hashkey.buftag = hashkey. 插槽 - > shard no = 得到 shard 数字( &tag); // <-- 'tag' 在循环中从未前进


`tag'是批次中第一个区块的标记,在登记环中从未提前过,而`get shard number()' hashes`blockNum / strade size'。 当多块请求批次跨越了硬条纹边界时,边界外的块被分配到基块的硬条号并被发送到错误的页码硬条连接上.

□ 触发路径( PG 17 read- stream API)

相继扫描

  • read stream begin relation () [接通/heap/heapam. 页:1

  • StartRead Bafers ()/等取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取 页:1

  • smgrreadv( 块 > 1)

  • 霓虹网 readv () [pgxn/neon/pagestore smgr.c] (中文(简体) ).

  • 通信器 read at lsnv () [pgxn/neon/completor.c]

  • prefetch register bufferv (., is preftch=false) (中文(简体) ).

  • prefetch do request () - > page server- > send(错误 shard no)


□可观察症状

1. 方向错误的请求到达一个不拥有该页面的租户的寻呼机。 Pageserver在`pageserver misrouted pagestream requests total'中计算,并放弃了UNOUT发送回复的连接(`PageStreamError:Reconnect',"Getpage@lsn request routed to wrong shard"在`pageserver/src/page service.rs'中).
2. 计算器检测断开,丢弃所有飞行中预发装置(`Getpage prefetch discards total'),一次重复读取一个区块。 单块重试从正确的块数中计算出硬块,所以可以自愈:尽管路由错误,查询还是成功.

净效应是每当矢量多块读出横跨条纹边界时——即在对被磨损的承租人进行普通相继扫描时——反复接通倒/再接通并浪费回程.

□再现.

将一个租户打入两个分页机上,其条纹尺寸不是已读批量大小的倍数(例如:质地71对最多为16个分页的分页机的分页机,用 " io combine limit " ),写出一个横跨多条分页的表,然后用 " shared buffers " 宽到16个分页的分页机来回读取。 在扫描过程中,“页面服务员-misrouted pagestream requests total”和“getpage prefetch discards-total”都有所增加。 此复制的可机器验证版本被包括在#12931中作为回归测试.

□ 修补

从每个块标记中计算硬度 : “ get  shard  number( & hashkey.buftag) ” — 见 # 12931.

内容来源: neondatabase/neon