root
|
776eb8cf53
|
修复 GraalVM 25 原生构建中的 commons-logging 初始化
|
2026-09-26 12:45:30 +08:00 |
|
root
|
e03a2e007b
|
netty 按需声明,并记录 jar 运行期的低内存调优
netty-all 是聚合 pom,会拖进 5 个平台的 native-quic、各架构的 epoll/kqueue/
io_uring 传输以及 htt3/mqtt/redis 等一堆用不到的 codec。主站实际只用
Bootstrap/NioEventLoopGroup/NioSocketChannel/ByteBuf/ByteToMessageCodec/
LengthFieldBasedFrameDecoder/LoggingHandler/Promise,因此收敛为
transport + codec-base + handler(含 buffer/common/resolver 传递依赖)。
效果:jar 68.1MB -> 52.2MB,netty 模块 50 -> 7,进程 RSS 291MB -> 约 227MB。
433 个测试全绿。hutool 未动。
同时把 jar 运行期的 systemd JVM 参数与前后实测数据记入
docs/MEMORY_TUNING_2026-09-21.md,避免这些只存在于服务器 drop-in 的参数
在下次重新部署时丢失。
|
2026-09-21 17:27:17 +08:00 |
|
root
|
5f1066cdab
|
去掉订阅快照的周期性重发
节点侧已改为按「收到主站的任何消息」判定新鲜度(过期 ⇔ 主站失联),
主站每 30 分钟的可用性检查即可持续刷新,因此主站不需要任何为续期的周期性推送。
- 删除上一版加入的 scheduledSubscriptionKeepalive(6 小时一次)。
- 保留「内容变化即推」(各处 requestSubscriptionSync)与「节点上线即推」
(initChannel),两者覆盖变更下发与节点冷启动两种场景。
- 移除对应的 standby 保活配置项。
最终推送时机:只在订阅内容变化时推送,另在节点上线时补推一次;
空闲时零快照传输(此前 60 秒一次时为约 486 MiB/天)。
测试:433 项全过。新增 SubscriptionSnapshotPushTest 锁住两条约定——
RemoteService 不得再有定时任务(续期改由节点存活信号承担),以及订阅刷新成功后
仍必须触发一次推送(用真实 refreshDueAccounts 调用验证)。
|
2026-09-21 16:49:55 +08:00 |
|
root
|
e3d4220997
|
订阅快照改为变更即推,并加低频保活
原先主站每 60 秒无条件重建并推送整份快照:实测 12 账号时传输约 346 KiB/次、
约 486 MiB/天,节点每次都要 base64 解码、SHA-256、gunzip、JSON 校验后判
APPLY_OLD 丢弃。而 revision 是内容寻址的,订阅不常变动时这些推送纯属浪费。
改为:
- 内容变化即推:各处已有的 requestSubscriptionSync()(刷新成功、绑定/改绑、
重置 Key、增删停用账号、过滤开关变更)保持原样,延迟仍在数秒内。
- 低频保活:新增 scheduledSubscriptionKeepalive(),默认 6 小时一次,仅用于刷新
节点「最近收到快照」的时刻。节点的过期判定依据该时刻(见 storageNode 侧修复),
因此保活周期必须远小于节点 SubscriptionMaxStaleSeconds(默认 7 天)。
- 节点上线即推:initChannel 保持推送一次,覆盖节点刚重启、本地尚无快照的情况。
空闲流量约 486 MiB/天 -> 约 1.4 MiB/天(约三个数量级)。
测试:432 项全过。新增 SubscriptionKeepaliveTest 锁定不变量——保活入口必须存在,
且周期小于节点有效期的 1/4、初始延迟小于一个周期;否则节点可能在两次保活之间判过期。
|
2026-09-21 16:36:13 +08:00 |
|
root
|
42921ba97b
|
修复多处隐患并做低风险性能优化
缺陷修复:
- GalleryUtil.parseGid 只捕 IndexOutOfBoundsException:非数字段抛 NumberFormatException、
link 为 null 抛 NPE,都会穿透成 500(按链接查询直接把用户输入喂进来)。现统一返回 null,
由调用方转成业务失败。
- 图片索引缓存不是整体生效:先写 gidToKey 再逐页写 ImageKeyCache,中途失败会留下
「gidToKey 命中但页 key 缺失」的半截缓存,后续请求直接返回已缓存而永远取不到图。
现任何异常都回滚已写入部分,并识别历史半截缓存自动重建。
- 全站请求日志把 AuthCode 明文记入 INFO,改为只记 present/absent。
- selectEnableAuthCode 的 SQL 与全量查询完全相同(都无 isEnable 条件),停用用户的
授权码刷新后仍放行,isEnable 形同虚设;补齐条件并允许 null 按默认 true 处理。
- /validate 手工 String.format 拼 JSON,用户名含引号或反斜杠会产出非法 JSON,
前端 JSON.parse 失败;改用 ObjectMapper 组装。
性能与并发:
- Netty IO 线程不再直接做 JDBC:节点上报的任务状态改由单线程顺序执行器落库与推送,
既不打乱「按上报顺序覆盖状态」的语义,也不阻塞心跳与响应。
- 取订阅不再等待第三方归属地查询:先以 unknown 落库并立即分发,归属地由后台线程补齐。
- 搜索关键词与分页参数按 UTF-8 编码,&、#、中文不再破坏上游查询串。
- selectAllGallery 的收藏标记由 O(n*m) 嵌套循环改为集合查找。
- 复用 CustomUtil.objectMapper(8 处 new ObjectMapper);gid2MpvKey 改为有界 LRU(2048);
缩略图清理排序不再每次比较都重读文件属性;FileDownload 关闭响应流,避免大文件下载的
临时文件堆积到 Full GC;移除从未使用的 downloadThread 线程池。
测试:431 项全过(新增索引回滚、半截缓存重建、用户名特殊字符、畸形链接查询、
搜索编码、分发不等待定位、批量收藏标记等用例;异步状态处理用例加 awaitStatusApplied
屏障保持断言确定性)。
|
2026-09-21 16:17:17 +08:00 |
|
root
|
584db277a6
|
登录方案文档更新为全部完成并记录独立复验结论
|
2026-09-21 11:25:49 +08:00 |
|
root
|
628f3ad0a2
|
登录方案:确认复用 /login 并一次返回两条链接,密钥已入库
|
2026-09-21 10:33:00 +08:00 |
|
root
|
dfb647bcd3
|
登录方案文档更新为已实施状态,补机器人侧票据规格
|
2026-09-21 10:23:26 +08:00 |
|
root
|
00e27152fe
|
新增一键登录:共享密钥自签票据换会话
- 新增 PanelLoginTicket:v1.<时间戳>.<HMAC-SHA256> 形状,只验签与时间窗,
不发一次性状态。机器人用同一把密钥本地签发,因此不需要机器人到主站的网络调用,
一端临时不可达也不影响生成链接。窗口内可重放(用户明确接受),过期即失效。
- PersonalController 新增 GET /login?t= 换 HttpSession(先作废旧会话防固定攻击)、
/login/logout 退出、/personal/denied 提示页。
- PersonalInterceptor 放行「有效会话或 AuthCode=alone」,拒绝时回 401 供前端区分;
InterceptorConfiguration 排除登录端点与 /personal/。
- server.servlet.session.cookie.path 固定为 /:nginx 会把 /user 改写成 /personal/user,
沿用容器推导的 /personal 会让浏览器判定路径不匹配而丢会话。
- 密钥经 PERSONAL_LOGIN_SECRET 环境变量注入,为空时一律拒绝而非放行。
- 新增 PanelLoginTicketTest(7 项)与登录/退出/会话相关用例,共 423 项通过。
|
2026-09-21 10:20:51 +08:00 |
|
root
|
654181d2ea
|
登录方案对齐 PersonalHub 既有实现
|
2026-09-21 10:03:35 +08:00 |
|
root
|
bee2f11fd6
|
移除文件管理与文件分享,接口范围收敛到订阅与用户管理
- 删除 /personal/files、uploadFile、private/**、compress、delete 与对应服务实现,
连同压缩线程池、TAR 打包与 PersonalArchiveTest
- 删除 /personal/share、extendShareTime、cancelShare 与 /GetFile/{path},
以及 ShareFile 实体、ShareFileMapper、PublicService.GetFile、每天四点的
checkShareCode 定时任务和分享码失败黑名单
- CustomBean 去掉 ShareFile 的 Native 反射登记
- 同步收敛 PersonalServiceTest、PublicServiceTest、PersonalControllerTest、
PublicControllerTest、LocalServiceTest 与三个画廊测试
- 文档同步,并附上 /login 方案 docs/login-command-plan.md
测试:mvn -o test 410 项通过
|
2026-09-21 10:02:07 +08:00 |
|
root
|
305036ddfe
|
新增下载人查询接口,并把管理员判定收敛到服务端
- Gallery 增加 downloaderName,仅在管理员查询任务列表时填充;普通用户
既不获取也不下发他人身份
- 新增 GET /GalleryManage/downloader?gid=&AuthCode=,按 gid 返回实际下载人
昵称,非管理员一律拒绝
- /validate 下发 isAdmin,前端不再各自硬编码 userId === 3
- 管理员判定统一走 UserService.ADMIN_USER_ID
- 补充列表填充、按 gid 查询的权限与缺任务分支测试
|
2026-09-20 22:54:23 +08:00 |
|
root
|
d949415e4d
|
分散刷新后补上备机同步
原实现中「全量刷新 → 通知备机同步」是同一步的两个动作:refreshAll()
由调用方跟一次 requestSubscriptionSync()。改为按账号分散刷新后,调度器
自己没有触发同步,刷新出的新缓存要等到下一次周期同步才可能送到备机。
生产上每 60 秒有一次周期同步兜底,所以影响被限制在最长约一分钟的滞后;
但这属于重构时漏掉的语义,且一旦把周期同步间隔调大就会变成真实缺口,
因此仍按原语义在刷新到内容后立即触发同步。没有账号到期时不打扰备机。
测试 441 通过。
|
2026-09-15 16:27:29 +08:00 |
|
root
|
3adb42c538
|
订阅刷新改为每账号错峰,保证 24 小时内各刷一次
原先每 24 小时一次性刷新全部子账号:12 个账号在 16 秒内背靠背发完
24 个请求,且 @Scheduled(fixedRate) 未设 initialDelay,首次触发即立刻
执行,导致每次重启都重刷一遍全部账号——上游看到的请求密度实际取决于
部署频率。请求头也只带 HttpClient 默认值,上游收到的是
"Apache-HttpClient/5.6.4 (Java/25.0.4)"。
改为高频轻量 tick(5 分钟,延迟 2 分钟启动),只刷新已到期账号,单轮
最多 2 个。24 小时保证由三层构成:成功后按「成功时刻 + 窗口 − 一个 tick」
推进相位,使分散效果自我维持;到期时刻持久化在数据库,停机期间错过的
账号恢复后立即到期;兜底把被写到超过一个窗口之后的计划判为损坏并立即
刷新。失败用固定间隔重试(数据库没有连续失败次数字段,做不出真正的指数
退避),重试排在将来时被尊重,避免故障账号每个 tick 重打上游。从未成功过
的账号按 tick 间隔尽快刷,已有缓存的按窗口分散。超过两倍窗口仍未成功的
账号推送告警。
请求头按账号与订阅格式确定性地伪装成 mihomo/clash-verge/v2rayN 等真实
客户端身份;同一账号固定用同一身份,逐请求更换反而更像机器。实现前已
实测确认显式设置 Accept-Encoding 不会破坏 HttpClient5 的透明解压。注意
这只能伪装到 HTTP 头,TLS 指纹仍与真实客户端不同。
新增 next_refresh_at、last_success_epoch 两列,均为 Epoch 毫秒整数:SQLite
的 CURRENT_TIMESTAMP 写 UTC 文本而被 JDBC 按本地时区解释,实测偏差 8 小时,
不能用于时间比较。迁移为纯新增列,旧二进制忽略它们,故回滚程序无需回滚
数据库;回填 last_success_epoch 必须执行,否则既有账号会被当成从未成功过
而集中补刷,正好复现本次要消除的爆发。
同时移除 LocalService 的 24 小时全量入口与 refreshAll()(它们正是爆发式
写法),并将调度线程池由默认 1 调到 2,避免刷新阻塞连接自检。
测试 439 通过,指令覆盖率 82.1%。
|
2026-09-15 16:15:41 +08:00 |
|
root
|
a0959618ca
|
修复 Jackson 3 迁移引入的看图 500,并大幅补充单元测试
生产缺陷(2026-09-14 Spring Boot 4.1.1 / Jackson 2→3 迁移引入):
- GalleryUtil.parseImageKeys 解析 mpv 页 imagelist 时,行尾分号属 JS 语法,
Jackson 3 默认 FAIL_ON_TRAILING_TOKENS=true 会抛 StreamReadException。
改为先由 parseImagelist 剥掉 JS 语句外壳(前缀 + 行尾分号)再交给 JSON 解析。
已用线上真实页面验证:修复前必抛异常,修复后正确解析出 154 页 imgkey。
- GalleryManageService.cacheImagesKey 只 catch IOException,而 Jackson 3 的
JacksonException 继承 RuntimeException,异常穿透 Controller(无 @ControllerAdvice)
表现为 HTTP 500。改为同时兜 JacksonException 并按业务失败返回。
同时用 parseGidFromLink 拦住段数不足的畸形链接(原先会抛
ArrayIndexOutOfBoundsException 变成 500)。
既有行为修正:
- PersonalService.deleteFile 原先依据 hutool FileUtil.del 的返回值报成功,
而该函数对不存在的目标返回 true,导致路径写错也显示「删除成功」;
改为先校验存在性,不存在则回「文件不存在」。
- PersonalService.getFiles 的 listFiles()==null 分支原先报「文件夹为空」,
但该返回值只在 I/O 出错时出现,会掩盖权限/磁盘问题,改为「读取文件夹失败」。
测试:143 → 379 用例,指令覆盖率 36.2% → 80.2%(分支 34.6% → 69.8%)。
新增控制器(MockMvc standaloneSetup)、服务层、拦截器/过滤器、WebSocket、
配置装配与 MyBatis AOT hints 的测试;全部离线可跑,不加载 Spring 上下文、不连库、不占端口。
|
2026-09-15 13:42:22 +08:00 |
|
root
|
a288846552
|
收紧 GalleryManage 子路径鉴权并更新项目说明
|
2026-09-14 19:17:23 +08:00 |
|
root
|
850819ed86
|
新增 .gitignore:忽略构建产物、本地日志与 IDE 文件
规则来自 storageNode 现有模板(39 行,含 maven-wrapper.jar 的 ! 例外),
并追加 run.out / *.log(后端与 storageNode 本地都会产生运行时日志)。
application.yaml 与 .mvn/wrapper 均被跟踪,不受影响。
|
2026-09-14 15:38:48 +08:00 |
|
root
|
576092578d
|
修复越权删除、畸形链接 500 及两处 NPE
修复上一提交的测试所发现的缺陷。
1) 越权删除(安全,最严重):deleteGalleryByGid 的授权条件是
`!(collector.isEmpty() || collector.size()==1 && ...)`。当画廊无任何收藏时
collector.isEmpty() 使整个条件短路放行,下载者身份完全未校验,
任意有效授权码用户都能删除他人任务记录(无收藏正是最常见情形)。
改为与提示文案一致的判定:被别人收藏 或 请求者不是下载人 即拒绝。
2) 被拒请求仍删除节点文件且对外显示成功:remoteService.deleteGallery 原先位于
授权判断之外,即使拒绝也会向节点下发删除指令;且 switch 中 case 0 的
response.success() 会覆盖先前的 failure。现改为授权失败即提前返回。
3) 畸形链接导致 500:link.split("/")[4] 段数不足抛 ArrayIndexOutOfBoundsException,
而只捕获 NumberFormatException;项目无 @ControllerAdvice,异常穿透为 500。
抽出 parseGidFromLink() 统一把 null/段数不足/非数字转成业务失败。
4) Response.isSuccess()/getData()/get() 在键缺失时抛 NPE,改为安全返回
(isSuccess 视未设置为失败)。deleteGalleryByGid 也显式处理节点无响应(-1),
原先该分支不设置 result,末尾 response.get("result") 会 NPE。
5) getWeekUsedAmount() 在配置行缺失/值非法时给默认 0,不再 NPE。
验证:新增/改写回归用例后 143 项测试全过;并用真实数据做了新旧对照实测——
取 downloader=4 且无收藏的任务,以 id=25 用户的授权码删除:
旧 jar:数据库记录被删(count 0),随后 500;
新 jar:记录保留(count 1),返回「你不是下载人」并被拒。
覆盖率的 GalleryManageService 由 40.1% 升至 45.8%。
|
2026-09-14 15:23:42 +08:00 |
|
root
|
213ed4e7f6
|
补充测试用例并接入 JaCoCo 覆盖率统计
原 8 个测试类、16 个用例,指令覆盖率仅 16.9%,协议编解码、
鉴权拦截器、UA 分流过滤器、子账号业务规则等高风险代码完全未覆盖。
接入 JaCoCo(pom 增加 jacoco-maven-plugin 0.8.13,test 阶段出报告)。
新增 9 个测试类、118 个用例,测试总数 16 -> 134,全部通过:
- Message.MessageCodecTest(12):8 种消息的帧格式与往返;
锁死帧头 [类型 1B][长度 4B][JSON]、@JsonIgnore 的 path 不外泄、
多字节 UTF-8 按字节计长、未知类型静默丢弃、编解码器间不共享状态。
- Interceptor.TaskHandlerInterceptorTest(11):授权码放行/拒绝两侧,
含空值、空白、前后缀、大小写、列表含 null 等必须拒绝的形态,
以及 updateAuthCodes 后被吊销授权码立即失效。
- Filter.AdaptorFilterTest(9):桌面放行 / 移动 UA 跳转 /validate 例外 /
无 UA 既不跳转也不放行 / AuthCode=alone 透传与不泄漏非 alone 授权码。
- Service.SubServiceTest(24):子账号增改删的校验与落库边界、
绑定与改绑的前置条件、key 生成冲突重试、公开订阅的 404/400/503 分支。
- Service.GalleryManageServiceTest(19):任务创建校验、节点离线、
查询/重试幂等、删除的授权与节点回执分支。
- Util.CustomUtilTest(17):体积换算双向互逆与档位边界、时间格式化、
端口探测与占用回退、404 输出容错。
- Util.GalleryUtilTest(15):链接校验、gid 提取、取图失败的降级返回 null、
请求体契约字段、mpvKey 缓存命中不刷新。
- Util.ResponseTest(11):result/data 字段契约、结构化数据不被双重转义、
实例间不共享状态、非 ASCII 输出仍是合法 JSON。
覆盖率:指令 16.9% -> 35.5%,分支 -> 32.6%。
TaskHandlerInterceptor/Response 100%、CustomUtil 99%、MessageCodec 94.6%、
AdaptorFilter 94.4%、SubService 78.1%。
测试过程中发现 3 处既有缺陷,均未擅自修改生产逻辑,改为在测试中
显式断言现状并注明「若断言失败说明已修复」:
1) GalleryManageService.deleteGalleryByGid:当画廊无任何收藏时
collector.isEmpty() 使授权条件短路放行,**未校验下载者身份**,
任意有效授权码用户可删除他人任务记录。
2) 同一方法:remoteService.deleteGallery 位于授权判断之外,被拒请求
仍会向节点下发删除指令;且 switch 中 case 0 会 response.success()
覆盖先前的 failure,对外表现为成功。
3) createTask:link.split("/")[4] 段数不足抛 ArrayIndexOutOfBoundsException,
而只捕获 NumberFormatException,且项目无 @ControllerAdvice,会穿透为 500。
另有 Response.isSuccess() 在未设置 result 键时 NPE、
getWeekUsedAmount 在配置行缺失时 NPE,一并记录。
|
2026-09-14 15:04:52 +08:00 |
|
root
|
d5b97b82a0
|
升级剩余依赖并将 HttpClient 4 迁移到 5
- HttpClient 4.5.14 -> httpclient5 5.6.4(Boot 4.1.1 托管版本):
HttpClient 4.x 最后一次发布是 2022-11,已 EOL,且 Boot 自 3.1 起不再管理它;
httpmime 一并移除(httpclient5 已内置 multipart)。
代码迁移 3 个文件(LocalService、SubscriptionRefreshService、GalleryUtil):
包名 org.apache.http.* -> org.apache.hc.client5.http.*;HttpClient 5 用
response.getCode() 取代 response.getStatusLine().getStatusCode();
RequestConfig 的 socket 读超时改名 setSocketTimeout -> setResponseTimeout,
超时参数改为 Timeout.ofMilliseconds(...)。
MultipartEntityBuilder/EntityBuilder 仍在,仅换包名,行为不变。
- java-telegram-bot-api 7.9.1 -> 10.1.0(跨 3 个大版本)。本项目只用到
new TelegramBot(token)、new SendMessage(chatId, text)、bot.execute(msg),
已核对 10.1.0 的构造器与 execute 签名均兼容。
- hutool-all 5.8.26 -> 5.8.47;commons-compress 1.26.1 -> 1.28.0。
验证:mvn test 16 项全过(注意单测对 HTTP 是 mock,不能证明迁移后的真实网络路径);
另外做了针对性验证——隔离实例上 POST /personal/subBind/accounts/1/refresh 触发
真实上游下载,经迁移后的 httpclient5 成功取回 127,379 字节订阅并写入隔离缓存目录
(生产目录未被触碰);另用等价配置的 httpclient5 客户端实拉 https://example.com
返回 200 且正文可读。启动 5.09s、各接口正常、日志无 httpclient 相关异常。
|
2026-09-14 14:23:23 +08:00 |
|
root
|
4623fca8b0
|
升级到 Spring Boot 4.1.1 并迁移 Jackson 3
- 父 POM 3.3.2 -> 4.1.1;spring-boot-starter-web 改名为 webmvc;
mybatis-spring-boot-starter(-test) 3.0.3 -> 4.1.0(对标 Boot 4)。
- Jackson 2 -> 3:databind/core 包名改为 tools.jackson.*(注解仍在
com.fasterxml.jackson.annotation,无需改动)。Boot 4 移除了
JsonProcessingException,PersonalController.ip() 实际不抛该异常,去掉声明。
- @ServletComponentScan 迁移到 org.springframework.boot.web.server.servlet.context。
- 顺带修复无 Boot 关联的漏洞:jsoup 1.15.3 -> 1.23.2(CVE-2026-71497)、
commons-io -> 2.22.0(CVE-2024-47554)、lombok 对齐托管版 1.18.46。
- native-maven-plugin 0.10.3 -> 1.1.8(Boot 4.1.1 托管版本)。
注意:原生构建仍需 GraalVM/JDK 25,本次仅验证 JVM 运行。
验证:mvn test 16 项全过;隔离冒烟(真实库副本、独立端口)通过——
Tomcat 11 启动 4.5s、/ 302、/GalleryManage 200、订阅分发 /sub/v2|cat 字节数与
3.x 一致、WebSocket 升级 101、@ServletComponentScan 过滤器生效、
与 storageNode 的 Jackson 2.15.2 线上格式双向兼容。
|
2026-09-14 13:44:03 +08:00 |
|
root
|
f5ef8ca487
|
修复测试构造与 commons-io 版本不匹配
- RemoteServiceTest 原先调用 ResponseMessage(int, byte),主源码中不存在该构造器,
导致测试源码无法编译;改为在测试内用 setter 组装。
- commons-compress 1.26.1 依赖 commons-io 2.15.1 的 IOUtils.skip(InputStream,long,Supplier),
而 POM 钉在 2.11.0,任何 tar 读取都会抛 NoSuchMethodError;commons-io 升至 2.15.1
(同时覆盖 CVE-2024-47554)。
后端 mvn test 16 项、storageNode 5 项、桌面前端 9 项全部通过。
|
2026-09-14 13:36:45 +08:00 |
|
root
|
50e513b8cc
|
记录审查修复提交与离线编译验证事项
|
2026-09-08 12:51:59 +08:00 |
|
root
|
d3b18f90fa
|
修复图片Key缓存冷启动并关闭异常HTTP响应
|
2026-09-08 12:50:44 +08:00 |
|
root
|
a9ba631847
|
补齐连接反复断开和缓存失败重试边界
|
2026-09-08 12:48:24 +08:00 |
|
root
|
60facae9b5
|
原子发布图片缓存并关闭下载和打包文件流
|
2026-09-08 09:30:23 +08:00 |
|
root
|
b15eeaf45e
|
统一节点请求生命周期并释放重连资源
|
2026-09-08 09:25:45 +08:00 |
|
root
|
1e6e3a1557
|
缩短订阅状态锁范围并拒绝过期刷新结果
|
2026-09-08 09:23:14 +08:00 |
|
root
|
7f823b6150
|
修复断点下载范围解析与读取越界
|
2026-09-08 09:21:01 +08:00 |
|
root
|
f65c5ad860
|
先保存下载任务再下发节点以保留即时状态
|
2026-09-08 09:19:47 +08:00 |
|
root
|
3c8be3e7c9
|
修复订阅访问IP记录缺失问题
|
2026-08-30 23:07:25 +08:00 |
|
root
|
fb327ba00c
|
降低订阅快照测试耦合并统一缓存路径
|
2026-08-30 10:41:55 +08:00 |
|
root
|
10e6d44570
|
修复订阅快照消息解码分支重复
|
2026-08-30 10:40:39 +08:00 |
|
root
|
44995afe78
|
修复订阅快照消息常量重复定义
|
2026-08-30 10:39:32 +08:00 |
|
root
|
bc4ee64a83
|
修复订阅备机同步的一致性与重试问题
|
2026-08-30 10:34:19 +08:00 |
|
root
|
14dd12d9ad
|
增加订阅快照备机同步链路
|
2026-08-30 10:24:57 +08:00 |
|
root
|
fc8548f90f
|
支持多子账号订阅与独立节点过滤
|
2026-08-30 09:32:44 +08:00 |
|
root
|
9475237731
|
新增单个下载任务重试接口
|
2026-07-11 15:02:04 +08:00 |
|
root
|
ccc05fda19
|
优化任务通知格式并记录完成时间
|
2026-07-11 14:52:46 +08:00 |
|
root
|
72f8ab597a
|
移除 G1 垃圾回收器配置
|
2026-07-11 14:29:47 +08:00 |
|
root
|
5dd09e003b
|
修复未知节点任务状态导致的空指针
|
2026-07-11 13:31:14 +08:00 |
|