窗口内按 target / region 顺序应用动作,按字节计费
横条 = 一个窗口的时间轴:左段已计费,右段不再计费
已计费
quota 耗尽 → 下一窗口起点
target A
R1
R2
target B
R3
已计费
待处理
charge_target_from
charge_addr_from
下一个窗口跳过游标之前已计费的部分,从游标处继续
① 整个在游标之前
已计费
skip
cursor
② 跨过游标
已计费头部
待处理尾部
按 min_region_sz 对齐 split 出已计费的头部
③ 落在游标之后
region
不跳过,照常应用动作
窗口一:quota 只够处理 R1
R1
R2
quota 用满,游标停在 R2 起点
窗口二:游标有效
R1
跳过 R1
R2
R2 = last region
到达 last region 仍无条件 skip
并重置游标
charge_target_from = NULL · charge_addr_from = 0
R2 从未被处理,却被永久漏掉
游标一被重置,窗口就在两种状态之间打转
无游标 · 从 R1 重新计费
quota 用满 · 游标停在 R2 前
下一窗口:跳过 R1
到达 R2 · skip + 重置游标
R2
从未被计费
再转一圈,R2 仍然轮不到
到达 last region 时只做一件事
last region
只重置游标
跳过与否,交给位置关系判定(与普通 region 同一条路径)
charge_target_from = NULL · charge_addr_from = 0
修复后 · 窗口二
R1
跳过 R1
R2
R2 整个在游标之后
不跳过,照常应用 scheme 动作
R2 被计费
窗口一
R1
R2
R2 留给下一个窗口
窗口二
R1
R2
R1 已计费 → skip
region 覆盖
2 / 2
R1、R2 都被处理
没有 region 因为到达 last region 被无条件跳过
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x