@@ -61,6 +61,8 @@ def current_leader(self):
61
61
if e .code == 404 :
62
62
return None
63
63
raise helpers .errors .CurrentLeaderError ("Etcd is not responding properly" )
64
+ except urllib2 .URLError :
65
+ raise helpers .errors .CurrentLeaderError ("Etcd is not responding properly" )
64
66
65
67
def members (self ):
66
68
try :
@@ -75,6 +77,9 @@ def members(self):
75
77
if e .code == 404 :
76
78
return None
77
79
raise helpers .errors .CurrentLeaderError ("Etcd is not responding properly" )
80
+ except urllib2 .URLError :
81
+ raise helpers .errors .CurrentLeaderError ("Etcd is not responding properly" )
82
+
78
83
79
84
def touch_member (self , member , connection_string ):
80
85
self .put_client_path ("/members/%s" % member , {"value" : connection_string , "ttl" : self .ttl })
@@ -89,12 +94,14 @@ def attempt_to_acquire_leader(self, value):
89
94
if e .code == 412 :
90
95
logger .info ("Could not take out TTL lock: %s" % e )
91
96
return False
97
+ except urllib2 .URLError :
98
+ return False
92
99
93
100
def update_leader (self , state_handler ):
94
101
try :
95
102
self .put_client_path ("/leader" , {"value" : state_handler .name , "ttl" : self .ttl , "prevValue" : state_handler .name })
96
103
self .put_client_path ("/optime/leader" , {"value" : state_handler .last_operation ()})
97
- except urllib2 .HTTPError :
104
+ except ( urllib2 .HTTPError , urllib2 . URLError ) as e :
98
105
logger .error ("Error updating leader lock and optime on ETCD for primary." )
99
106
return False
100
107
@@ -105,6 +112,9 @@ def last_leader_operation(self):
105
112
if e .code == 404 :
106
113
logger .error ("Error updating TTL on ETCD for primary." )
107
114
return None
115
+ except urllib2 .URLError :
116
+ logger .error ("Error updating TTL on ETCD for primary." )
117
+ return None
108
118
109
119
def leader_unlocked (self ):
110
120
try :
@@ -114,19 +124,34 @@ def leader_unlocked(self):
114
124
if e .code == 404 :
115
125
return True
116
126
return False
117
- except ValueError as e :
127
+ except urllib2 .URLError :
128
+ return False
129
+ except ValueError :
118
130
return False
119
131
120
132
def am_i_leader (self , value ):
121
- #try:
122
- reponse = self .get_client_path ("/leader" )
123
- logger .info ("Lock owner: %s; I am %s" % (reponse ["node" ]["value" ], value ))
124
- return reponse ["node" ]["value" ] == value
125
- #except Exception as e:
126
- #return False
127
-
128
- def race (self , path , value ):
129
133
try :
130
- return self .put_client_path (path , {"prevExist" : False , "value" : value }) == None
134
+ reponse = self .get_client_path ("/leader" )
135
+ logger .info ("Lock owner: %s; I am %s" % (reponse ["node" ]["value" ], value ))
136
+ return reponse ["node" ]["value" ] == value
131
137
except urllib2 .HTTPError :
138
+ logger .error ("Couldn't reach etcd" )
139
+ return False
140
+ except urllib2 .URLError :
141
+ logger .error ("Couldn't reach etcd" )
132
142
return False
143
+
144
+
145
+ def race (self , path , value ):
146
+ while True :
147
+ try :
148
+ return self .put_client_path (path , {"prevExist" : False , "value" : value }) == None
149
+ except urllib2 .HTTPError as e :
150
+ if e .code == 412 :
151
+ return False
152
+ else :
153
+ logger .warning ("etcd is not ready for connections" )
154
+ time .sleep (10 )
155
+ except urllib2 .URLError :
156
+ logger .warning ("Issue connecting to etcd" )
157
+ time .sleep (10 )
0 commit comments