Add delay on failure to upload skillsettingsmeta

Mycroft-core won't retry for 5 minutes on a 422, 500 or 501 error.

This adds a DelayRequests Exception which will cause the settings
fetching Timer thread to sleep for 5 minutes
pull/2116/head
Åke Forslund 2019-05-06 22:26:21 +02:00
parent 79d1e98021
commit 0b11cdac0a
1 changed files with 17 additions and 3 deletions

View File

@ -63,13 +63,18 @@ import hashlib
import os import os
from threading import Timer from threading import Timer
from os.path import isfile, join, expanduser from os.path import isfile, join, expanduser
from requests.exceptions import RequestException from requests.exceptions import RequestException, HTTPError
from mycroft.api import DeviceApi, is_paired from mycroft.api import DeviceApi, is_paired
from mycroft.util.log import LOG from mycroft.util.log import LOG
from mycroft.configuration import ConfigurationManager from mycroft.configuration import ConfigurationManager
class DelayRequest(Exception):
""" Indicate that the next request should be delayed. """
pass
class SkillSettings(dict): class SkillSettings(dict):
""" Dictionary that can easily be saved to a file, serialized as json. It """ Dictionary that can easily be saved to a file, serialized as json. It
also syncs to the backend for skill settings also syncs to the backend for skill settings
@ -219,6 +224,12 @@ class SkillSettings(dict):
try: try:
uuid = self._put_metadata(settings_meta) uuid = self._put_metadata(settings_meta)
return uuid return uuid
except HTTPError as e:
if e.response.status_code in [422, 500, 501]:
raise DelayRequest
else:
LOG.error(e)
return None
except Exception as e: except Exception as e:
LOG.error(e) LOG.error(e)
return None return None
@ -385,6 +396,7 @@ class SkillSettings(dict):
request settings and store it if it changes request settings and store it if it changes
TODO: implement as websocket TODO: implement as websocket
""" """
delay = 1
original = hash(str(self)) original = hash(str(self))
try: try:
if not is_paired(): if not is_paired():
@ -393,7 +405,9 @@ class SkillSettings(dict):
self.initialize_remote_settings() self.initialize_remote_settings()
else: else:
self.update_remote() self.update_remote()
except DelayRequest:
LOG.info('{}: Delaying next settings fetch'.format(self.name))
delay = 5
except Exception as e: except Exception as e:
LOG.exception('Failed to fetch skill settings: {}'.format(repr(e))) LOG.exception('Failed to fetch skill settings: {}'.format(repr(e)))
finally: finally:
@ -409,7 +423,7 @@ class SkillSettings(dict):
return return
# continues to poll settings every minute # continues to poll settings every minute
self._poll_timer = Timer(1 * 60, self._poll_skill_settings) self._poll_timer = Timer(delay * 60, self._poll_skill_settings)
self._poll_timer.daemon = True self._poll_timer.daemon = True
self._poll_timer.start() self._poll_timer.start()