session_log_2026-07-29.md #1

  • //
  • p4lf/
  • dev/
  • ai/
  • session_log_2026-07-29.md
  • Markdown
  • View
  • Commits
  • Open Download .zip Download (4 KB)

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.
# 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>