[bitbake-devel] [PATCH 2/9 v2] xmlrpc: client - remove fatal errors

Damian, Alexandru alexandru.damian at intel.com
Wed Jun 4 14:48:07 UTC 2014


Hello,

I've refactored the patch to take out the print statement that executed on
the last run of the idle functions.

Can you please merge ?

Cheers,
Alex




On Wed, Jun 4, 2014 at 3:47 PM, Alex DAMIAN <alexandru.damian at intel.com>
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 | 21 ++++++++++++++-------
>  lib/bb/ui/uievent.py    |  3 ++-
>  3 files changed, 29 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..d6f4338 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,9 +253,13 @@ 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():
> @@ -346,7 +350,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 +361,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
>
>


-- 
Alex Damian
Yocto Project
SSG / OTC
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/bitbake-devel/attachments/20140604/315cb40c/attachment-0002.html>


More information about the bitbake-devel mailing list