[bitbake-devel] [RFC PATCH 2/3] bitbake: lib: fix --observe-only

Robert Yang liezhi.yang at windriver.com
Tue Jul 11 10:27:47 UTC 2017


Fixed:
$ . ../poky/oe-init-build-env-memres .
$ bitbake world
In another terminal
$ . ../poky/oe-init-build-env-memres .
$ bitbake --observe-only
Traceback (most recent call last):
  File "/buildarea/lyang1/poky/bitbake/bin/bitbake", line 48, in <module>
    cookerdata.CookerConfiguration()))
  File "/buildarea/lyang1/poky/bitbake/lib/bb/main.py", line 456, in bitbake_main
    server, server_connection, ui_module = setup_bitbake(configParams, configuration)
  File "/buildarea/lyang1/poky/bitbake/lib/bb/main.py", line 544, in setup_bitbake
    server_connection.setupEventQueue()
  File "/buildarea/lyang1/poky/bitbake/lib/bb/server/xmlrpc.py", line 363, in setupEventQueue
    self.events = uievent.BBUIEventQueue(self.connection, self.clientinfo)
  File "/buildarea/lyang1/poky/bitbake/lib/bb/ui/uievent.py", line 72, in __init__
    raise Exception(errmsg)
Exception: Could not register UI event handler. Error: Cooker is busy: running, host 127.0.0.1, port 36350
WARNING: Could not register UI event handler. Error: Cooker is busy: running, host 127.0.0.1, port 36350, retry
[snip]

This was becuase xmlrpc doesn't allow connections when cooker is running, but
--observe-only doesn't do any builds, so allow it to connect is safe.

[YOCTO #10731]

Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
---
 bitbake/lib/bb/main.py          |  2 +-
 bitbake/lib/bb/server/xmlrpc.py | 13 ++++++++-----
 bitbake/lib/bb/ui/uievent.py    |  5 +++--
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/bitbake/lib/bb/main.py b/bitbake/lib/bb/main.py
index 29e391162e6..f998e9dfef4 100755
--- a/bitbake/lib/bb/main.py
+++ b/bitbake/lib/bb/main.py
@@ -541,7 +541,7 @@ def setup_bitbake(configParams, configuration, extrafeatures=None, setup_logging
             bb.event.ui_queue = []
             return None, None, None
 
-        server_connection.setupEventQueue()
+        server_connection.setupEventQueue(configParams.observe_only)
 
         # Restore the environment in case the UI needs it
         for k in cleanedvars:
diff --git a/bitbake/lib/bb/server/xmlrpc.py b/bitbake/lib/bb/server/xmlrpc.py
index 1a475e04ba5..bbc37d72f9b 100644
--- a/bitbake/lib/bb/server/xmlrpc.py
+++ b/bitbake/lib/bb/server/xmlrpc.py
@@ -108,14 +108,14 @@ class BitBakeServerCommands():
         self.server = server
         self.has_client = False
 
-    def registerEventHandler(self, host, port):
+    def registerEventHandler(self, host, port, observe_only=False):
         """
         Register a remote UI Event Handler
         """
         s, t = _create_server(host, port)
 
-        # we don't allow connections if the cooker is running
-        if (self.cooker.state in [bb.cooker.state.parsing, bb.cooker.state.running]):
+        # Only allow observe_only connections if the cooker is running
+        if (self.cooker.state in [bb.cooker.state.parsing, bb.cooker.state.running]) and not observe_only:
             return None, "Cooker is busy: %s" % bb.cooker.state.get_name(self.cooker.state)
 
         self.event_handle = bb.event.register_UIHhandler(s, True)
@@ -359,11 +359,14 @@ class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection):
         self.transport.set_connection_token(token)
         return self
 
-    def setupEventQueue(self):
-        self.events = uievent.BBUIEventQueue(self.connection, self.clientinfo)
+    def setupEventQueue(self, observe_only=False):
+        self.events = uievent.BBUIEventQueue(self.connection, self.clientinfo, observe_only)
         for event in bb.event.ui_queue:
             self.events.queue_event(event)
 
+        if observe_only:
+            return
+
         _, error = self.connection.runCommand(["setFeatures", self.featureset])
         if error:
             # disconnect the client, we can't make the setFeature work
diff --git a/bitbake/lib/bb/ui/uievent.py b/bitbake/lib/bb/ui/uievent.py
index 9542b911ca0..7dfe02c6c97 100644
--- a/bitbake/lib/bb/ui/uievent.py
+++ b/bitbake/lib/bb/ui/uievent.py
@@ -28,7 +28,7 @@ import socket, threading, pickle, collections
 from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
 
 class BBUIEventQueue:
-    def __init__(self, BBServer, clientinfo=("localhost, 0")):
+    def __init__(self, BBServer, clientinfo=("localhost, 0"), observe_only=False):
 
         self.eventQueue = []
         self.eventQueueLock = threading.Lock()
@@ -36,6 +36,7 @@ class BBUIEventQueue:
 
         self.BBServer = BBServer
         self.clientinfo = clientinfo
+        self.observe_only = observe_only
 
         server = UIXMLRPCServer(self.clientinfo)
         self.host, self.port = server.socket.getsockname()
@@ -51,7 +52,7 @@ class BBUIEventQueue:
         # giving up
 
         for count_tries in range(5):
-            ret = self.BBServer.registerEventHandler(self.host, self.port)
+            ret = self.BBServer.registerEventHandler(self.host, self.port, self.observe_only)
 
             if isinstance(ret, collections.Iterable):
                 self.EventHandle, error = ret
-- 
2.11.0




More information about the bitbake-devel mailing list