2
0
mirror of https://github.com/xcat2/confluent.git synced 2024-11-25 19:10:10 +00:00

Implement persistent IPMI structures

This reduces the health check from 2 seconds to 500 milliseconds
This commit is contained in:
Jarrod Johnson 2014-04-15 15:24:32 -04:00
parent ca2a4ed775
commit e4d0cb8207

View File

@ -162,7 +162,8 @@ class IpmiIterator(object):
cfg.decrypt = crypt
self.gpile = greenpool.GreenPile()
for node in nodes:
self.gpile.spawn(perform_request, operator, node, element, configdata, inputdata)
self.gpile.spawn(perform_request, operator, node, element,
configdata, inputdata, cfg)
def __iter__(self):
return self
@ -178,12 +179,14 @@ class IpmiIterator(object):
self.currdata = None
return retdata
def perform_request(operator, node, element, configdata, inputdata):
return IpmiHandler(operator, node, element, configdata, inputdata).handle_request()
def perform_request(operator, node, element, configdata, inputdata, cfg):
return IpmiHandler(operator, node, element, configdata, inputdata, cfg
).handle_request()
persistent_ipmicmds = {}
class IpmiHandler(object):
def __init__(self, operation, node, element, cfd, inputdata):
def __init__(self, operation, node, element, cfd, inputdata, cfg):
self.broken = False
eventlet.sleep(0)
self.cfg = cfd[node]
@ -193,14 +196,16 @@ class IpmiHandler(object):
self.op = operation
connparams = get_conn_params(node, self.cfg)
self.ipmicmd = None
self._logevt = threading.Event()
self.inputdata = inputdata
self.ipmicmd = ipmicommand.Command(bmc=connparams['bmc'],
userid=connparams['username'],
password=connparams['passphrase'],
kg=connparams['kg'],
port=connparams['port'],
onlogon=self.logged)
tenant = cfg.tenant
self._logevt = None
if (node,tenant) not in persistent_ipmicmds:
self._logevt = threading.Event()
persistent_ipmicmds[(node,tenant)] = ipmicommand.Command(
bmc=connparams['bmc'], userid=connparams['username'],
password=connparams['passphrase'], kg=connparams['kg'],
port=connparams['port'], onlogon=self.logged)
self.ipmicmd = persistent_ipmicmds[(node,tenant)]
bootdevices = {
'optical': 'cd'
@ -215,7 +220,9 @@ class IpmiHandler(object):
self._logevt.set()
def handle_request(self):
self._logevt.wait()
if self._logevt is not None:
self._logevt.wait()
self._logevt = None
if self.broken:
if self.error == 'timeout':
raise exc.TargetEndpointUnreachable('Target timed out')