Skip to content
This repository was archived by the owner on Nov 18, 2017. It is now read-only.

Commit e5267c1

Browse files
committed
Merge pull request #32 from compose/improve-error-handling
Improve error handling
2 parents ab7a4df + 9e6d73e commit e5267c1

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

helpers/etcd.py

+36-11
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ def current_leader(self):
6161
if e.code == 404:
6262
return None
6363
raise helpers.errors.CurrentLeaderError("Etcd is not responding properly")
64+
except urllib2.URLError:
65+
raise helpers.errors.CurrentLeaderError("Etcd is not responding properly")
6466

6567
def members(self):
6668
try:
@@ -75,6 +77,9 @@ def members(self):
7577
if e.code == 404:
7678
return None
7779
raise helpers.errors.CurrentLeaderError("Etcd is not responding properly")
80+
except urllib2.URLError:
81+
raise helpers.errors.CurrentLeaderError("Etcd is not responding properly")
82+
7883

7984
def touch_member(self, member, connection_string):
8085
self.put_client_path("/members/%s" % member, {"value": connection_string, "ttl": self.ttl})
@@ -89,12 +94,14 @@ def attempt_to_acquire_leader(self, value):
8994
if e.code == 412:
9095
logger.info("Could not take out TTL lock: %s" % e)
9196
return False
97+
except urllib2.URLError:
98+
return False
9299

93100
def update_leader(self, state_handler):
94101
try:
95102
self.put_client_path("/leader", {"value": state_handler.name, "ttl": self.ttl, "prevValue": state_handler.name})
96103
self.put_client_path("/optime/leader", {"value": state_handler.last_operation()})
97-
except urllib2.HTTPError:
104+
except (urllib2.HTTPError, urllib2.URLError) as e:
98105
logger.error("Error updating leader lock and optime on ETCD for primary.")
99106
return False
100107

@@ -105,6 +112,9 @@ def last_leader_operation(self):
105112
if e.code == 404:
106113
logger.error("Error updating TTL on ETCD for primary.")
107114
return None
115+
except urllib2.URLError:
116+
logger.error("Error updating TTL on ETCD for primary.")
117+
return None
108118

109119
def leader_unlocked(self):
110120
try:
@@ -114,19 +124,34 @@ def leader_unlocked(self):
114124
if e.code == 404:
115125
return True
116126
return False
117-
except ValueError as e:
127+
except urllib2.URLError:
128+
return False
129+
except ValueError:
118130
return False
119131

120132
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):
129133
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
131137
except urllib2.HTTPError:
138+
logger.error("Couldn't reach etcd")
139+
return False
140+
except urllib2.URLError:
141+
logger.error("Couldn't reach etcd")
132142
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)

helpers/ha.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def has_lock(self):
3434
return self.etcd.am_i_leader(self.state_handler.name)
3535

3636
def fetch_current_leader(self):
37-
return self.etcd.current_leader()
37+
return self.etcd.current_leader()
3838

3939
def run_cycle(self):
4040
try:

0 commit comments

Comments
 (0)