on master help sign in
[enh] suspend engines after error

The duration is based on the number of continuous errors, but maximized in one minute

commit10947536aa1e6e08c54f075b227ba592f1553cb0 authorAdam Tauber <asciimoo@gmail.com> dateSat 20 Feb 2016, 00:21 (11 years ago) parent17b0c9f
2 files changed+17−4
searx/engines/__init__.py+3−1 searx/search.py+14−3
searx/engines/__init__.py+3−1
@@ -40,7 +40,9 @@ engine_default_args = {'paging': False,
4040 'safesearch': False,
4141 'timeout': settings['outgoing']['request_timeout'],
4242 'shortcut': '-',
43− 'disabled': False}
43+ 'disabled': False,
44+ 'suspend_end_time': 0,
45+ 'continuous_errors': 0}
4446
4547
4648def load_module(filename):
searx/search.py+14−3
@@ -34,16 +34,23 @@ number_of_searches = 0
3434
3535
3636def search_request_wrapper(fn, url, engine_name, **kwargs):
37+ ret = None
38+ engine = engines[engine_name]
3739 try:
38− return fn(url, **kwargs)
40+ ret = fn(url, **kwargs)
41+ with threading.RLock():
42+ engine.continuous_errors = 0
43+ engine.suspend_end_time = 0
3944 except:
4045 # increase errors stats
4146 with threading.RLock():
42− engines[engine_name].stats['errors'] += 1
47+ engine.stats['errors'] += 1
48+ engine.continuous_errors += 1
49+ engine.suspend_end_time = time() + min(60, engine.continuous_errors)
4350
4451 # print engine name and specific error message
4552 logger.exception('engine crash: {0}'.format(engine_name))
46− return
53+ return ret
4754
4855
4956def threaded_requests(requests):
@@ -241,6 +248,10 @@ class Search(object):
241248 for engine in categories[categ]
242249 if (engine.name, categ) not in self.blocked_engines)
243250
251+ # remove suspended engines
252+ self.engines = [e for e in self.engines
253+ if engines[e['name']].suspend_end_time <= time()]
254+
244255 # do search-request
245256 def search(self, request):
246257 global number_of_searches