root ced322123a 修复订阅快照过期误判,并加固下载解析与完成通知
过期判定(真实缺陷):
- 节点原先按内容里的 generatedAt 判过期,而 revision 是内容寻址的。内容长期不变时
  主站每分钟重发同一 revision 会被判为 APPLY_OLD 直接丢弃,新鲜度永远停在首次接收
  那天——于是主站明明在线且持续同步,备机仍在第 7 天开始返回 503。
- 改为按「最近一次成功接收并校验通过的主站快照时刻」判定:同 revision 重发会刷新
  新鲜度;重启时以落盘内容的生成时间作为起点,避免重启即续期。
- 该时刻取自节点本地时钟、不参与签名,重放旧 revision 无法续期。

下载 HTTP 服务:
- 请求行改按 ISO-8859-1 显式解码(原依赖平台默认字符集)。
- 查询串与键值拆分的 split 加 limit=2:参数值含 '='(如 base64 padding)不再被截断。
- sendFileRange 缓冲 1 KiB -> 64 KiB,降低大包下载的系统调用开销。

队列上报与通知:
- server/node 通道加 volatile;主站未连接或通道失效时跳过状态上报,不再以 NPE 形式
  被外层 catch 吞掉后每 5 秒刷一条 error(队列保留,等重连重放)。
- 无待上报任务时不再发送空数组。
- 已下载完成的通知移出 addToQueue 的持锁路径并改为异步,避免同步 HTTP 卡住节点主锁;
  且仅生产构造启用,测试不外呼。

已下载完成的重复校验:
- 归档校验结果按「路径 + 大小」缓存(大小变化或超一小时才重算),避免重连时把所有
  未完成任务整包读取重算 CRC。

测试:13 项全过(新增 MultiThreadedHTTPServerTest 5 项;SubscriptionSnapshotStoreTest
增加「同 revision 重发续期」「超期未收到推送才过期」;DownloadCheckServiceTest 增加
有效归档跨重复入队判定一致)。
2026-09-21 16:17:02 +08:00
S
Description
No description provided
349 KiB
Languages
Java 100%