root
|
c76af43b7c
|
备机新鲜度改由「主站任何消息」判定,不再依赖快照推送
问题:过期语义是「主站失联」,但节点手里的时间戳是「最近一次收到快照」。
快照是内容寻址的,内容长期不变时主站没有理由重发整份快照;若以收到快照为准,
备机会在内容不动的第 7 天误判过期。此前在主站侧加的「低频保活推送」正是为了
绕过这个缺陷——它让主站为避免节点过期而周期性传输约 346 KiB 的快照。
改为在节点侧接受更本质的存活信号:
- SubscriptionSnapshotStore.lastSyncAt -> lastPrimaryContactAt,并新增
markPrimaryContact();isStale() 依据它判断,语义变为
「过期 ⇔ 主站失联超过 SubscriptionMaxStaleSeconds」。
- storageNode 在收到主站通道的任何消息时刷新该时刻,不限于订阅快照。
主站本就有每 30 分钟的 AvailableCheckMessage,对 7 天有效期有 300 余倍余量,
因此不再需要任何为「续期」而生的专用推送。
- 重启仍以落盘内容的生成时间为起点,避免重启即续期。
测试:15 项全过。新增「主站存活信号可在无新快照时保持订阅新鲜」与
「主站失联后仍必须判过期」两条,锁住新语义的两个方向。
|
2026-09-21 16:49:48 +08:00 |
|
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 |
|
root
|
de1e81d9b0
|
固定 Java 21 release 编译并更新项目说明
|
2026-09-14 19:17:23 +08:00 |
|
root
|
c27bdbf026
|
gitignore 追加 run.out:本地运行与 JUnit 测试日志
|
2026-09-14 15:38:48 +08:00 |
|
root
|
9798f0541a
|
升级依赖版本并移除未使用的 httpclient
安全修复:
- netty-all 4.1.101.Final -> 4.1.138.Final:4.1.101 存在多个已知 CVE
(netty-codec-http 修复线 4.1.108/4.1.125/4.1.129/4.1.132-4.1.137,
netty-common 修复线 4.1.115/4.1.118)。该组件直接面向主站与公网。
- commons-compress 1.25.0 -> 1.28.0(CVE-2024-26308/25710 修复于 1.26.0)。
- logback-classic 1.4.14 -> 1.5.38,slf4j 2.0.9 -> 2.0.19。
- jackson-databind 2.15.2 -> 2.22.2:留在 Jackson 2.x 线而非迁 3,因为本组件
负责解析并落盘快照数据,且与主站(已升 Jackson 3)的跨版本线上格式已实测兼容。
- hutool 5.8.26 -> 5.8.47;lombok 1.18.40 -> 1.18.48;junit 5.10.2 -> 5.14.4。
- native-maven-plugin 0.10.3 -> 1.1.8(配合 GraalVM 25)。
移除 org.apache.httpcomponents:httpclient 4.5.14:全仓库无任何引用
(HTTP 调用走 hutool 的 HttpRequest),且该线自 2022-11 起已 EOL。
验证:mvn test 5 项全过;隔离冒烟加载线上真实快照目录(53 个文件)——
Jackson 2.22.2 正确解析由 2.15.2 写出的 manifest,/health/subscription 报
state=ready、12 账号/12 绑定,/sub/v2 与 /sub/cat 分别 43024/125045 字节
(与升级前完全一致);与 Boot 4 主站(Jackson 3)端到端联调,
订阅快照 result=0(APPLY_SUCCESS)。
|
2026-09-14 14:02:30 +08:00 |
|
root
|
cbfd634f0d
|
修复压缩失败恢复并校验归档完整性
|
2026-09-08 09:18:21 +08:00 |
|
root
|
942aecf27c
|
修复订阅快照存储异常类型导入
|
2026-08-30 10:39:33 +08:00 |
|
root
|
922e7a2a61
|
修复订阅快照校验、回退与原生反射配置
|
2026-08-30 10:34:18 +08:00 |
|
root
|
347f2bec14
|
支持订阅快照备机同步与按用户分发
|
2026-08-30 10:25:00 +08:00 |
|
root
|
ad1d96290c
|
按 GID 查找画廊下载文件
|
2026-07-11 15:36:14 +08:00 |
|
root
|
ce21d8724e
|
重试任务时按 GID 重新检查并回传状态
|
2026-07-11 15:02:04 +08:00 |
|
root
|
8a56e9726f
|
按 GID 识别重复下发的已完成任务
|
2026-07-11 13:58:27 +08:00 |
|
root
|
3ab82509a0
|
删除任务时清理节点下载队列
|
2026-07-11 13:31:14 +08:00 |
|