Skip to content

server: track UI-created device lifetime cancel in sync.Map#29007

Draft
DerAndereAndi wants to merge 1 commit intoevcc-io:masterfrom
DerAndereAndi:feature/device-cancel-map
Draft

server: track UI-created device lifetime cancel in sync.Map#29007
DerAndereAndi wants to merge 1 commit intoevcc-io:masterfrom
DerAndereAndi:feature/device-cancel-map

Conversation

@DerAndereAndi
Copy link
Copy Markdown
Contributor

Devices created or updated via the config UI now register their cancel function in a package-level sync.Map keyed by config ID. deleteDevice loads and fires the cancel; updateDevice swaps old for new so the previous instance's cancel is invoked after the new one is installed. This gives resource-holding devices (for example EEBus chargers and meters) a clean hook to release external state via their existing <-ctx.Done() goroutine — no new public interface, no changes to configurableDevice.

Known limitation: devices loaded at startup from the database (via cmd/setup.go:configurableInstance) are not registered in the map. Deleting such a device through the UI will not trigger its lifetime cancel, so any external registration will linger until evcc restart. The common create-via-UI → delete-via-UI flow is fully covered. Closing this gap requires the per-device lifecycle work that is not yet implemented.

Devices created or updated via the config UI now register their
cancel function in a package-level sync.Map keyed by config ID.
deleteDevice loads and fires the cancel; updateDevice swaps old for
new so the previous instance's cancel is invoked after the new one
is installed. This gives resource-holding devices (for example EEBus
chargers and meters) a clean hook to release external state via
their existing <-ctx.Done() goroutine — no new public interface, no
changes to configurableDevice.

Known limitation: devices loaded at startup from the database (via
cmd/setup.go:configurableInstance) are not registered in the map.
Deleting such a device through the UI will not trigger its lifetime
cancel, so any external registration will linger until evcc
restart. The common create-via-UI → delete-via-UI flow is fully
covered. Closing this gap requires the per-device lifecycle work
that is not yet implemented.
@DerAndereAndi DerAndereAndi marked this pull request as draft April 10, 2026 18:09
Copy link
Copy Markdown
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

Hey - I've left some high level feedback:

  • The package-level deviceCancels sync.Map with raw any values and repeated .(context.CancelFunc) assertions would be easier to reason about and safer if you wrapped it in small helper functions (e.g. setDeviceCancel, swapDeviceCancel, cancelAndDeleteDevice) so the casting and lifecycle semantics live in one place.
  • The long limitation comment above deviceCancels mixes behavioural rationale with future plans; consider shortening it and moving the detailed explanation into a higher-level design note or the PR description to keep this handler file focused on implementation details.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The package-level `deviceCancels` `sync.Map` with raw `any` values and repeated `.(context.CancelFunc)` assertions would be easier to reason about and safer if you wrapped it in small helper functions (e.g. `setDeviceCancel`, `swapDeviceCancel`, `cancelAndDeleteDevice`) so the casting and lifecycle semantics live in one place.
- The long limitation comment above `deviceCancels` mixes behavioural rationale with future plans; consider shortening it and moving the detailed explanation into a higher-level design note or the PR description to keep this handler file focused on implementation details.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

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