11"""
22Backend for django cache
33"""
4+ import logging
45import socket
56from functools import wraps
67
1112from .cluster_utils import get_cluster_info
1213
1314
15+ logger = logging .getLogger (__name__ )
16+
17+
1418def invalidate_cache_after_error (f ):
1519 """
1620 catch any exception and invalidate internal cache with list of nodes
@@ -46,8 +50,8 @@ def __init__(self, server, params):
4650
4751 # Patch for django<1.11
4852 self ._options = self ._options or dict ()
49- self ._ignore_cluster_errors = self ._options .get (
50- 'ignore_exc ' , False )
53+ self ._cluster_timeout = self ._options .get (
54+ 'cluster_timeout ' , socket . _GLOBAL_DEFAULT_TIMEOUT )
5155
5256 def clear_cluster_nodes_cache (self ):
5357 """clear internal cache with list of nodes in cluster"""
@@ -63,18 +67,28 @@ def get_cluster_nodes(self):
6367 return get_cluster_info (
6468 server ,
6569 port ,
66- self ._ignore_cluster_errors
70+ self ._cluster_timeout
6771 )['nodes' ]
68- except (socket .gaierror , socket .timeout ) as err :
69- raise Exception ('Cannot connect to cluster {} ({})' .format (
70- self ._servers [0 ], err
71- ))
72+ except (OSError , socket .gaierror , socket .timeout ) as err :
73+ logger .debug (
74+ 'Cannot connect to cluster %s, err: %s' ,
75+ self ._servers [0 ],
76+ err
77+ )
78+ return []
7279
7380 @property
7481 def _cache (self ):
82+
7583 if getattr (self , '_client' , None ) is None :
84+
85+ options = self ._options
86+ options .setdefault ('ignore_exc' , True )
87+ options .pop ('cluster_timeout' , None )
88+
7689 self ._client = self ._lib .Client (
77- self .get_cluster_nodes (), ** self ._options )
90+ self .get_cluster_nodes (), ** options )
91+
7892 return self ._client
7993
8094 @invalidate_cache_after_error
0 commit comments