<div dir="ltr"><div class="gmail_default" style="font-family:tahoma,sans-serif">Hello,</div><div class="gmail_default" style="font-family:tahoma,sans-serif"><br></div><div class="gmail_default" style="font-family:tahoma,sans-serif">
I've refactored the patch to take out the print statement that executed on the last run of the idle functions.</div><div class="gmail_default" style="font-family:tahoma,sans-serif"><br></div><div class="gmail_default" style="font-family:tahoma,sans-serif">
Can you please merge ?</div><div class="gmail_default" style="font-family:tahoma,sans-serif"><br></div><div class="gmail_default" style="font-family:tahoma,sans-serif">Cheers,</div><div class="gmail_default" style="font-family:tahoma,sans-serif">
Alex</div><div class="gmail_default" style="font-family:tahoma,sans-serif"><br></div><div class="gmail_default" style="font-family:tahoma,sans-serif"><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Wed, Jun 4, 2014 at 3:47 PM, Alex DAMIAN <span dir="ltr"><<a href="mailto:alexandru.damian@intel.com" target="_blank">alexandru.damian@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="">From: Alexandru DAMIAN <<a href="mailto:alexandru.damian@intel.com">alexandru.damian@intel.com</a>><br>
<br>
When we use the XMLRPC client API to connect to a bitbake server,<br>
we want to receive errors from the API instead of having the<br>
API exiting without warning.<br>
<br>
Thus the "bb.fatal" calls have been replaced with "bb.warn" calls,<br>
and we re-raise the original exception for handling by the<br>
original caller.<br>
<br>
The bitbake starting script has been modified to properly test<br>
for failures in calling the client API and handle them.<br>
<br>
Additional error handling added in the client, as to prevent<br>
fatal crashes.<br>
<br>
Signed-off-by: Alexandru DAMIAN <<a href="mailto:alexandru.damian@intel.com">alexandru.damian@intel.com</a>><br>
---<br>
bin/bitbake | 23 +++++++++++++----------<br>
</div> lib/bb/server/xmlrpc.py | 21 ++++++++++++++-------<br>
lib/bb/ui/uievent.py | 3 ++-<br>
3 files changed, 29 insertions(+), 18 deletions(-)<br>
<div><div class="h5"><br>
diff --git a/bin/bitbake b/bin/bitbake<br>
index fcfe043..ab881c5 100755<br>
--- a/bin/bitbake<br>
+++ b/bin/bitbake<br>
@@ -332,26 +332,29 @@ def main():<br>
server = servermodule.BitBakeXMLRPCClient(configParams.observe_only)<br>
server.saveConnectionDetails(configParams.remote_server)<br>
<br>
+ def _getServerConnection(server, featureset):<br>
+ try:<br>
+ server_connection = server.establishConnection(featureset)<br>
+ except Exception as e:<br>
+ bb.fatal("Could not connect to server %s: %s" % (configParams.remote_server, str(e)))<br>
+ return server_connection<br>
+<br>
if not configParams.server_only:<br>
if configParams.status_only:<br>
- try:<br>
- server_connection = server.establishConnection(featureset)<br>
- except:<br>
- sys.exit(1)<br>
- if not server_connection:<br>
- sys.exit(1)<br>
+ server_connection = _getServerConnection(server, featureset)<br>
server_connection.terminate()<br>
sys.exit(0)<br>
<br>
# Setup a connection to the server (cooker)<br>
- server_connection = server.establishConnection(featureset)<br>
- if not server_connection:<br>
+ try:<br>
+ server_connection = server.establishConnection(featureset)<br>
+ except:<br>
if configParams.kill_server:<br>
- bb.fatal("Server already killed")<br>
+ bb.fatal("Server already offline")<br>
configParams.bind = configParams.remote_server<br>
start_server(servermodule, configParams, configuration, featureset)<br>
bb.event.ui_queue = []<br>
- server_connection = server.establishConnection(featureset)<br>
+ server_connection = _getServerConnection(server, featureset)<br>
<br>
# Restore the environment in case the UI needs it<br>
for k in cleanedvars:<br>
diff --git a/lib/bb/server/xmlrpc.py b/lib/bb/server/xmlrpc.py<br>
</div></div>index 6fc5543..d6f4338 100644<br>
<div class="">--- a/lib/bb/server/xmlrpc.py<br>
+++ b/lib/bb/server/xmlrpc.py<br>
@@ -80,7 +80,7 @@ class BBTransport(xmlrpclib.Transport):<br>
<br>
def _create_server(host, port, timeout = 60):<br>
t = BBTransport(timeout)<br>
- s = xmlrpclib.Server("http://%s:%d/" % (host, port), transport=t, allow_none=True)<br>
+ s = xmlrpclib.ServerProxy("http://%s:%d/" % (host, port), transport=t, allow_none=True)<br>
return s, t<br>
<br>
class BitBakeServerCommands():<br>
</div>@@ -253,9 +253,13 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer):<br>
<div class=""> socktimeout = self.socket.gettimeout() or nextsleep<br>
socktimeout = min(socktimeout, nextsleep)<br>
# Mirror what BaseServer handle_request would do<br>
- fd_sets = select.select(fds, [], [], socktimeout)<br>
- if fd_sets[0] and self in fd_sets[0]:<br>
- self._handle_request_noblock()<br>
+ try:<br>
+ fd_sets = select.select(fds, [], [], socktimeout)<br>
+ if fd_sets[0] and self in fd_sets[0]:<br>
+ self._handle_request_noblock()<br>
+ except IOError:<br>
+ # we ignore interrupted calls<br>
+ pass<br>
<br>
# Tell idle functions we're exiting<br>
for function, data in self._idlefuns.items():<br>
</div>@@ -346,7 +350,8 @@ class BitBakeXMLRPCClient(BitBakeBaseServer):<br>
<div class=""> [host, port] = self.remote.split(":")<br>
port = int(port)<br>
except Exception as e:<br>
- bb.fatal("Failed to read remote definition (%s)" % str(e))<br>
+ bb.warn("Failed to read remote definition (%s)" % str(e))<br>
+ raise e<br>
<br>
# We need our IP for the server connection. We get the IP<br>
# by trying to connect with the server<br>
</div>@@ -356,13 +361,15 @@ class BitBakeXMLRPCClient(BitBakeBaseServer):<br>
<div class="HOEnZb"><div class="h5"> ip = s.getsockname()[0]<br>
s.close()<br>
except Exception as e:<br>
- bb.fatal("Could not create socket for %s:%s (%s)" % (host, port, str(e)))<br>
+ bb.warn("Could not create socket for %s:%s (%s)" % (host, port, str(e)))<br>
+ raise e<br>
try:<br>
self.serverImpl = XMLRPCProxyServer(host, port)<br>
self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0), self.observer_only, featureset)<br>
return self.connection.connect()<br>
except Exception as e:<br>
- bb.fatal("Could not connect to server at %s:%s (%s)" % (host, port, str(e)))<br>
+ bb.warn("Could not connect to server at %s:%s (%s)" % (host, port, str(e)))<br>
+ raise e<br>
<br>
def endSession(self):<br>
self.connection.removeClient()<br>
diff --git a/lib/bb/ui/uievent.py b/lib/bb/ui/uievent.py<br>
index 98658f6..eb760c0 100644<br>
--- a/lib/bb/ui/uievent.py<br>
+++ b/lib/bb/ui/uievent.py<br>
@@ -47,7 +47,8 @@ class BBUIEventQueue:<br>
self.EventHandle = self.BBServer.registerEventHandler(self.host, self.port)<br>
<br>
if (self.EventHandle == None):<br>
- bb.fatal("Could not register UI event handler")<br>
+ bb.warn("Could not register UI event handler %s:%d" % (self.host, self.port))<br>
+ raise Exception("Could not register UI event handler")<br>
<br>
self.server = server<br>
<br>
--<br>
1.9.1<br>
<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Alex Damian<div>Yocto Project<br></div><div>SSG / OTC </div></div>
</div>