Skip to content

fix(core): refresh EffectFlock heartbeats on every tick - #51181

Closed
iceteaSA wants to merge 1 commit into
anomalyco:devfrom
iceteaSA:flock-heartbeat
Closed

iceteaSA wants to merge 1 commit into
anomalyco:devfrom
iceteaSA:flock-heartbeat

Conversation

@iceteaSA

Copy link
Copy Markdown

Issue for this PR

Closes #51179

Type of change

  • Bug fix
  • New feature
  • Refactor / code improvement
  • Documentation

What does this PR do?

EffectFlock.acquire started its heartbeat with fs.utimes(path, new Date(), new Date()) piped into Effect.repeat. The repeat reruns that same effect, so both dates stay at the time the lock was acquired and the heartbeat never moves forward. Once a lock has been held for 60 s, isStale treats it as abandoned, and another process can break it while the holder is still working, for example during a slow npm install or a repository clone.

Wrapping the call in Effect.suspend builds a new utimes effect on each tick, so each tick writes the current time. The rest of the heartbeat fiber is unchanged: same schedule, still scoped to the lock and interrupted before release.

How did you verify your code works?

New test in packages/core/test/util/effect-flock.test.ts: acquire a lock, backdate its heartbeat by 120 s, wait 1 s of wall time, advance the TestClock by one heartbeat interval, then check the heartbeat's age. Before the fix it fails (age 1058 ms, the acquisition time); after it, it passes. bun test test/util/effect-flock.test.ts passes (12 pass, 0 fail) and bun typecheck is clean in packages/core.

Screenshots / recordings

n/a

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

@github-actions

Copy link
Copy Markdown
Contributor

The following comment was made by an LLM, it may be inaccurate:

@thdxr

thdxr commented Oct 10, 2026

Copy link
Copy Markdown
Member

This branch has been upgraded to V2. We're no longer taking PRs for V1. If you think this is still relevant, please port it over and open it for V2.

— from 𝕺𝖕𝖊𝖓𝕮𝖔𝖉𝖊

@thdxr thdxr closed this Oct 10, 2026
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.

EffectFlock heartbeat never refreshes, so locks held over 60 s can be broken

2 participants