fix: complete code review follow-ups for queue, stats, and docs
Replace overlap Pending flag with PendingRuns counter, match seed stats by job_id, align average duration with TimedRunCount, and tidy docs. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+11
-5
@@ -119,6 +119,11 @@ effective policy per job: it uses `job.OverlapPolicy` when set, otherwise falls
|
||||
back to `store.Config.OverlapPolicy`. `normalizeJob` in `app/operations.go` leaves
|
||||
the field empty on new jobs so the inherit semantics are preserved.
|
||||
|
||||
Under the `"queue"` policy, each occurrence that fires while a run is still
|
||||
in flight increments `JobRuntime.PendingRuns`. When the current run finishes,
|
||||
`executeRun` drains the counter by starting one deferred run per completion until
|
||||
`PendingRuns` reaches zero.
|
||||
|
||||
### Run-time statistics
|
||||
|
||||
`domain.JobRuntime` holds a rolling aggregate updated after each run:
|
||||
@@ -135,11 +140,12 @@ the field empty on new jobs so the inherit semantics are preserved.
|
||||
the returned `RunRecord`. `runner/logfile.go` writes a `duration` line into the
|
||||
log file header alongside the existing `state` line.
|
||||
|
||||
On startup, `runner.SeedStats` scans each job's log files (matched by the
|
||||
`_<sanitized name>.log` suffix, bounded by `Config.MaxLogFiles`) and folds the
|
||||
parsed `state`/`duration` headers into a `runner.StatSeed` map. `NewService`
|
||||
applies those seeds to the runtime map before the first scheduler tick, so the
|
||||
details panel shows accumulated run history immediately after a restart.
|
||||
On startup, `runner.SeedStats` scans log files (matched primarily by the
|
||||
`job_id` header, with a sanitized-name filename fallback for legacy logs,
|
||||
bounded by `Config.MaxLogFiles`) and folds the parsed `state`/`duration`
|
||||
headers into a `runner.SeededStats` map. `NewService` applies those seeds to
|
||||
the runtime map before the first scheduler tick, so the details panel shows
|
||||
accumulated run history immediately after a restart.
|
||||
Older log files that pre-date the `duration` header are tolerated: the run is
|
||||
counted but the timing is skipped.
|
||||
|
||||
|
||||
+6
-4
@@ -10,7 +10,7 @@
|
||||
| Сложность vs масштаб | 8/10 |
|
||||
| Качество кода | 8/10 |
|
||||
| Поддерживаемость | 8/10 |
|
||||
| Логические ошибки | 8/10 (после исправлений) |
|
||||
| Логические ошибки | 9/10 (после исправлений) |
|
||||
|
||||
Проект зрелый и поддерживаемый для десктопного планировщика (~59 `.go`-файлов). Архитектура слоистая, core-логика хорошо протестирована.
|
||||
|
||||
@@ -30,11 +30,15 @@
|
||||
| 1 | Data race: `store.Paths` в `executeRun` без lock | Высокая | Исправлено |
|
||||
| 2 | Run стартует при ошибке `SaveJobs` | Средняя | Исправлено |
|
||||
| 3 | CRUD эмитит events при failed save | Средняя | Исправлено |
|
||||
| 4 | Overlap queue — только один `Pending` | Средняя | Документировано (by design) |
|
||||
| 4 | Overlap queue — только один `Pending` | Средняя | Исправлено (`PendingRuns`) |
|
||||
| 5 | `time.Now()` vs scheduler clock в `startRunLocked` | Низкая | Исправлено |
|
||||
| 6 | Silent log write failures | Низкая | Исправлено |
|
||||
| 7 | Невалидный per-job `overlap_policy` | Низкая | Исправлено |
|
||||
| 8 | Docs drift (YAML, RunNow/pause) | Низкая | Исправлено |
|
||||
| 9 | `StartOnly` игнорировал cancel context | Низкая | Исправлено |
|
||||
| 10 | `SeedStats` коллизия sanitized имён | Низкая | Исправлено (match по `job_id`) |
|
||||
| 11 | `AvgDurationMS` seed vs live расходились | Низкая | Исправлено (`TimedRunCount`) |
|
||||
| 12 | Legacy ticket-ссылки в комментариях | Низкая | Исправлено |
|
||||
|
||||
## Намеренное поведение (не баги)
|
||||
|
||||
@@ -47,5 +51,3 @@
|
||||
|
||||
- UI widget tests или smoke E2E
|
||||
- Per-job command timeout в конфиге
|
||||
- Счётчик вместо `Pending bool` для overlap queue (если нужна полная очередь)
|
||||
- Убрать legacy ticket-ссылки (T3.1) из комментариев
|
||||
|
||||
+1
-1
@@ -153,7 +153,7 @@ CGO_ENABLED=1 go run ./cmd/gosentry
|
||||
- `src/app` — `Service`: sole owner of job and runtime state; emits typed events to the UI.
|
||||
- `src/scheduler` — pure timing loop; calls `Service.RunDue` on every tick.
|
||||
- `src/runner` — shell command execution, log file writing, and log cleanup.
|
||||
- `src/storage` — JSON persistence (`gosentry.json`, `jobs.json`); one-time import from legacy YAML on first run.
|
||||
- `src/storage` — JSON persistence (`gosentry.json`, `jobs.json`).
|
||||
- `src/platform/autostart` — `Manager` interface with Windows (shortcut) and Linux (XDG) implementations.
|
||||
- `src/platform/desktop` — display-scale helper (Linux only).
|
||||
- `src/platform/winproc` — hidden-window startup flags (Windows only).
|
||||
|
||||
Reference in New Issue
Block a user