Implement three new requirements and update the README to reflect the actual Go implementation:
MaxLogChunks behavior from "pause when limit reached" to "delete oldest files to make room."p4 logtail language.User asked agent to review the copilot-instructions.md (AGENTS.md) and present a plan, then approved the plan.
Old: log.<offset1>.<offset2>.gz
New: log.<YYYY-MM-DD>.<offset1>.<offset2>.gz
Using time.Now() at write time, formatted with Go's reference date "2006-01-02". The date is embedded before the offsets for human readability and to prevent collisions when the same byte ranges appear in a freshly rotated log.
The previous behavior paused chunk writes when MaxLogChunks was reached, waiting for the downstream consumer to delete files. The new behavior deletes the oldest files (by modification time) to make room before writing the new chunk. A Warnf is emitted for each enforcement action, making it clear in the p4lf log that data is being lost.
Rationale: It is more important to have current P4LOG data than to ensure continuity in the event the downstream consumer is not working.
The WaitUntilGuardsPassed method now only checks MinLogSpace (the disk-space guard), since MaxLogChunks no longer blocks writes.
At 1 chunk/minute, 5000 files ≈ 3.5 days of buffering — a reasonable safety net before data loss begins. Operators can set to 0 to disable the limit.
The README previously described a bash implementation using p4 logtail with offsets. The actual implementation is in Go, uses direct file reading with inode-based rotation detection, and never calls p4 logtail. The README was rewritten from scratch to accurately describe the Go implementation, the new filename format, and the updated MaxLogChunks semantics.
| File | Change |
|---|---|
internal/chunker/chunker.go |
New filename format with date; enforceMaxLogChunks() replaces checkGuards(); checkSpaceGuard() split out; chunkFilesSortedByAge() helper added; updated package doc |
internal/chunker/chunker_test.go |
Updated TestWrite_CreatesGzipFile to use glob for date-stamped name; rewrote TestWrite_MaxLogChunks to verify delete-oldest behavior |
internal/config/config.go |
Default MaxLogChunks changed from 0 to 5000; field doc updated |
internal/config/config_test.go |
Updated TestLoad_Defaults to expect MaxLogChunks=5000 |
p4lf.cfg.example |
Updated MaxLogChunks comment to describe delete-oldest behavior, new default, and ~3.5 day buffer note |
README.md |
Full rewrite: removed p4 logtail language, described inode-based tailing, new filename format, updated config settings, accurate Basic Flow |
All tests passing on macOS after changes:
workshop.perforce.com/p4lf/internal/chunker ✓workshop.perforce.com/p4lf/internal/config ✓workshop.perforce.com/p4lf/internal/version ✓# P4LF Session Log — 2026-07-29 (Session 6: Date-Stamped Filenames + MaxLogChunks Delete-Oldest) ## Session Goal Implement three new requirements and update the README to reflect the actual Go implementation: 1. Add a date stamp to chunk filenames to prevent naming collisions after log rotation. 2. Change `MaxLogChunks` behavior from "pause when limit reached" to "delete oldest files to make room." 3. Update the README to remove outdated `p4 logtail` language. ## Prompts User asked agent to review the `copilot-instructions.md` (AGENTS.md) and present a plan, then approved the plan. ## Key Decisions ### Filename format change **Old:** `log.<offset1>.<offset2>.gz` **New:** `log.<YYYY-MM-DD>.<offset1>.<offset2>.gz` Using `time.Now()` at write time, formatted with Go's reference date `"2006-01-02"`. The date is embedded before the offsets for human readability and to prevent collisions when the same byte ranges appear in a freshly rotated log. ### MaxLogChunks: delete-oldest instead of pause-and-wait The previous behavior paused chunk writes when `MaxLogChunks` was reached, waiting for the downstream consumer to delete files. The new behavior deletes the oldest files (by modification time) to make room before writing the new chunk. A `Warnf` is emitted for each enforcement action, making it clear in the p4lf log that data is being lost. Rationale: It is more important to have current P4LOG data than to ensure continuity in the event the downstream consumer is not working. The `WaitUntilGuardsPassed` method now only checks `MinLogSpace` (the disk-space guard), since `MaxLogChunks` no longer blocks writes. ### Default for MaxLogChunks changed from 0 to 5000 At 1 chunk/minute, 5000 files ≈ 3.5 days of buffering — a reasonable safety net before data loss begins. Operators can set to 0 to disable the limit. ### README rewrite The README previously described a bash implementation using `p4 logtail` with offsets. The actual implementation is in Go, uses direct file reading with inode-based rotation detection, and never calls `p4 logtail`. The README was rewritten from scratch to accurately describe the Go implementation, the new filename format, and the updated `MaxLogChunks` semantics. ## Files Changed | File | Change | |---|---| | `internal/chunker/chunker.go` | New filename format with date; `enforceMaxLogChunks()` replaces `checkGuards()`; `checkSpaceGuard()` split out; `chunkFilesSortedByAge()` helper added; updated package doc | | `internal/chunker/chunker_test.go` | Updated `TestWrite_CreatesGzipFile` to use glob for date-stamped name; rewrote `TestWrite_MaxLogChunks` to verify delete-oldest behavior | | `internal/config/config.go` | Default `MaxLogChunks` changed from `0` to `5000`; field doc updated | | `internal/config/config_test.go` | Updated `TestLoad_Defaults` to expect `MaxLogChunks=5000` | | `p4lf.cfg.example` | Updated `MaxLogChunks` comment to describe delete-oldest behavior, new default, and ~3.5 day buffer note | | `README.md` | Full rewrite: removed `p4 logtail` language, described inode-based tailing, new filename format, updated config settings, accurate Basic Flow | ## make check Status All tests passing on macOS after changes: - `workshop.perforce.com/p4lf/internal/chunker` ✓ - `workshop.perforce.com/p4lf/internal/config` ✓ - `workshop.perforce.com/p4lf/internal/version` ✓ ## Open Items / Next Steps - Submit these changes to //p4lf/dev (pending user approval). - Integration test on the customer sandbox: verify new filename format appears in LogChunksDir, verify MaxLogChunks deletion in action. - Consider adding unit tests for tailer (rotation detection, state file resume) — noted as open in prior sessions.
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #1 | 33125 | C. Thomas Tyler |
Add date to chunk filenames; MaxLogChunks deletes oldest; update README - Chunk files renamed: log.<YYYY-MM-DD>.<start>.<end>.gz - MaxLogChunks now deletes oldest files instead of pausing; default 5000 - WaitUntilGuardsPassed checks MinLogSpace only (MaxLogChunks no longer blocks) - p4lf.cfg.example: updated MaxLogChunks comment with delete-oldest semantics - README: full rewrite removing p4 logtail language; describes Go inode-based impl - Tests updated for new filename format and delete-oldest MaxLogChunks behavior Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |