Skip to content

Conversation

@amyssnippet
Copy link
Contributor

What I did

  • Fixed an issue where docker compose up --watch could become unresponsive after a large number of file changes (e.g., after a branch switch).
  • Ensured all watcher and sync goroutines and channels are robustly closed on context cancellation or error.
  • Added explicit logging for large batches and context cancellation to prevent stuck processes and ensure graceful shutdown on Ctrl-C.

Related issue

This PR addresses an issue where docker compose up --watch could become unresponsive after a large number of file changes (such as after a branch switch), causing logs to stop and Ctrl-C to not exit cleanly. The issue is #13136 . The fix ensures that all watcher and sync goroutines and channels are robustly closed on context cancellation or error, and adds explicit logging for large batches and context cancellation. This prevents the process from getting stuck and ensures graceful shutdown, even after large file change events.

By fixing:

  • I improved the shutdown logic in the watcher and sync system, ensuring all goroutines and channels are closed on context cancellation or error.
  • I added explicit logging for large file change batches and for context cancellation.
  • The patch directly addresses the symptoms described: logs stopping, Ctrl-C not exiting, and the process getting stuck after a large batch of file changes (such as after a branch switch).

select {
case <-ctx.Done():
options.LogTo.Log(api.WatchLogger, "Watch disabled")
options.LogTo.Log(api.WatchLogger, "Watch disabled (context canceled)")
Copy link
Contributor

Choose a reason for hiding this comment

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

"context" doesn't make any sense for end-user

ctx, cancel := context.WithCancel(ctx)
defer cancel()

// debounce and group filesystem events so that we capture IDE saving many files as one "batch" event
Copy link
Contributor

Choose a reason for hiding this comment

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

why remove this comment?

case batch := <-batchEvents:
case batch, ok := <-batchEvents:
if !ok {
options.LogTo.Log(api.WatchLogger, "Watch event channel closed")
Copy link
Contributor

Choose a reason for hiding this comment

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

WatchLogger is used to provide end-user message on the TUI, we should not refer to technical / implementation details

@amyssnippet
Copy link
Contributor Author

@ndeloof Thank you for the review! I've addressed your feedback on all comments in the latest commit

ndeloof
ndeloof previously approved these changes Jan 19, 2026
@ndeloof ndeloof enabled auto-merge (rebase) January 19, 2026 14:37
auto-merge was automatically disabled January 19, 2026 15:08

Head branch was pushed to by a user without write access

}

err = s.ensureImagesExists(ctx, project, options.Build, options.QuietPull)
prepareNetworks(project)
Copy link
Contributor

Choose a reason for hiding this comment

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

unrelated changes

Copy link
Contributor Author

Choose a reason for hiding this comment

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

i just tried to fix an issue, i just changed reorders the create function to ensure networks and volumes are provisioned before building images, which fixes a test failure

Copy link
Contributor

Choose a reason for hiding this comment

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

AFAICT this "fix" is unrelated to the current PR, and I can't see a test failure on main branch. Please avoid such undocumented changes.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ok, i have reverted back the irrelevant changes, take a look now and lets try running workflows.

@amyssnippet amyssnippet requested a review from ndeloof January 19, 2026 17:17
}

err = s.ensureImagesExists(ctx, project, options.Build, options.QuietPull)
prepareNetworks(project)
Copy link
Contributor

Choose a reason for hiding this comment

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

AFAICT this "fix" is unrelated to the current PR, and I can't see a test failure on main branch. Please avoid such undocumented changes.

@amyssnippet amyssnippet force-pushed the main branch 2 times, most recently from 52025fd to 3f43fdc Compare January 20, 2026 07:03
@amyssnippet amyssnippet requested a review from ndeloof January 20, 2026 07:04
@ndeloof
Copy link
Contributor

ndeloof commented Jan 20, 2026

You PR is now mixing changes from upstream. Please squash commit and prefer rebase over merge from main

Ensured all watcher and sync goroutines and channels are robustly closed on context cancellation or error.
Added explicit logging for large batches and context cancellation to prevent stuck processes and ensure graceful shutdown on Ctrl-C.

Signed-off-by: Amol Yadav <amyssnipet@yahoo.com>
@amyssnippet
Copy link
Contributor Author

@ndeloof now??
i rebased all changes related to the issue i choose to solve

