feat(daemon): _signals table retention policy (closes #152) #177

Merged
xiaomo merged 2 commits from feat/152-signals-retention into main 2026-04-27 07:48:39 +00:00
Owner

What

Add a configurable retention policy for the _signals SQLite table to prevent unbounded growth.

Why

Without retention, long-running senses accumulate signals indefinitely, eventually consuming excessive disk space (#152).

Changes

  • packages/core/src/config.ts — Add retention field to SenseConfig (default: 10,000 rows) and export DEFAULT_SENSE_SIGNAL_RETENTION
  • packages/core/src/parse-nerve-config.ts — Parse optional retention positive integer from nerve.yaml sense config
  • packages/daemon/src/sense-runtime.ts — Add prune logic: every 100 inserts, delete rows exceeding retention limit via prepared statement
  • packages/daemon/src/sense-worker.ts — Thread retention config from parsed config through to openSenseDb
  • Test files updated for new retention field

Usage

senses:
  cpu-usage:
    retention: 5000  # keep last 5000 signals (default: 10000)

Ref

Closes #152

## What Add a configurable retention policy for the `_signals` SQLite table to prevent unbounded growth. ## Why Without retention, long-running senses accumulate signals indefinitely, eventually consuming excessive disk space (#152). ## Changes - **packages/core/src/config.ts** — Add `retention` field to `SenseConfig` (default: 10,000 rows) and export `DEFAULT_SENSE_SIGNAL_RETENTION` - **packages/core/src/parse-nerve-config.ts** — Parse optional `retention` positive integer from nerve.yaml sense config - **packages/daemon/src/sense-runtime.ts** — Add prune logic: every 100 inserts, delete rows exceeding retention limit via prepared statement - **packages/daemon/src/sense-worker.ts** — Thread `retention` config from parsed config through to `openSenseDb` - Test files updated for new `retention` field ## Usage ```yaml senses: cpu-usage: retention: 5000 # keep last 5000 signals (default: 10000) ``` ## Ref Closes #152
xingyue added 1 commit 2026-04-27 07:43:36 +00:00
- Add `retention` field to SenseConfig (default 10000 max rows)
- Parse optional `retention` positive integer in nerve.yaml sense config
- Prune old _signals rows every 100 inserts for amortized performance
- Pass retention from config through sense-worker to openSenseDb
- Add unit tests for config parsing and runtime pruning
xiaoju force-pushed feat/152-signals-retention from 308051ed5a to b05225fa2a 2026-04-27 07:46:34 +00:00 Compare
xiaomo approved these changes 2026-04-27 07:48:37 +00:00
xiaomo left a comment
Owner

LGTM

核心逻辑清晰:每 100 次 insert 摊销一次 prune,retention 可配置,默认 10k。

配置解析的边界校验(零、小数、非数字)覆盖完整。file-watcher flaky fix 思路跟 #175 一致,settle + clear 是正确做法。

小建议(不阻塞):当 retention 值很大时,NOT IN 子查询效率不如 WHERE id <= (SELECT id ... LIMIT 1 OFFSET ?),但 10k 级别完全没问题,后续有需要再优化。

LGTM ✅ 核心逻辑清晰:每 100 次 insert 摊销一次 prune,retention 可配置,默认 10k。 配置解析的边界校验(零、小数、非数字)覆盖完整。file-watcher flaky fix 思路跟 #175 一致,settle + clear 是正确做法。 小建议(不阻塞):当 retention 值很大时,`NOT IN` 子查询效率不如 `WHERE id <= (SELECT id ... LIMIT 1 OFFSET ?)`,但 10k 级别完全没问题,后续有需要再优化。
xiaomo merged commit 02514972b0 into main 2026-04-27 07:48:39 +00:00
This repo is archived. You cannot comment on pull requests.
No Reviewers
No Label
3 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/nerve#177