From 79efa5e1b49e246885abe565da8e455f52dc0b51 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Sat, 1 Feb 2014 10:17:58 -0500 Subject: [PATCH] Fix Console write race condition If a caller tries to send data immediately after getting their Console object, they can trigger a problem since the session is not yet established. Correct this by spinning in send_payload until session is either established or fails. Change-Id: Ia3a2582563d5385212202c036c0716a3cf36b80c --- pyghmi/ipmi/console.py | 8 +++++++- pyghmi/ipmi/private/session.py | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pyghmi/ipmi/console.py b/pyghmi/ipmi/console.py index ea942cc6..486c8481 100644 --- a/pyghmi/ipmi/console.py +++ b/pyghmi/ipmi/console.py @@ -44,6 +44,8 @@ class Console(object): def __init__(self, bmc, userid, password, iohandler, port=623, force=False, kg=None): + self.connected = False + self.broken = False if type(iohandler) == tuple: # two file handles self.console_in = iohandler[0] self.console_out = iohandler[1] @@ -77,7 +79,7 @@ class Console(object): """Private function to navigate SOL payload activation """ if 'error' in response: - self._print_data(response['error']) + self._print_error(response['error']) return #Send activate sol payload directive #netfn= 6 (application) @@ -140,6 +142,7 @@ class Console(object): if self.console_in is not None: self.ipmi_session.register_handle_callback(self.console_in, self._got_cons_input) + self.connected = True def _got_cons_input(self, handle): """Callback for handle events detected by ipmi session @@ -182,6 +185,8 @@ class Console(object): self.send_payload(payload) def send_payload(self, payload, payload_type=1, retry=True): + while not (self.connected or self.broken): + session.Session.wait_for_rsp(timeout=10) if not self.ipmi_session.logged: raise exc.IpmiException('Session no longer connected') self.ipmi_session.send_payload(payload, @@ -192,6 +197,7 @@ class Console(object): self._print_data({'info': info}) def _print_error(self, error): + self.broken = True if type(error) == dict: self._print_data(error) else: diff --git a/pyghmi/ipmi/private/session.py b/pyghmi/ipmi/private/session.py index 6321d857..7af988a9 100644 --- a/pyghmi/ipmi/private/session.py +++ b/pyghmi/ipmi/private/session.py @@ -264,7 +264,6 @@ class Session(object): def onlogon(self, parameter): if 'error' in parameter: self._mark_broken() - return while self.logonwaiters: waiter = self.logonwaiters.pop() waiter(parameter)