2
0
mirror of https://opendev.org/x/pyghmi synced 2025-01-15 20:27:45 +00:00

Fix concurrent raw_command calls to Session

If two contexts call raw_command concurrently, there was a scenario
where the first to transmit has its result overwritten by the next to
send and corrupts the results of the first command.  One scenario
where this was encountered was when a get health call was being
serviced at the same moment SOL attempted to open a console, causing
one of the get sensor readings to complain that 'SOL was already
active'.  Address it by storing away lastresponse in a more context
specific place before deasserting 'incommand' and remove instances
that deasserted it earlier.

Change-Id: I504da3f54562a4b65b8f4e9e20c19aed9d21a09f
This commit is contained in:
Jarrod Johnson 2014-06-13 09:37:58 -04:00
parent 3bb4e3ac09
commit e167ee6a47

View File

@ -572,7 +572,9 @@ class Session(object):
#order of data on the network
while retry and self.lastresponse is None:
Session.wait_for_rsp(timeout=timeout)
return self.lastresponse
lastresponse = self.lastresponse
self.incommand = False
return lastresponse
def _send_ipmi_net_payload(self, netfn, command, data, bridge_request=None,
retry=True, delay_xmit=None):
@ -1326,7 +1328,6 @@ class Session(object):
self.send_payload(payload=nextpayload,
payload_type=nextpayloadtype,
retry=retry)
self.incommand = False
self.ipmicallback(response)
def _timedout(self):
@ -1337,7 +1338,6 @@ class Session(object):
if self.timeout > self.maxtimeout:
response = {'error': 'timeout'}
self.ipmicallback(response)
self.incommand = False
self.nowait = False
self._mark_broken()
return