summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2020-08-24 14:57:01 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2020-08-25 18:14:53 +0100
commit0bcc00ac517bdb9a8035397fcac0a402fe1aad13 (patch)
treed4aa8bd9e8660e1e7bb5ac752523237f9b7d5e44 /bitbake/lib
parent59421f688ce5a6ca95e7a02bb4e517b4690cad8c (diff)
downloadpoky-0bcc00ac517bdb9a8035397fcac0a402fe1aad13.tar.gz
bitbake: cooker: Defer configuration init to after UI connection
Currently we end up parsing the base configuration multiple times as initially, the right settings haven't come from the UI. We can defer this until later in startup using runCommand as a trigger. The advantage to doing this is improved startup times and ultimately we should be able to avoid the double parse of the base configuration. (Bitbake rev: 3caa43b665604475d2c87ba505efb0b9fca9c2e9) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
-rw-r--r--bitbake/lib/bb/command.py9
-rw-r--r--bitbake/lib/bb/cooker.py17
-rw-r--r--bitbake/lib/bb/server/process.py38
3 files changed, 37 insertions, 27 deletions
diff --git a/bitbake/lib/bb/command.py b/bitbake/lib/bb/command.py
index 4d152ff4c0..d4dcc653a0 100644
--- a/bitbake/lib/bb/command.py
+++ b/bitbake/lib/bb/command.py
@@ -54,13 +54,20 @@ class Command:
54 self.cooker = cooker 54 self.cooker = cooker
55 self.cmds_sync = CommandsSync() 55 self.cmds_sync = CommandsSync()
56 self.cmds_async = CommandsAsync() 56 self.cmds_async = CommandsAsync()
57 self.remotedatastores = bb.remotedata.RemoteDatastores(cooker) 57 self.remotedatastores = None
58 58
59 # FIXME Add lock for this 59 # FIXME Add lock for this
60 self.currentAsyncCommand = None 60 self.currentAsyncCommand = None
61 61
62 def runCommand(self, commandline, ro_only = False): 62 def runCommand(self, commandline, ro_only = False):
63 command = commandline.pop(0) 63 command = commandline.pop(0)
64
65 # Ensure cooker is ready for commands
66 if command != "updateConfig" and command != "setFeatures":
67 self.cooker.init_configdata()
68 if not self.remotedatastores:
69 self.remotedatastores = bb.remotedata.RemoteDatastores(self.cooker)
70
64 if hasattr(CommandsSync, command): 71 if hasattr(CommandsSync, command):
65 # Can run synchronous commands straight away 72 # Can run synchronous commands straight away
66 command_method = getattr(self.cmds_sync, command) 73 command_method = getattr(self.cmds_sync, command)
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index 3f351cbea6..3f9cb75434 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -195,11 +195,6 @@ class BBCooker:
195 self.hashserv = None 195 self.hashserv = None
196 self.hashservaddr = None 196 self.hashservaddr = None
197 197
198 self.initConfigurationData()
199
200 bb.debug(1, "BBCooker parsed base configuration %s" % time.time())
201 sys.stdout.flush()
202
203 self.inotify_modified_files = [] 198 self.inotify_modified_files = []
204 199
205 def _process_inotify_updates(server, cooker, abort): 200 def _process_inotify_updates(server, cooker, abort):
@@ -233,6 +228,13 @@ class BBCooker:
233 bb.debug(1, "BBCooker startup complete %s" % time.time()) 228 bb.debug(1, "BBCooker startup complete %s" % time.time())
234 sys.stdout.flush() 229 sys.stdout.flush()
235 230
231 def init_configdata(self):
232 if not hasattr(self, "data"):
233 self.initConfigurationData()
234 bb.debug(1, "BBCooker parsed base configuration %s" % time.time())
235 sys.stdout.flush()
236 self.handlePRServ()
237
236 def process_inotify_updates(self): 238 def process_inotify_updates(self):
237 for n in [self.confignotifier, self.notifier]: 239 for n in [self.confignotifier, self.notifier]:
238 if n.check_events(timeout=0): 240 if n.check_events(timeout=0):
@@ -318,7 +320,7 @@ class BBCooker:
318 for feature in features: 320 for feature in features:
319 self.featureset.setFeature(feature) 321 self.featureset.setFeature(feature)
320 bb.debug(1, "Features set %s (was %s)" % (original_featureset, list(self.featureset))) 322 bb.debug(1, "Features set %s (was %s)" % (original_featureset, list(self.featureset)))
321 if (original_featureset != list(self.featureset)) and self.state != state.error: 323 if (original_featureset != list(self.featureset)) and self.state != state.error and hasattr(self, "data"):
322 self.reset() 324 self.reset()
323 325
324 def initConfigurationData(self): 326 def initConfigurationData(self):
@@ -1658,9 +1660,6 @@ class BBCooker:
1658 return pkgs_to_build 1660 return pkgs_to_build
1659 1661
1660 def pre_serve(self): 1662 def pre_serve(self):
1661 # We now are in our own process so we can call this here.
1662 # PRServ exits if its parent process exits
1663 self.handlePRServ()
1664 return 1663 return
1665 1664
1666 def post_serve(self): 1665 def post_serve(self):
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py
index 65e1eab527..b037e0fb6c 100644
--- a/bitbake/lib/bb/server/process.py
+++ b/bitbake/lib/bb/server/process.py
@@ -58,6 +58,7 @@ class ProcessServer():
58 self.sockname = sockname 58 self.sockname = sockname
59 59
60 self.server_timeout = server_timeout 60 self.server_timeout = server_timeout
61 self.timeout = self.server_timeout
61 self.xmlrpcinterface = xmlrpcinterface 62 self.xmlrpcinterface = xmlrpcinterface
62 63
63 def register_idle_function(self, function, data): 64 def register_idle_function(self, function, data):
@@ -72,21 +73,6 @@ class ProcessServer():
72 73
73 print("Bitbake XMLRPC server address: %s, server port: %s" % (self.xmlrpc.host, self.xmlrpc.port)) 74 print("Bitbake XMLRPC server address: %s, server port: %s" % (self.xmlrpc.host, self.xmlrpc.port))
74 75
75 heartbeat_event = self.cooker.data.getVar('BB_HEARTBEAT_EVENT')
76 if heartbeat_event:
77 try:
78 self.heartbeat_seconds = float(heartbeat_event)
79 except:
80 bb.warn('Ignoring invalid BB_HEARTBEAT_EVENT=%s, must be a float specifying seconds.' % heartbeat_event)
81
82 self.timeout = self.server_timeout or self.cooker.data.getVar('BB_SERVER_TIMEOUT')
83 try:
84 if self.timeout:
85 self.timeout = float(self.timeout)
86 except:
87 bb.warn('Ignoring invalid BB_SERVER_TIMEOUT=%s, must be a float specifying seconds.' % self.timeout)
88
89
90 try: 76 try:
91 self.bitbake_lock.seek(0) 77 self.bitbake_lock.seek(0)
92 self.bitbake_lock.truncate() 78 self.bitbake_lock.truncate()
@@ -129,6 +115,7 @@ class ProcessServer():
129 fds = [self.sock] 115 fds = [self.sock]
130 if self.xmlrpc: 116 if self.xmlrpc:
131 fds.append(self.xmlrpc) 117 fds.append(self.xmlrpc)
118 seendata = False
132 print("Entering server connection loop") 119 print("Entering server connection loop")
133 120
134 def disconnect_client(self, fds): 121 def disconnect_client(self, fds):
@@ -228,6 +215,22 @@ class ProcessServer():
228 if self.xmlrpc in ready: 215 if self.xmlrpc in ready:
229 self.xmlrpc.handle_requests() 216 self.xmlrpc.handle_requests()
230 217
218 if not seendata and hasattr(self.cooker, "data"):
219 heartbeat_event = self.cooker.data.getVar('BB_HEARTBEAT_EVENT')
220 if heartbeat_event:
221 try:
222 self.heartbeat_seconds = float(heartbeat_event)
223 except:
224 bb.warn('Ignoring invalid BB_HEARTBEAT_EVENT=%s, must be a float specifying seconds.' % heartbeat_event)
225
226 self.timeout = self.server_timeout or self.cooker.data.getVar('BB_SERVER_TIMEOUT')
227 try:
228 if self.timeout:
229 self.timeout = float(self.timeout)
230 except:
231 bb.warn('Ignoring invalid BB_SERVER_TIMEOUT=%s, must be a float specifying seconds.' % self.timeout)
232 seendata = True
233
231 ready = self.idle_commands(.1, fds) 234 ready = self.idle_commands(.1, fds)
232 235
233 print("Exiting") 236 print("Exiting")
@@ -323,8 +326,9 @@ class ProcessServer():
323 self.next_heartbeat += self.heartbeat_seconds 326 self.next_heartbeat += self.heartbeat_seconds
324 if self.next_heartbeat <= now: 327 if self.next_heartbeat <= now:
325 self.next_heartbeat = now + self.heartbeat_seconds 328 self.next_heartbeat = now + self.heartbeat_seconds
326 heartbeat = bb.event.HeartbeatEvent(now) 329 if hasattr(self.cooker, "data"):
327 bb.event.fire(heartbeat, self.cooker.data) 330 heartbeat = bb.event.HeartbeatEvent(now)
331 bb.event.fire(heartbeat, self.cooker.data)
328 if nextsleep and now + nextsleep > self.next_heartbeat: 332 if nextsleep and now + nextsleep > self.next_heartbeat:
329 # Shorten timeout so that we we wake up in time for 333 # Shorten timeout so that we we wake up in time for
330 # the heartbeat. 334 # the heartbeat.