fix: count every dropped SQLite telemetry row
SQLite 的逐行写入失败只发 warning、不计数,磁盘满 / database is locked / 文件被外部改坏时行真的丢了,而 dropped_rows 恒 0、degraded 恒 False——下游 按 README 的口径读快照对账完全看不见,与 issue #15 要消灭的静默失败同型。 同批修掉关闭后的丢行文案: 写死的遥测已降级与此时 degraded=False 的快照 互相矛盾,改为按状态分档(降级中 / 已关闭),与 PG 侧 _drop_reason 同口径。
This commit is contained in:
@@ -151,13 +151,26 @@ class SQLiteRecorder:
|
||||
if self._conn is None:
|
||||
# 改前这里是**裸 return**: 初始化失败后每一行都无声消失,长跑进程里
|
||||
# 与"遥测正常"外观上完全一致(设计 §1.4 的直接钉子)
|
||||
self._status.record_drop("遥测已降级")
|
||||
self._status.record_drop(self._drop_reason())
|
||||
return
|
||||
row = tuple(fields[col] for col in self._columns)
|
||||
try:
|
||||
await asyncio.to_thread(self._write, row)
|
||||
except (OSError, sqlite3.Error) as exc:
|
||||
logger.warning("SQLite 遥测写入失败(降级不冒泡): {}", exc)
|
||||
# 计数与出声是两件事,少了计数可见性在这条路径上就是假的: 磁盘满 /
|
||||
# database is locked / 文件被外部改坏时行真的丢了,而 `dropped_rows`
|
||||
# 恒 0、`degraded` 恒 False,下游读快照对账完全看不见(PG 侧两件都做)
|
||||
self._status.record_drop("写入失败")
|
||||
|
||||
def _drop_reason(self) -> str:
|
||||
"""连接为 None 时说清是**哪一种**写不进去: 降级中 / 调用方自己关了。
|
||||
|
||||
不能写死为"已降级": `close()` 之后 `degraded` 是 False,固定文案会与
|
||||
下游读到的快照互相矛盾,对账的人分不清该等自愈还是修自己的关闭时序。
|
||||
本侧只有这两态(初始化失败必置降级,此外只剩关闭),故不照抄 PG 的三分。
|
||||
"""
|
||||
return "遥测已降级" if self._status.snapshot().degraded else "遥测已关闭"
|
||||
|
||||
def _write(self, row: tuple) -> None:
|
||||
assert self._conn is not None # 内部不变量: 调用方已判空
|
||||
|
||||
Reference in New Issue
Block a user