@ndeloof ndeloof enabled auto-merge (rebase) January 20, 2026 07:24
@ndeloof ndeloof merged commit b92b87d into docker:main Jan 20, 2026
24 checks passed
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jan 22, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [docker/compose](https://github.com/docker/compose) | patch | `v5.0.1` → `v5.0.2` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>docker/compose (docker/compose)</summary>

### [`v5.0.2`](https://github.com/docker/compose/releases/tag/v5.0.2)

[Compare Source](docker/compose@v5.0.1...v5.0.2)

#### What's Changed

##### 🐛 Fixes

- Fixed progress UI to adapt to terminal width by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13519](docker/compose#13519)
- Removed warning when no explicit build has been requested. by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13493](docker/compose#13493)
- Restored `runtime_flags` support in `models` by [@&#8203;ilopezluna](https://github.com/ilopezluna) in [#&#8203;13460](docker/compose#13460)
- Added service name completion to `down` command by [@&#8203;bmo-at](https://github.com/bmo-at) in [#&#8203;13470](docker/compose#13470)
- Fixed tilde in `--env-file` paths expanded to user home directory by [@&#8203;tensorworkerr](https://github.com/tensorworkerr) in [#&#8203;13510](docker/compose#13510)
- Handle `healthcheck.disable: true` by [@&#8203;stavros-k](https://github.com/stavros-k) in [#&#8203;13494](docker/compose#13494)
- Fixed shutdown and error handling for large file change batches in `watch` by [@&#8203;amyssnippet](https://github.com/amyssnippet) in [#&#8203;13525](docker/compose#13525)

##### 🔧  Internal

- Added unit test for upOptions.OnExit method by [@&#8203;htoyoda18](https://github.com/htoyoda18) in [#&#8203;13489](docker/compose#13489)
- clean up temporary compose files after conversion by [@&#8203;htoyoda18](https://github.com/htoyoda18) in [#&#8203;13483](docker/compose#13483)
- Fixed typo in isSwarmEnabled method name by [@&#8203;htoyoda18](https://github.com/htoyoda18) in [#&#8203;13481](docker/compose#13481)
- Fixed incorrect usage of errgroup.WithContext by [@&#8203;htoyoda18](https://github.com/htoyoda18) in [#&#8203;13480](docker/compose#13480)
- Fixed timeout initialization when waitTimeout is zero by [@&#8203;htoyoda18](https://github.com/htoyoda18) in [#&#8203;13471](docker/compose#13471)
- Extracted API version constants to dedicated file by [@&#8203;htoyoda18](https://github.com/htoyoda18) in [#&#8203;13503](docker/compose#13503)
- Replace tabbed indentation in sdk.md by [@&#8203;pkqk](https://github.com/pkqk) in [#&#8203;13505](docker/compose#13505)
- Improved attach error handling and cleanup by [@&#8203;htoyoda18](https://github.com/htoyoda18) in [#&#8203;13488](docker/compose#13488)
- Modernize tests by [@&#8203;dgageot](https://github.com/dgageot) in [#&#8203;13531](docker/compose#13531)
- set fsnotify build tag when building for OSX by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13532](docker/compose#13532)

##### ⚙️ Dependencies

- build(deps): bump github.com/klauspost/compress to v1.18.2 by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13499](docker/compose#13499)
- go.mod: remove exclude rules by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13498](docker/compose#13498)
- build(deps): bump github.com/containerd/containerd/v2 to v2.2.1 by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13497](docker/compose#13497)
- build(deps): bump golang.org/x/sys from 0.39.0 to 0.40.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13502](docker/compose#13502)
- build(deps): bump google.golang.org/grpc from 1.77.0 to 1.78.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13475](docker/compose#13475)
- build(deps): bump github.com/go-viper/mapstructure/v2 from 2.4.0 to 2.5.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13506](docker/compose#13506)
- build(deps): bump github.com/sirupsen/logrus v1.9.4 by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13518](docker/compose#13518)
- Bump compose to v2.10.1 by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13528](docker/compose#13528)

#### New Contributors

- [@&#8203;bmo-at](https://github.com/bmo-at) made their first contribution in [#&#8203;13470](docker/compose#13470)
- [@&#8203;pkqk](https://github.com/pkqk) made their first contribution in [#&#8203;13505](docker/compose#13505)
- [@&#8203;tensorworkerr](https://github.com/tensorworkerr) made their first contribution in [#&#8203;13510](docker/compose#13510)
- [@&#8203;stavros-k](https://github.com/stavros-k) made their first contribution in [#&#8203;13494](docker/compose#13494)
- [@&#8203;amyssnippet](https://github.com/amyssnippet) made their first contribution in [#&#8203;13525](docker/compose#13525)
- [@&#8203;dgageot](https://github.com/dgageot) made their first contribution in [#&#8203;13531](docker/compose#13531)

**Full Changelog**: <docker/compose@v5.0.1...v5.0.2>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever MR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Ni4xIiwidXBkYXRlZEluVmVyIjoiNDIuODYuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90IiwiYXV0b21hdGlvbjpib3QtYXV0aG9yZWQiLCJkZXBlbmRlbmN5LXR5cGU6OnBhdGNoIl19-->
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.

2 participants