Sfoglia il codice sorgente

[enh] suspend engines after error

The duration is based on the number of continuous errors, but maximized in one minute
Adam Tauber 9 anni fa
parent
commit
10947536aa
2 ha cambiato i file con 17 aggiunte e 4 eliminazioni
  1. 3
    1
      searx/engines/__init__.py
  2. 14
    3
      searx/search.py

+ 3
- 1
searx/engines/__init__.py Vedi File

@@ -40,7 +40,9 @@ engine_default_args = {'paging': False,
40 40
                        'safesearch': False,
41 41
                        'timeout': settings['outgoing']['request_timeout'],
42 42
                        'shortcut': '-',
43
-                       'disabled': False}
43
+                       'disabled': False,
44
+                       'suspend_end_time': 0,
45
+                       'continuous_errors': 0}
44 46
 
45 47
 
46 48
 def load_module(filename):

+ 14
- 3
searx/search.py Vedi File

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