diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2020-08-24 14:57:01 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2020-08-25 18:14:53 +0100 |
commit | 0bcc00ac517bdb9a8035397fcac0a402fe1aad13 (patch) | |
tree | d4aa8bd9e8660e1e7bb5ac752523237f9b7d5e44 /bitbake | |
parent | 59421f688ce5a6ca95e7a02bb4e517b4690cad8c (diff) | |
download | poky-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')
-rw-r--r-- | bitbake/lib/bb/command.py | 9 | ||||
-rw-r--r-- | bitbake/lib/bb/cooker.py | 17 | ||||
-rw-r--r-- | bitbake/lib/bb/server/process.py | 38 |
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. |