From d7017f21381fb0984ad2be93792e3dcefcf63fe8 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Tue, 30 Jan 2018 12:41:33 +0100 Subject: [PATCH] Prepare for recorder purge to be active by default (#11976) --- homeassistant/components/recorder/__init__.py | 11 +++++++++-- homeassistant/components/recorder/purge.py | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 1adce50b1aa..db208dada4f 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -76,9 +76,9 @@ FILTER_SCHEMA = vol.Schema({ CONFIG_SCHEMA = vol.Schema({ DOMAIN: FILTER_SCHEMA.extend({ - vol.Inclusive(CONF_PURGE_KEEP_DAYS, 'purge'): + vol.Optional(CONF_PURGE_KEEP_DAYS): vol.All(vol.Coerce(int), vol.Range(min=1)), - vol.Inclusive(CONF_PURGE_INTERVAL, 'purge'): + vol.Optional(CONF_PURGE_INTERVAL, default=1): vol.All(vol.Coerce(int), vol.Range(min=1)), vol.Optional(CONF_DB_URL): cv.string, }) @@ -122,6 +122,12 @@ def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: keep_days = conf.get(CONF_PURGE_KEEP_DAYS) purge_interval = conf.get(CONF_PURGE_INTERVAL) + if keep_days is None: + _LOGGER.warning( + "From version 0.64.0 the 'recorder' component will by default " + "purge data older than 10 days. To keep data longer you must " + "configure a 'purge_keep_days' value.") + db_url = conf.get(CONF_DB_URL, None) if not db_url: db_url = DEFAULT_URL.format( @@ -162,6 +168,7 @@ class Recorder(threading.Thread): self.hass = hass self.keep_days = keep_days self.purge_interval = purge_interval + self.did_vacuum = False self.queue = queue.Queue() # type: Any self.recording_start = dt_util.utcnow() self.db_url = uri diff --git a/homeassistant/components/recorder/purge.py b/homeassistant/components/recorder/purge.py index fad6a7de70d..06bd81c2309 100644 --- a/homeassistant/components/recorder/purge.py +++ b/homeassistant/components/recorder/purge.py @@ -55,11 +55,12 @@ def purge_old_data(instance, purge_days): # Execute sqlite vacuum command to free up space on disk _LOGGER.debug("DB engine driver: %s", instance.engine.driver) - if instance.engine.driver == 'pysqlite': + if instance.engine.driver == 'pysqlite' and not instance.did_vacuum: from sqlalchemy import exc _LOGGER.info("Vacuuming SQLite to free space") try: instance.engine.execute("VACUUM") + instance.did_vacuum = True except exc.OperationalError as err: _LOGGER.error("Error vacuuming SQLite: %s.", err)