@@ -34,16 +34,23 @@ number_of_searches = 0
36def search_request_wrapper(fn, url, engine_name, **kwargs):
36def search_request_wrapper(fn, url, engine_name, **kwargs):
38+ engine = engines[engine_name]
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
40 # increase errors stats
45 # increase errors stats
41 with threading.RLock():
46 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)
44 # print engine name and specific error message
51 # print engine name and specific error message
45 logger.exception('engine crash: {0}'.format(engine_name))
52 logger.exception('engine crash: {0}'.format(engine_name))
49def threaded_requests(requests):
56def threaded_requests(requests):
@@ -241,6 +248,10 @@ class Search(object):
241 for engine in categories[categ]
248 for engine in categories[categ]
242 if (engine.name, categ) not in self.blocked_engines)
249 if (engine.name, categ) not in self.blocked_engines)
251+ # remove suspended engines
252+ self.engines = [e for e in self.engines
253+ if engines[e['name']].suspend_end_time <= time()]
244 # do search-request
255 # do search-request
245 def search(self, request):
256 def search(self, request):
246 global number_of_searches
257 global number_of_searches