def rest_call(self, action, resource, data, headers, ignore_codes,
timeout=False):
good_first = sorted(self.servers, key=lambda x: x.failed)
first_response = None
for active_server in good_first:
ret = active_server.rest_call(action, resource, data, headers,
timeout,
reconnect=self.always_reconnect)
# If inconsistent, do a full synchronization
# if ret[0] == httplib.CONFLICT:
# if self.get_topo_function:
# data = self.get_topo_function(
# **self.get_topo_function_args)
# active_server.rest_call('PUT', TOPOLOGY_PATH, data,
# timeout=None)
# Store the first response as the error to be bubbled up to the
# user since it was a good server. Subsequent servers will most
# likely be cluster slaves and won't have a useful error for the
# user (e.g. 302 redirect to master)
if not first_response:
first_response = ret
if not self.server_failure(ret, ignore_codes):
active_server.failed = False
return ret
else:
try:
LOG.error(_LE('ServerProxy: %(action)s failure for '
'servers:%(server)r Response:'
'%(response)s'),
{'action': action,
'server': (active_server.server,
active_server.port),
'response': unicode(ret[3], "utf-8")})
LOG.error(_LE("ServerProxy: Error details: "
"status=%(status)d, reason=%(reason)r, "
"ret=%(ret)s, data=%(data)r"),
{'status': ret[0], 'reason': ret[1],
'ret': unicode(ret[2], "utf-8"),
'data': unicode(ret[3], "utf-8")})
except Exception as e:
LOG.error(_LE("fail to display info, err: %(e)s"),
{'e': e})
active_server.failed = True
# All servers failed, reset server list and try again next time
LOG.error(_('ServerProxy: %(action)s failure for all servers: '
'%(server)r'),
{'action': action,
'server': tuple((s.server,
s.port) for s in self.servers)})
return first_response
评论列表
文章目录