Patchwork [bitbake-devel,2/9] xmlrpc: client - remove fatal errors

login
register
mail settings
Submitter Alexandru DAMIAN
Date June 3, 2014, 3:26 p.m.
Message ID <553c5d33afe658883ceab81d0fe8b0318300dbe7.1401808899.git.alexandru.damian@intel.com>
Download mbox | patch
Permalink /patch/73155/
State New
Headers show

Comments

Alexandru DAMIAN - June 3, 2014, 3:26 p.m.
From: Alexandru DAMIAN <alexandru.damian@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@intel.com>
---
 bin/bitbake             | 23 +++++++++++++----------
 lib/bb/server/xmlrpc.py | 22 +++++++++++++++-------
 lib/bb/ui/uievent.py    |  3 ++-
 3 files changed, 30 insertions(+), 18 deletions(-)
Richard Purdie - June 3, 2014, 4:38 p.m.
On Tue, 2014-06-03 at 16:26 +0100, Alex DAMIAN wrote:
> From: Alexandru DAMIAN <alexandru.damian@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@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
>
Alexandru DAMIAN - June 4, 2014, 1:20 p.m.
Yep, something wrong with it ?

The thing is that I'm replacing bb.fatal with bb.warn to get a chance for a
remote controlling to intercept errors instead of having the program
shutting down.

Alex


On Tue, Jun 3, 2014 at 5:38 PM, Richard Purdie <
richard.purdie@linuxfoundation.org> wrote:

> On Tue, 2014-06-03 at 16:26 +0100, Alex DAMIAN wrote:
> > From: Alexandru DAMIAN <alexandru.damian@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@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
> >
>
>
>
Richard Purdie - June 4, 2014, 1:51 p.m.
On Wed, 2014-06-04 at 14:20 +0100, Damian, Alexandru wrote:
> Yep, something wrong with it ? 
> 
> 
> The thing is that I'm replacing bb.fatal with bb.warn to get a chance
> for a remote controlling to intercept errors instead of having the
> program shutting down.

But we don't want a print statement for ever idle call?

Cheers,

Richard

> 
> Alex
> 
> 
> On Tue, Jun 3, 2014 at 5:38 PM, Richard Purdie
> <richard.purdie@linuxfoundation.org> wrote:
>         On Tue, 2014-06-03 at 16:26 +0100, Alex DAMIAN wrote:
>         > From: Alexandru DAMIAN <alexandru.damian@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@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
>         >
>         
>         
>         
> 
> 
> 
> 
> -- 
> Alex Damian
> Yocto Project
> 
> SSG / OTC
Alexandru DAMIAN - June 4, 2014, 2:38 p.m.
Oh, now I get it - my email client didn't highlight that you replied to a
specific line -

this is mostly for debugging purposes, to be able to manually monitor the
bitbake running by
> tail -f bitbake-cookerdaemon.log file

Proabably should be in a different patch, though - let me redo this patch.

Thanks,

Alex


On Wed, Jun 4, 2014 at 2:51 PM, Richard Purdie <
richard.purdie@linuxfoundation.org> wrote:

> On Wed, 2014-06-04 at 14:20 +0100, Damian, Alexandru wrote:
> > Yep, something wrong with it ?
> >
> >
> > The thing is that I'm replacing bb.fatal with bb.warn to get a chance
> > for a remote controlling to intercept errors instead of having the
> > program shutting down.
>
> But we don't want a print statement for ever idle call?
>
> Cheers,
>
> Richard
>
> >
> > Alex
> >
> >
> > On Tue, Jun 3, 2014 at 5:38 PM, Richard Purdie
> > <richard.purdie@linuxfoundation.org> wrote:
> >         On Tue, 2014-06-03 at 16:26 +0100, Alex DAMIAN wrote:
> >         > From: Alexandru DAMIAN <alexandru.damian@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@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
> >         >
> >
> >
> >
> >
> >
> >
> >
> > --
> > Alex Damian
> > Yocto Project
> >
> > SSG / OTC
>
>
>

Patch

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
                 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