diff mbox series

[RFC] data: Evaluate the value of export/unexport/network flags

Message ID 20221127214934.541723-1-richard.purdie@linuxfoundation.org
State Accepted, archived
Commit 3d96c07f9fd4ba1a84826811d14bb4e98ad58846
Headers show
Series [RFC] data: Evaluate the value of export/unexport/network flags | expand

Commit Message

Richard Purdie Nov. 27, 2022, 9:49 p.m. UTC
Currently the export/unexport/network flags are acted on only by presence
or lack of in the data store. This is deliberate due to performance reasons
since a given recipe shell task might export ~80-90 variables and this means
expanding flags for every one of them.

This does catch users unaware since values which expand to nothing don't work
e.g. ${@""} and setting values to "0" wouldn't work either.

The downside to this patch is slow down in parsing speed of around 4%.

The network flag is easier to change and doesn't affect performance, it was
made to operate the same as export/unexport for consitency reasons.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bin/bitbake-worker |  2 +-
 lib/bb/data.py     | 10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

I'm torn on this patch due to the parsing speed slow down. I'm putting the 
patch out there for discussion.

Comments

Martin Jansa Feb. 15, 2023, 10:46 a.m. UTC | #1
On Sun, Nov 27, 2022 at 10:49 PM Richard Purdie <
richard.purdie@linuxfoundation.org> wrote:

> Currently the export/unexport/network flags are acted on only by presence
> or lack of in the data store. This is deliberate due to performance reasons
> since a given recipe shell task might export ~80-90 variables and this
> means
> expanding flags for every one of them.
>
> This does catch users unaware since values which expand to nothing don't
> work
> e.g. ${@""} and setting values to "0" wouldn't work either.
>
> The downside to this patch is slow down in parsing speed of around 4%.
>
> The network flag is easier to change and doesn't affect performance, it was
> made to operate the same as export/unexport for consitency reasons.
>

You already know my opinion, but for others on ML I'm in favor of this
change.

Parsing time is negligible compared to do_compile times in most of my
builds.

Expanding this will allow to resolve e.g. icecc.bbclass to respect
ICECC_DISABLED before enabling network in all tasks:
https://lists.openembedded.org/g/openembedded-core/message/167731
I already have such change for icecc.bbclass and will send it when/if this
bitbake change is merged.

Thanks
Cheers,
Richard Purdie Feb. 15, 2023, 9:36 p.m. UTC | #2
On Wed, 2023-02-15 at 11:46 +0100, Martin Jansa wrote:
> On Sun, Nov 27, 2022 at 10:49 PM Richard Purdie
> <richard.purdie@linuxfoundation.org> wrote:
> > Currently the export/unexport/network flags are acted on only by
> > presence
> > or lack of in the data store. This is deliberate due to performance
> > reasons
> > since a given recipe shell task might export ~80-90 variables and
> > this means
> > expanding flags for every one of them.
> > 
> > This does catch users unaware since values which expand to nothing
> > don't work
> > e.g. ${@""} and setting values to "0" wouldn't work either.
> > 
> > The downside to this patch is slow down in parsing speed of around
> > 4%.
> > 
> > The network flag is easier to change and doesn't affect
> > performance, it was
> > made to operate the same as export/unexport for consitency reasons.
> 
> You already know my opinion, but for others on ML I'm in favor of
> this change.
> 
> Parsing time is negligible compared to do_compile times in most of my
> builds.

Comparing parsing time to do_compile isn't appropriate, they're very
different things. If doing more interactive development, parsing time
can hurt a lot and is one of the bigger complaints I hear about
bitbake, particualrly with larger numbers of layers.

> Expanding this will allow to resolve e.g. icecc.bbclass to respect
> ICECC_DISABLED before enabling network in all tasks:
> https://lists.openembedded.org/g/openembedded-core/message/167731
> I already have such change for icecc.bbclass and will send it when/if
> this bitbake change is merged.

I personally remain torn.

The TSC discussed it and is overall in favour of it so I'll fix this
patch, test and merge.

I'm running out of ideas to speed bitbake up but I'll probably just
have to stop caring.

Cheers,

Richard
Paulo Neves Feb. 16, 2023, 10:03 a.m. UTC | #3
Parsing time is very different than do_compile. Almost all operations on
bitbake require parsing but I would argue very few run do_compile in
comparison.

I have reservations regarding any parse time degradation, as in my
experience parse time is one of the biggest complaints by users. A
compilation is seen as useful work while parsing, sadly, is not.

Paulo Neves

On 2/15/23 11:46, Martin Jansa wrote:
>
> Parsing time is negligible compared to do_compile times in most of my
> builds.
diff mbox series

Patch

diff --git a/bin/bitbake-worker b/bin/bitbake-worker
index 3799b170cb..5a89e7c9b8 100755
--- a/bin/bitbake-worker
+++ b/bin/bitbake-worker
@@ -270,7 +270,7 @@  def fork_off_task(cfg, data, databuilder, workerdata, extraconfigdata, runtask):
 
                 bb.utils.set_process_name("%s:%s" % (the_data.getVar("PN"), taskname.replace("do_", "")))
 
-                if not the_data.getVarFlag(taskname, 'network', False):
+                if not bb.utils.to_boolean(the_data.getVarFlag(taskname, 'network')):
                     if bb.utils.is_local_uid(uid):
                         logger.debug("Attempting to disable network for %s" % taskname)
                         bb.utils.disable_network(uid, gid)
diff --git a/lib/bb/data.py b/lib/bb/data.py
index ab1a5959ba..5299315050 100644
--- a/lib/bb/data.py
+++ b/lib/bb/data.py
@@ -114,8 +114,8 @@  def emit_var(var, o=sys.__stdout__, d = init(), all=False):
     if d.getVarFlag(var, 'python', False) and func:
         return False
 
-    export = d.getVarFlag(var, "export", False)
-    unexport = d.getVarFlag(var, "unexport", False)
+    export = bb.utils.to_boolean(d.getVarFlag(var, "export"))
+    unexport = bb.utils.to_boolean(d.getVarFlag(var, "unexport"))
     if not all and not export and not unexport and not func:
         return False
 
@@ -188,8 +188,8 @@  def emit_env(o=sys.__stdout__, d = init(), all=False):
 
 def exported_keys(d):
     return (key for key in d.keys() if not key.startswith('__') and
-                                      d.getVarFlag(key, 'export', False) and
-                                      not d.getVarFlag(key, 'unexport', False))
+                                      bb.utils.to_boolean(d.getVarFlag(key, 'export', False)) and
+                                      not bb.utils.to_boolean(d.getVarFlag(key, 'unexport', False)))
 
 def exported_vars(d):
     k = list(exported_keys(d))
@@ -374,7 +374,7 @@  def generate_dependencies(d, ignored_vars):
 
     mod_funcs = set(bb.codeparser.modulecode_deps.keys())
     keys = set(key for key in d if not key.startswith("__")) | mod_funcs
-    shelldeps = set(key for key in d.getVar("__exportlist", False) if d.getVarFlag(key, "export", False) and not d.getVarFlag(key, "unexport", False))
+    shelldeps = set(key for key in d.getVar("__exportlist", False) if bb.utils.to_boolean(d.getVarFlag(key, "export")) and not bb.utils.to_boolean(d.getVarFlag(key, "unexport")))
     varflagsexcl = d.getVar('BB_SIGNATURE_EXCLUDE_FLAGS')
 
     deps = {}