fix(telemetry): INSERT OR IGNORE + WAL + try/except 三层防御加固
根治遥测写入主键冲突(UNIQUE constraint)和并发写锁(database is locked) 导致的异常冒泡,遥测侧信道错误不再污染 LLM 重试链。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -104,3 +104,38 @@ async def test_record_cache_hit(recorder, db_path):
|
||||
conn.close()
|
||||
|
||||
assert row["cache_hit"] == 1
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_duplicate_call_id_does_not_raise(recorder, db_path):
|
||||
"""重复 call_id 写入应静默忽略(INSERT OR IGNORE),不抛异常。"""
|
||||
kwargs = _make_call_kwargs()
|
||||
await recorder.record_llm_call(**kwargs)
|
||||
await recorder.record_llm_call(**kwargs)
|
||||
conn = sqlite3.connect(str(db_path))
|
||||
rows = conn.execute("SELECT COUNT(*) FROM llm_calls").fetchone()
|
||||
conn.close()
|
||||
assert rows[0] == 1
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_db_error_does_not_propagate(tmp_path):
|
||||
"""SQLite 写入失败时 record_llm_call 应静默降级,不抛异常。"""
|
||||
bad_recorder = SQLiteTelemetryRecorder(db_path=tmp_path / "nonexistent_dir" / "bad.db")
|
||||
kwargs = _make_call_kwargs()
|
||||
await bad_recorder.record_llm_call(**kwargs)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_concurrent_writes_no_lock_error(recorder, db_path):
|
||||
"""16 路并发 record_llm_call 应全部成功,无 database is locked 错误。"""
|
||||
import asyncio
|
||||
tasks = []
|
||||
for _ in range(16):
|
||||
kwargs = _make_call_kwargs()
|
||||
tasks.append(recorder.record_llm_call(**kwargs))
|
||||
await asyncio.gather(*tasks)
|
||||
conn = sqlite3.connect(str(db_path))
|
||||
count = conn.execute("SELECT COUNT(*) FROM llm_calls").fetchone()[0]
|
||||
conn.close()
|
||||
assert count == 16
|
||||
|
||||
Reference in New Issue
Block a user