From 1f8e8926fea63f86e41bf5de515a14a5a5204beb Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 4 Feb 2022 20:31:12 +0100 Subject: [PATCH] Only remove duplicated statistics on error (#65653) --- .../components/recorder/migration.py | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/recorder/migration.py b/homeassistant/components/recorder/migration.py index cb94018b1b11..b8f15a811db7 100644 --- a/homeassistant/components/recorder/migration.py +++ b/homeassistant/components/recorder/migration.py @@ -6,6 +6,7 @@ import logging import sqlalchemy from sqlalchemy import ForeignKeyConstraint, MetaData, Table, func, text from sqlalchemy.exc import ( + DatabaseError, InternalError, OperationalError, ProgrammingError, @@ -612,22 +613,31 @@ def _apply_update(instance, new_version, old_version): # noqa: C901 # Add name column to StatisticsMeta _add_columns(instance, "statistics_meta", ["name VARCHAR(255)"]) elif new_version == 24: - # Delete duplicated statistics - with session_scope(session=instance.get_session()) as session: - delete_duplicates(instance, session) # Recreate statistics indices to block duplicated statistics _drop_index(instance, "statistics", "ix_statistics_statistic_id_start") - _create_index(instance, "statistics", "ix_statistics_statistic_id_start") _drop_index( instance, "statistics_short_term", "ix_statistics_short_term_statistic_id_start", ) - _create_index( - instance, - "statistics_short_term", - "ix_statistics_short_term_statistic_id_start", - ) + try: + _create_index(instance, "statistics", "ix_statistics_statistic_id_start") + _create_index( + instance, + "statistics_short_term", + "ix_statistics_short_term_statistic_id_start", + ) + except DatabaseError: + # There may be duplicated statistics entries, delete duplicated statistics + # and try again + with session_scope(session=instance.get_session()) as session: + delete_duplicates(instance, session) + _create_index(instance, "statistics", "ix_statistics_statistic_id_start") + _create_index( + instance, + "statistics_short_term", + "ix_statistics_short_term_statistic_id_start", + ) else: raise ValueError(f"No schema migration defined for version {new_version}")