SafeDisk AI

SUCC daemon.log 撑爆磁盘崩溃循环

当 embedding 模型下载失败后,watch 模式反复索引、反复写同一条错误,日志本身会触发下一轮索引。结果是 daemon.log 变成几百 GB,SQLite WAL 和锁文件也写不进去,看门狗重启后继续把磁盘打满。

SafeDisk Deep Cleanup

先止血,再决定哪些文件可以删。

如果日志、模型缓存、SQLite WAL 和项目目录混在一起,先保留证据并隔离日志洪水;需要人工判断时再用 $29 Deep Cleanup。

打开免费扫描 提交 $29 清理请求

先打断循环,不要先删库

  1. 先停 SUCC daemon 或 watch 保活进程,避免清理期间继续写入同一个 daemon.log
  2. 保存首尾少量日志:最早的 embedding fetch 失败和最近的 ENOSPC/WAL/lock 报错,比整份 281GB 日志更有价值。
  3. 把超大日志改名或移走,让 daemon 重新创建新日志;不要在进程仍持有文件句柄时直接删除。
  4. 把日志目录排除在 watch/index 范围之外,否则“写日志 -> 触发索引 -> 写更多日志”还会复发。
  5. 对 embedding 加熔断:连续失败后冷却 5-15 分钟,只记录一次聚合错误,并暂停索引重试。
  6. 对日志加硬上限:单文件大小、保留数量、同类错误每分钟最大行数,以及磁盘剩余空间低于阈值时停止写 DEBUG/ERROR 明细。

Windows 现场证据

<SUCC_DATA_DIR> 换成实际保存 daemon.log、SQLite 和缓存的目录。先读取元数据和少量首尾内容,避免打开几百 GB 文件。

$root = "<SUCC_DATA_DIR>"
Get-PSDrive -PSProvider FileSystem | Sort-Object Free -Descending
Get-ChildItem $root -Recurse -File -ErrorAction SilentlyContinue |
  Sort-Object Length -Descending |
  Select-Object -First 30 FullName,Length,LastWriteTime

Get-Content "$root\daemon.log" -Head 80 -ErrorAction SilentlyContinue
Get-Content "$root\daemon.log" -Tail 120 -ErrorAction SilentlyContinue
Get-ChildItem $root -Recurse -File -Include "*.sqlite","*.sqlite-wal","*.db","*.db-wal","*.lock" -ErrorAction SilentlyContinue |
  Select-Object FullName,Length,LastWriteTime

修复验收标准

Copy-ready GitHub reply

适合贴到 SUCC daemon.log 撑爆磁盘 issue。

这段回复把问题拆成止血、证据、产品修复和回归测试四块。

我会把这个当成“日志写入触发索引,再由索引失败写更多日志”的递归故障处理。修复点不只是轮转 daemon.log,还要让 embedding 下载失败进入熔断状态。

建议验收标准:

1. SUCC 的日志目录、SQLite WAL、lock、临时模型文件不进入 watch/index 范围。
2. Xenova/all-MiniLM-L6-v2 fetch failed 连续失败后进入冷却,比如 5-15 分钟,只写一条聚合日志 repeated=N。
3. daemon.log 在写入前检查 max size/保留数量,超过阈值先轮转;磁盘低水位时停止写详细 ERROR 明细。
4. 磁盘低水位或 WAL/lock ENOSPC 时 daemon 进入 degraded:暂停索引和模型下载,保留一条告警,不让看门狗马上高频重启。
5. 回归测试覆盖:断网 + watch 模式 + 日志目录在工作区内,运行 10 分钟后 daemon.log 增长量有上限,且不会再触发 SQLite WAL/lock 写失败。
Check $29 fit

不要先动这些

Deep Cleanup

需要人帮你判断哪些能删?

提交一次请求。可以贴日志路径、最大文件列表、磁盘剩余空间,或浏览器扫描摘要;我们会区分 safe、review-first 和 do-not-touch。