[bitbake-devel] [PATCH 2/9] xmlrpc: client - remove fatal errors
Richard Purdie
richard.purdie at linuxfoundation.org
Tue Jun 3 16:38:44 UTC 2014
On Tue, 2014-06-03 at 16:26 +0100, Alex DAMIAN wrote:
> From: Alexandru DAMIAN <alexandru.damian at intel.com>
>
> When we use the XMLRPC client API to connect to a bitbake server,
> we want to receive errors from the API instead of having the
> API exiting without warning.
>
> Thus the "bb.fatal" calls have been replaced with "bb.warn" calls,
> and we re-raise the original exception for handling by the
> original caller.
>
> The bitbake starting script has been modified to properly test
> for failures in calling the client API and handle them.
>
> Additional error handling added in the client, as to prevent
> fatal crashes.
>
> Signed-off-by: Alexandru DAMIAN <alexandru.damian at intel.com>
> ---
> bin/bitbake | 23 +++++++++++++----------
> lib/bb/server/xmlrpc.py | 22 +++++++++++++++-------
> lib/bb/ui/uievent.py | 3 ++-
> 3 files changed, 30 insertions(+), 18 deletions(-)
>
> diff --git a/bin/bitbake b/bin/bitbake
> index fcfe043..ab881c5 100755
> --- a/bin/bitbake
> +++ b/bin/bitbake
> @@ -332,26 +332,29 @@ def main():
> server = servermodule.BitBakeXMLRPCClient(configParams.observe_only)
> server.saveConnectionDetails(configParams.remote_server)
>
> + def _getServerConnection(server, featureset):
> + try:
> + server_connection = server.establishConnection(featureset)
> + except Exception as e:
> + bb.fatal("Could not connect to server %s: %s" % (configParams.remote_server, str(e)))
> + return server_connection
> +
> if not configParams.server_only:
> if configParams.status_only:
> - try:
> - server_connection = server.establishConnection(featureset)
> - except:
> - sys.exit(1)
> - if not server_connection:
> - sys.exit(1)
> + server_connection = _getServerConnection(server, featureset)
> server_connection.terminate()
> sys.exit(0)
>
> # Setup a connection to the server (cooker)
> - server_connection = server.establishConnection(featureset)
> - if not server_connection:
> + try:
> + server_connection = server.establishConnection(featureset)
> + except:
> if configParams.kill_server:
> - bb.fatal("Server already killed")
> + bb.fatal("Server already offline")
> configParams.bind = configParams.remote_server
> start_server(servermodule, configParams, configuration, featureset)
> bb.event.ui_queue = []
> - server_connection = server.establishConnection(featureset)
> + server_connection = _getServerConnection(server, featureset)
>
> # Restore the environment in case the UI needs it
> for k in cleanedvars:
> diff --git a/lib/bb/server/xmlrpc.py b/lib/bb/server/xmlrpc.py
> index 6fc5543..6ec3452 100644
> --- a/lib/bb/server/xmlrpc.py
> +++ b/lib/bb/server/xmlrpc.py
> @@ -80,7 +80,7 @@ class BBTransport(xmlrpclib.Transport):
>
> def _create_server(host, port, timeout = 60):
> t = BBTransport(timeout)
> - s = xmlrpclib.Server("http://%s:%d/" % (host, port), transport=t, allow_none=True)
> + s = xmlrpclib.ServerProxy("http://%s:%d/" % (host, port), transport=t, allow_none=True)
> return s, t
>
> class BitBakeServerCommands():
> @@ -253,13 +253,18 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer):
> socktimeout = self.socket.gettimeout() or nextsleep
> socktimeout = min(socktimeout, nextsleep)
> # Mirror what BaseServer handle_request would do
> - fd_sets = select.select(fds, [], [], socktimeout)
> - if fd_sets[0] and self in fd_sets[0]:
> - self._handle_request_noblock()
> + try:
> + fd_sets = select.select(fds, [], [], socktimeout)
> + if fd_sets[0] and self in fd_sets[0]:
> + self._handle_request_noblock()
> + except IOError:
> + # we ignore interrupted calls
> + pass
>
> # Tell idle functions we're exiting
> for function, data in self._idlefuns.items():
> try:
> + print "Running idle funcs", function, data
Did you mean to leave this in?
Cheers,
Richard
> retval = function(self, data, True)
> except:
> pass
> @@ -346,7 +351,8 @@ class BitBakeXMLRPCClient(BitBakeBaseServer):
> [host, port] = self.remote.split(":")
> port = int(port)
> except Exception as e:
> - bb.fatal("Failed to read remote definition (%s)" % str(e))
> + bb.warn("Failed to read remote definition (%s)" % str(e))
> + raise e
>
> # We need our IP for the server connection. We get the IP
> # by trying to connect with the server
> @@ -356,13 +362,15 @@ class BitBakeXMLRPCClient(BitBakeBaseServer):
> ip = s.getsockname()[0]
> s.close()
> except Exception as e:
> - bb.fatal("Could not create socket for %s:%s (%s)" % (host, port, str(e)))
> + bb.warn("Could not create socket for %s:%s (%s)" % (host, port, str(e)))
> + raise e
> try:
> self.serverImpl = XMLRPCProxyServer(host, port)
> self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0), self.observer_only, featureset)
> return self.connection.connect()
> except Exception as e:
> - bb.fatal("Could not connect to server at %s:%s (%s)" % (host, port, str(e)))
> + bb.warn("Could not connect to server at %s:%s (%s)" % (host, port, str(e)))
> + raise e
>
> def endSession(self):
> self.connection.removeClient()
> diff --git a/lib/bb/ui/uievent.py b/lib/bb/ui/uievent.py
> index 98658f6..eb760c0 100644
> --- a/lib/bb/ui/uievent.py
> +++ b/lib/bb/ui/uievent.py
> @@ -47,7 +47,8 @@ class BBUIEventQueue:
> self.EventHandle = self.BBServer.registerEventHandler(self.host, self.port)
>
> if (self.EventHandle == None):
> - bb.fatal("Could not register UI event handler")
> + bb.warn("Could not register UI event handler %s:%d" % (self.host, self.port))
> + raise Exception("Could not register UI event handler")
>
> self.server = server
>
> --
> 1.9.1
>
More information about the bitbake-devel
mailing list