Skip to content

perf: reduce unnecessary daemon cloning in loops#144

Merged
jdx merged 2 commits into
mainfrom
perf/reduce-daemon-clones
Jan 19, 2026
Merged

perf: reduce unnecessary daemon cloning in loops#144
jdx merged 2 commits into
mainfrom
perf/reduce-daemon-clones

Conversation

@jdx

@jdx jdx commented Jan 19, 2026

Copy link
Copy Markdown
Owner

Summary

  • Optimize daemon collection iteration to reduce memory allocations

Problem

The check_retry and check_cron_schedules functions were cloning entire daemon collections upfront, even when only a small subset of daemons needed processing. For systems with many daemons, this caused unnecessary memory allocations.

Solution

Change the pattern from:

let daemons = state_file.daemons.clone(); // Clones ALL daemons
for (id, daemon) in daemons { ... }

To:

let ids: Vec<String> = state_file.daemons.iter()
    .filter(|...|) // Filter to only relevant daemons
    .map(|(id, _)| id.clone()) // Clone only IDs
    .collect();
for id in ids {
    let daemon = state_file.daemons.get(&id).clone(); // Clone only when needed
}

This reduces allocations when:

  • Most daemons don't need retrying (only errored daemons with retries remaining)
  • Most daemons don't have cron schedules

Test plan

  • cargo build passes
  • Manual test with many daemons

🤖 Generated with Claude Code


Note

Optimizes supervisor loops to minimize allocations and unnecessary cloning while preserving behavior.

  • Refactors check_retry to collect only daemon IDs needing retries, then re-validate and clone on demand before invoking run
  • Refactors check_cron_schedules to collect only IDs with cron settings, then fetch each daemon lazily for schedule evaluation and triggering
  • Updates Cargo.lock (adds libc dependency entry)

Written by Cursor Bugbot for commit a9c2fa9. This will update automatically on new commits. Configure here.

Optimize check_retry and check_cron_schedules to avoid cloning entire
daemon collections upfront. Instead, collect only daemon IDs first,
then look up individual daemons when needed.

This reduces memory allocations when most daemons don't need processing:
- check_retry: only clones daemons that actually need retrying
- check_cron_schedules: only clones daemons with cron schedules

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

Comment thread src/supervisor.rs
Address review feedback: re-check that daemon still meets retry criteria
after fetching it, since state may have changed between ID collection
and processing.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@jdx jdx merged commit 4ce8cca into main Jan 19, 2026
4 checks passed
@jdx jdx deleted the perf/reduce-daemon-clones branch January 19, 2026 04:04
@jdx jdx mentioned this pull request Jan 19, 2026
jdx added a commit that referenced this pull request Jan 19, 2026
## 🤖 New release

* `pitchfork-cli`: 0.3.0 -> 0.3.1

<details><summary><i><b>Changelog</b></i></summary><p>

<blockquote>

## [0.3.1](v0.3.0...v0.3.1) -
2026-01-19

### Added

- implement daemon dependency resolution
([#135](#135))
- add restart command to CLI
([#134](#134))

### Fixed

- restart command preserves daemon dependency configuration
([#142](#142))
- add missing depends field to restart command
([#136](#136))
- set IPC socket permissions to 0600 for security
([#133](#133))
- handle shell command parsing errors instead of silently failing
([#132](#132))

### Other

- reduce unnecessary daemon cloning in loops
([#144](#144))
- use periodic log flushing instead of per-line
([#139](#139))
- refresh only tracked PIDs instead of all processes
([#141](#141))
- cache compiled regex patterns
([#143](#143))

### Security

- add rate limiting to IPC server
([#137](#137))
- canonicalize config paths to prevent symlink exploitation
([#138](#138))
- add centralized daemon ID validation
([#140](#140))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Prepares the 0.3.1 release and updates metadata/documentation
accordingly.
> 
> - **Changelog**: Adds `0.3.1` entry detailing added dependency
resolution, new `restart` command, fixes, performance tweaks, and
security hardening
> - **Version bumps**: Updates `version` to `0.3.1` in `Cargo.toml`,
`Cargo.lock`, `docs/cli/commands.json`, `docs/cli/index.md`, and
`pitchfork.usage.kdl`
> - **Docs regen**: Refreshes CLI docs/spec to reflect the new version
(no behavioral changes in this diff)
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9f9d386. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
@jdx jdx mentioned this pull request Jan 19, 2026
jdx added a commit that referenced this pull request Jan 19, 2026
## 🤖 New release

* `pitchfork-cli`: 1.0.0

<details><summary><i><b>Changelog</b></i></summary><p>

<blockquote>

## [1.0.0](https://github.com/jdx/pitchfork/releases/tag/v1.0.0) -
2026-01-19

### Added

- implement daemon dependency resolution
([#135](#135))
- add restart command to CLI
([#134](#134))

### Fixed

- restart command preserves daemon dependency configuration
([#142](#142))
- add missing depends field to restart command
([#136](#136))
- set IPC socket permissions to 0600 for security
([#133](#133))
- handle shell command parsing errors instead of silently failing
([#132](#132))

### Other

- bump version to 1.0.0
([#147](#147))
- release v0.3.1 ([#121](#121))
- reduce unnecessary daemon cloning in loops
([#144](#144))
- use periodic log flushing instead of per-line
([#139](#139))
- refresh only tracked PIDs instead of all processes
([#141](#141))
- cache compiled regex patterns
([#143](#143))

### Security

- add rate limiting to IPC server
([#137](#137))
- canonicalize config paths to prevent symlink exploitation
([#138](#138))
- add centralized daemon ID validation
([#140](#140))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Prepares the 1.0.0 release and updates `CHANGELOG.md` with the
finalized notes.
> 
> - Adds `1.0.0` section: daemon dependency resolution, new CLI
`restart` command, fixes for dependency preservation and shell parsing,
secure IPC socket perms, plus performance/maintenance updates
> - Documents security hardening: IPC rate limiting, config path
canonicalization, centralized daemon ID validation
> - Retains prior `0.3.1` notes for historical context
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4182984. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant