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 minutespull/2116/head
							parent
							
								
									79d1e98021
								
							
						
					
					
						commit
						0b11cdac0a
					
				| 
						 | 
					@ -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()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue