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
@@ -63,13 +63,18 @@ import hashlib
import os
from threading import Timer
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.util.log import LOG
from mycroft.configuration import ConfigurationManager
+class DelayRequest(Exception):
+ """ Indicate that the next request should be delayed. """
+ pass
+
+
class SkillSettings(dict):
""" Dictionary that can easily be saved to a file, serialized as json. It
also syncs to the backend for skill settings
@@ -219,6 +224,12 @@ class SkillSettings(dict):
try:
uuid = self._put_metadata(settings_meta)
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:
LOG.error(e)
return None
@@ -385,6 +396,7 @@ class SkillSettings(dict):
request settings and store it if it changes
TODO: implement as websocket
"""
+ delay = 1
original = hash(str(self))
try:
if not is_paired():
@@ -393,7 +405,9 @@ class SkillSettings(dict):
self.initialize_remote_settings()
else:
self.update_remote()
-
+ except DelayRequest:
+ LOG.info('{}: Delaying next settings fetch'.format(self.name))
+ delay = 5
except Exception as e:
LOG.exception('Failed to fetch skill settings: {}'.format(repr(e)))
finally:
@@ -409,7 +423,7 @@ class SkillSettings(dict):
return
# 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.start()
