root
|
0aae2da92f
|
补全原生存储节点 Netty 处理器反射元数据
|
2026-09-26 12:56:30 +08:00 |
|
root
|
77f817d402
|
修复主站通道引用被误清空导致任务状态永久卡住
问题:主站重连期间节点先后认证多条通道,引用被最后一条覆盖;那条通道断开后
引用被清空,而更早建立、仍然可用的通道继续发送可用性探测。节点因引用为空不再
上报任何任务状态,主站又能在旧通道上收到探活响应,双方都判定连接正常。于是
未完成任务永久停在「已提交」,只有人工触发重连或重启主站才会恢复。
现场证据:gid 4203383 于 19:31 创建、19:32 归档完成,节点此后每 5 秒扫到
status=4,却再未打印过「任务状态发送完成」;主站侧 17:23 之后一条「下载进度」
都没有。20:28/20:29 两次收到任务下发时节点判定 server 为空而静默丢弃。
修复:
- 新增 PrimaryChannelTracker 统一管理主站通道引用,并保留全部已认证通道。
首选通道失效时立即回退到其它仍可用的已认证通道;引用被清空时,已认证通道上
的下一条消息即可恢复它。认领口径严格等于主站实际会发的消息类型(身份/任务下发/
删除/探活/订阅快照),备机身份与节点自身出站类型都不算证据。
- 新增 RekickPolicy:有待上报任务却无可用通道时,以 30 秒为限流间隔主动重新
唤起主站,不再干等最长半小时的探测周期。阻塞式探测投递到独立线程,避免占用
5 秒调度线程拖住下载扫描与压缩。
- 通道不可用时的告警与重连判断放在 downloadCheck 之前,但不提前返回,
本地下载与压缩必须继续推进;否则正在下载、进度无变化的任务会走「无需上报」
的提前返回路径,通道失联后既不告警也不重连,正是历史事故的成因。
验证:新增 13 项测试(通道引用自愈 6、事故场景复现 3、重连限流 4),
节点侧合计 28 项全绿。已部署到存储节点并与主站重新握手,双向报文正常,
未完成任务数归零。
|
2026-09-21 22:17:14 +08:00 |
|
root
|
6a97e403ba
|
netty 按需声明,去掉用不到的模块
netty-all 是聚合 pom,会拖进 35 个模块:osx/aarch64/riscv64 的 epoll 与 kqueue
native、codec-http3/mqtt/redis/smtp/stomp/xml/protobuf、transport-rxtx/sctp/udt
等,而节点只用 ServerBootstrap/Bootstrap/NioEventLoopGroup/NioServerSocketChannel/
NioSocketChannel/ByteBuf/ByteToMessageCodec/LengthFieldBasedFrameDecoder。
收敛为 transport + codec(buffer/common/resolver 传递引入)。节点侧未使用
handler 模块的类,故不声明。4.1 无独立 codec-base,编解码基类在 netty-codec。
效果:lib 16MB -> 13MB,netty 模块 35 -> 5,进程 RSS 171MB -> 约 155-162MB。
15 个测试全绿,重启后与主站长连接正常重建(主站日志确认「存储节点上线」)。
hutool 未动。
|
2026-09-21 17:27:22 +08:00 |
|
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 |
|