Skip to content

Update get_history in HAHistory to take a copy of the history of an entity to avoid race conditions#3550

Open
AndrewColes wants to merge 1 commit intospringfall2008:mainfrom
AndrewColes:main
Open

Update get_history in HAHistory to take a copy of the history of an entity to avoid race conditions#3550
AndrewColes wants to merge 1 commit intospringfall2008:mainfrom
AndrewColes:main

Conversation

@AndrewColes
Copy link

get_history previously returned (a list containing) the history stored in HAHistory.

This history could then be accessed concurrently with changes being made to it by update_entity, with no locking.

At a minimum, because update_entity sorts the history -- which is not thread safe -- the history may appear transiently empty during these updates.

This race condition caused glitches elsewhere in the code; at a minimum, with load data appearing to be transiently empty, leading to poor estimates.

This commit fixes the issue by making get_history return a copy of the history; and to hold the lock while making this copy, to ensure thread safety.

To militate against the performance impact of this, minute_data in utils.py is updated to take an extra argument -- can_modify_history, default to False. If set to True, this will stop it from taking a copy it would otherwise make of the history object provided to it. fetch.py is then updated to set it to true in some places, as appropriate. Hence the fix has almost no impact on performance.

Fixes #3511 . Tested for two calendar days, see attached screenshot:

image

…ntity, to avoid race conditions.

get_history previously returned (a list containing) the history stored in HAHistory.

This history could then be accessed concurrently with changes being made to it by update_entity, with no locking.

At a minimum, because update_entity sorts the history -- which is not thread safe -- the history may appear transiently empty during these updates.

This race condition caused glitches elsewhere in the code; at a minimum, with load data appearing to be transiently empty, leading to poor estimates.

This commit fixes the issue by making get_history return a *copy* of the history; and to hold the lock while making this copy, to ensure thread safety.

To militate against the performance impact of this, minute_data in utils.py is updated to take an extra argument -- can_modify_history, default to False. If set to True, this will stop it from taking a copy it would otherwise make of the history object provided to it. fetch.py is then updated to set it to true in some places, as appropriate. Hence the fix has almost no impact on performance.

Fixes springfall2008#3511
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.

Current load glitches to zero a few times a day, in turn reducing forecast load and affecting the plan; it recovers 5 minutes later

1 participant