49 Commits
Author SHA1 Message Date
root 0aae2da92f 补全原生存储节点 Netty 处理器反射元数据 2026-09-26 12:56:30 +08:00
us9929 8e23231dc3 下载服务管理员口令移出源码并限定根目录
- 管理员直取文件的口令改由配置/环境变量提供(STORAGE_DOWNLOAD_ADMIN_CODE 优先),
  未配置即关闭该能力;不再有写死的 alone
- 口令比较使用固定时间算法,避免按前缀泄露
- 管理员请求路径限定在 AdminDownloadRoot 之下(默认 /root/gallery/gallery),
  ../、根目录之外绝对路径与符号链接逃逸一律 404
- 新增覆盖:口令开关、固定时间比较、目录约束与符号链接逃逸、配置读取
2026-09-23 01:16:31 +08:00
us9929 80b82121a1 加固下载服务与删除路径,补测试
- 8888 下载服务:加读超时、接受循环单次失败不退出;畸形请求行回 400 且不泄漏连接;
  Range 越界按文件末端夹取或回 416,非法 Range 不再中断处理
- 删除任务改为按根目录规范化校验,拦截 ../ 与绝对路径越界删除
- MessageCodec:先序列化再写帧头(不再产生半帧),并限制单帧长度上限
- 节点绑定端口等待结果,失败即抛出而非静默不监听
- 配置加载支持指定路径并对缺文件记录告警;完成通知对消息做 URL 编码并加超时
- 测试 28 → 76:新增协议编解码、节点消息处理与上报循环、备机订阅分发、
  gid 匹配、删除边界、配置加载等用例
2026-09-23 01:04:03 +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
chuzhongzai 6447a74e0c 增加项目结构文件 2026-06-07 15:42:57 +08:00
chuzhongzai b350b5bda9 优化: 代码清理、日志替换为Logback、依赖升级
- 修复 DownloadCheckService 局部锁无效的问题,改用 synchronized
  - 修复 storageNode 中 lock 未用 try/finally 保护的问题
  - 修复 BackupSubServer Get() 未关闭 HttpClient 的资源泄漏
  - 修复 MultiThreadedHTTPServer requestLine 无判空的问题
  - 删除各处的死代码/未用字段(channelFuture, promises, counter等)
  - 提取两个 HTTP Server 的公共方法到 CustomUtil(getRequestHeader, sendErrorResponse, sendFileRange)
  - MessageCodec 序列化改用 writeValueAsBytes 替代 valueToTree
  - 日志从 slf4j-simple 替换为 logback-classic,增加 10MB 轮转+保留10份
  - Lombok 升级至 1.18.40,新增 maven-compiler-plugin 注解处理器配置
  - GalleryTask 状态常量加 final,Config 异常改用 log.error
2026-06-07 15:37:59 +08:00
chuzhongzai 83476dded2 注册上次新增消息类型的反射信息 2026-01-23 20:59:18 +08:00
chuzhongzai b1a631f8b4 新增主动重连功能以及定时检测连接有效性 2026-01-20 22:28:45 +08:00
chuzhongzai 684cb608e2 修复添加任务时没有考虑到所有任务状态的问题 2025-09-07 20:26:45 +08:00
chuzhongzai 0b19a75d7b 监听唤醒端口允许漂移,防止唤醒端口被其他程序占用时无法实现唤醒 2025-08-31 14:10:49 +08:00
chuzhongzai 2caa383f06 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	src/main/java/lion/CustomUtil.java
2025-08-31 14:10:18 +08:00
chuzhongzai 912ae30ff0 监听唤醒端口允许漂移,防止唤醒端口被其他程序占用时无法实现唤醒 2025-08-31 14:08:04 +08:00
lion c84f11cd8f 修复判断是否下载完成逻辑错误 2025-08-29 16:16:59 +08:00
lion df6c39ba56 将线程池改为定时线程池 2025-08-28 10:30:38 +08:00
lion de19244ab8 Merge remote-tracking branch 'origin/master' 2025-04-26 23:59:43 +08:00
lion ceef2dae12 移除加密代理;新增备用订阅更新。 2025-04-26 23:59:28 +08:00
lion a8e61cba8f 修复检查下载状态之后使用错误的移除方法导致异常 2025-03-24 22:08:10 +08:00
lion c3b96414e9 将队列从list换成map,能够对任务去重;新增任务时会判断该任务是否下载完成;修改下载请求头; 2025-03-22 23:50:25 +08:00
chuzhongzai 95329a5603 将日志写入文件;升级依赖;将项目JDK设置为21;修改部分日志记录方式 2024-06-08 03:11:11 +08:00
chuzhongzai dd0b7e608c 去除不需要的任务状态;检查时对比进度是否变化,未变化则不推送进度;优化部分代码; 2023-12-28 15:54:55 +08:00
chuzhongzai f815acd334 更新反射文件 2023-12-27 18:01:55 +08:00
chuzhongzai 9b389d7756 去除格式转换,仅下载图片;去除图片查询,不再参与在线看 2023-12-27 17:34:29 +08:00
chuzhongzai 45a0cee73c 去除远程压缩;删除不再区分删除模式,直接全部删除;去除更新; 2023-12-23 13:22:41 +08:00
chuzhongzai 6d79278c74 去除远程压缩;删除不再区分删除模式,直接全部删除;去除更新; 2023-12-23 13:22:17 +08:00
chuzhongzai b185be1a1c 转向native-image;并入反代服务器;log4j更换为slf4j; 2023-12-06 12:56:52 +08:00
chuzhongzai cd6920b05a 新增远程压缩;修复图片缓存一直不更新的问题 2023-12-04 16:15:55 +08:00
chuzhongzai 55c28d358c 更新依赖;去除无用代码 2023-11-25 15:33:14 +08:00
chuzhongzai b0f27784dc 修复多线程同时修改任务导致状态有问题的bug;减小预览图像素;修改任务状态发送条件; 2023-09-14 11:35:31 +08:00
chuzhongzai fb5ff43364 当对应文件找不到的时候,尝试通过gid查找文件 2023-09-05 20:04:36 +08:00
chuzhongzai 8c0ca78dc6 加入心跳消息,50秒一次;加入转换线程,使得不需要等待转换完成也可以回传任务进度;检测主服务器请求改为检测域名而不是写死ip地址;加入临时任务队列,防止多线程读写同一个任务队列导致数据错误; 2023-09-05 20:03:23 +08:00
chuzhongzai d49ba48f2e 允许请求非webp图片;添加临时数组,防止下载线程与监听线程同时对任务数组进行操作 2023-08-27 16:17:01 +08:00
chuzhongzai c2c5c50a48 图片预览加入gif;禁止非反代ip下载文件;优化下载进度判断 2023-08-14 22:23:50 +08:00
chuzhongzai b1610d136b 上线时给服务器一个连接,使服务器连接自己 2023-08-08 15:27:28 +08:00
chuzhongzai 5d84ebd4ee 优化本子名字截取;下载线程出错时保存日志并退出 2023-08-05 21:44:33 +08:00
chuzhongzai cc6a19cf40 第一个版本 2023-07-30 17:51:41 +08:00