From: "'MOESSBAUER, Felix' via isar-users" <isar-users@googlegroups.com>
To: "isar-users@googlegroups.com" <isar-users@googlegroups.com>
Cc: "Kiszka, Jan" <jan.kiszka@siemens.com>
Subject: Re: [PATCH 1/1] testsuite: speedup execution by limiting mc parsing to selected targets
Date: Fri, 17 Jul 2026 15:49:49 +0000 [thread overview]
Message-ID: <92e2fd972464b9b9fd9ce7d6b4acfd7f86bf5cec.camel@siemens.com> (raw)
In-Reply-To: <20260717150012.1670718-1-felix.moessbauer@siemens.com>
On Fri, 2026-07-17 at 17:00 +0200, Felix Moessbauer wrote:
> The global isar mc.conf has over 70 multiconfig targets defined. This
> makes initial parsing super slow, leading to parse times of 5-10 minutes
> on testsuite tasks (per avocado task execution). To speed this up, We now
> set the BBMULTICONFIG bitbake variable to exactly the targets we want to
> test. This reduces the parsing time of tests to ~10s per test.
>
> When running with sstate cache, this massively speeds up repeated runs,
> as the parse time was the biggest single contributor.
Do not merge yet.
While the results are quite impressive, this seems to expose further
hidden dependencies between the build and run_vm parts. I'm currently
looking into it.
PS:
On a repeated build, these runtimes can be achieved (the error is also
visible):
./scripts/run-tests.sh -t dev -p rootless=1 -p sstate=1
+ avocado run --max-parallel-tasks=1 --disable-sysinfo -t dev -p
rootless=1 -p sstate=1 testsuite/citest.py
JOB ID : 5f51d20d167dcaf5fccd414d273c5680bc018f08
JOB LOG : /work/build/testsuite/job-results/job-2026-07-17T17.43-
5f51d20/job.log
(1/6) testsuite/citest.py:DevTest.test_dev: STARTED
(1/6) testsuite/citest.py:DevTest.test_dev: PASS (38.71 s)
(2/6) testsuite/citest.py:DevTest.test_dev_apps: STARTED
(2/6) testsuite/citest.py:DevTest.test_dev_apps: PASS (35.92 s)
(3/6) testsuite/citest.py:DevTest.test_dev_rebuild: STARTED
(3/6) testsuite/citest.py:DevTest.test_dev_rebuild: PASS (36.69 s)
(4/6) testsuite/citest.py:DevTest.test_dev_run_amd64_bookworm: STARTED
(4/6) testsuite/citest.py:DevTest.test_dev_run_amd64_bookworm: PASS
(30.71 s)
(5/6) testsuite/citest.py:DevTest.test_dev_run_arm64_bookworm: STARTED
(5/6) testsuite/citest.py:DevTest.test_dev_run_arm64_bookworm: ERROR:
Traceback (most recent call last):\n File
"/isar/bitbake/lib/bb/command.py", line 90, in runCommand\n result =
command_method(self, commandline)\n File
"/isar/bitbake/lib/bb/command.py", line 470, in findBestProvider\n
return command.cooker.findBestPr... (0.52 s)
(6/6) testsuite/citest.py:DevTest.test_dev_run_arm_bookworm: STARTED
(6/6) testsuite/citest.py:DevTest.test_dev_run_arm_bookworm: ERROR:
Traceback (most recent call last):\n File
"/isar/bitbake/lib/bb/command.py", line 90, in runCommand\n result =
command_method(self, commandline)\n File
"/isar/bitbake/lib/bb/command.py", line 470, in findBestProvider\n
return command.cooker.findBestPr... (0.54 s)
RESULTS : PASS 4 | ERROR 2 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
| CANCEL 0
JOB TIME : 146.54 s
Test summary:
5-testsuite/citest.py:DevTest.test_dev_run_arm64_bookworm: ERROR
6-testsuite/citest.py:DevTest.test_dev_run_arm_bookworm: ERROR
Felix
>
> Signed-off-by: Felix Moessbauer <felix.moessbauer@siemens.com>
> ---
> testsuite/cibase.py | 20 +++++++++++---------
> testsuite/cibuilder.py | 17 +++++++++++++++++
> testsuite/repro-build-test.py | 1 +
> 3 files changed, 29 insertions(+), 9 deletions(-)
>
> diff --git a/testsuite/cibase.py b/testsuite/cibase.py
> index 4a6308d0..52748004 100755
> --- a/testsuite/cibase.py
> +++ b/testsuite/cibase.py
> @@ -15,7 +15,7 @@ from avocado.utils import process
>
> class CIBaseTest(CIBuilder):
> def perform_build_test(self, targets, should_fail=False, **kwargs):
> - self.configure(**kwargs)
> + self.configure(targets=targets, **kwargs)
>
> if bool(int(self.params.get('depgraph', default=0))):
> self.generate_dependency_graph(targets, reconfigure=False, **kwargs)
> @@ -31,7 +31,7 @@ class CIBaseTest(CIBuilder):
> **kwargs):
> """Debug helper to better understand test task graphs."""
> if reconfigure:
> - self.configure(**kwargs)
> + self.configure(targets=targets, **kwargs)
>
> self.log.info("Generating dependency graph...")
>
> @@ -41,7 +41,7 @@ class CIBaseTest(CIBuilder):
> self.move_in_build_dir('pn-buildlist', f"pn-buildlist-{self.name}")
>
> def perform_wic_partition_test(self, targets, wic_deploy_parts, **kwargs):
> - self.configure(wic_deploy_parts=wic_deploy_parts, **kwargs)
> + self.configure(targets=targets, wic_deploy_parts=wic_deploy_parts, **kwargs)
> self.bitbake(targets, **kwargs)
>
> wic_path = f"{self.build_dir}/tmp/deploy/images/*/*.wic.p1"
> @@ -57,6 +57,7 @@ class CIBaseTest(CIBuilder):
> gpg_priv_key = os.path.join(keys_dir, 'test_priv.key')
>
> self.configure(
> + targets=targets,
> gpg_pub_key=gpg_pub_key if signed else None,
> sstate_dir='',
> **kwargs,
> @@ -76,6 +77,7 @@ class CIBaseTest(CIBuilder):
> repro_type = 'signed' if signed else 'unsigned'
> self.move_in_build_dir('tmp', f"tmp_middle_repro_{repro_type}")
> self.configure(
> + targets=targets,
> gpg_pub_key=gpg_pub_key if signed else None,
> offline=True,
> sstate_dir='',
> @@ -89,7 +91,7 @@ class CIBaseTest(CIBuilder):
>
> if not signed:
> # Try to build with changed configuration with no cleanup
> - self.configure(**kwargs)
> + self.configure(targets=targets, **kwargs)
> self.bitbake(targets, **kwargs)
>
> finally:
> @@ -109,7 +111,7 @@ class CIBaseTest(CIBuilder):
> count += int(content[field])
> return count
>
> - self.configure(ccache=True, sstate_dir='', **kwargs)
> + self.configure(targets=targets, ccache=True, sstate_dir='', **kwargs)
>
> # Field that stores direct ccache hits
> direct_cache_hit = 22
> @@ -173,7 +175,7 @@ class CIBaseTest(CIBuilder):
> process.run(f"git --work-tree={isar_sstate} checkout HEAD -- .")
>
> self.init('../build-sstate', isar_dir=isar_sstate)
> - self.configure(sstate=True, sstate_dir='', **kwargs)
> + self.configure(targets=image_target, sstate=True, sstate_dir='', **kwargs)
>
> # Cleanup sstate and tmp before test
> self.delete_from_build_dir('sstate-cache')
> @@ -196,7 +198,7 @@ class CIBaseTest(CIBuilder):
> """
> Generate signature data for target(s) and check for cacheability issues
> """
> - self.configure(**kwargs)
> + self.configure(targets=targets, **kwargs)
> self.delete_from_build_dir('tmp_before_sstate')
> self.move_in_build_dir('tmp', 'tmp_before_sstate')
> self.bitbake(targets, sig_handler='none')
> @@ -246,7 +248,7 @@ class CIBaseTest(CIBuilder):
> return False
> return True
>
> - self.configure(sstate=True, sstate_dir='', **kwargs)
> + self.configure(targets=[image_target, package_target], sstate=True, sstate_dir='', **kwargs)
>
> deploy_dir = f"{self.build_dir}/tmp/deploy"
>
> @@ -380,7 +382,7 @@ class CIBaseTest(CIBuilder):
> sfiles[target][fname] = CIUtils.get_tar_content(fname)
> return sfiles
>
> - self.configure(**kwargs)
> + self.configure(targets=targets, **kwargs)
>
> tmp_layer_dir = self.create_tmp_layer()
> try:
> diff --git a/testsuite/cibuilder.py b/testsuite/cibuilder.py
> index d42e8631..1d415084 100755
> --- a/testsuite/cibuilder.py
> +++ b/testsuite/cibuilder.py
> @@ -104,8 +104,21 @@ class CIBuilder(Test):
> if not hasattr(self, 'build_dir'):
> self.error("Broken test implementation: need to call init().")
>
> + @staticmethod
> + def _extract_multiconfigs(targets):
> + if isinstance(targets, str):
> + targets = [targets]
> + mc_names = set()
> + for target in targets:
> + if target.startswith('mc:'):
> + parts = target.split(':')
> + if len(parts) >= 2:
> + mc_names.add(parts[1])
> + return mc_names
> +
> def configure(
> self,
> + targets=None,
> compat_arch=True,
> cross=True,
> debsrc_cache=False,
> @@ -196,6 +209,10 @@ class CIBuilder(Test):
>
> # write ci_build.conf
> with open(self.build_dir + '/conf/ci_build.conf', 'w') as f:
> + if targets:
> + mc_names = self._extract_multiconfigs(targets)
> + if mc_names:
> + f.write('BBMULTICONFIG = "%s"\n\n' % ' '.join(sorted(mc_names)))
> if compat_arch:
> f.write(
> 'ISAR_ENABLE_COMPAT_ARCH:amd64 = "1"\n'
> diff --git a/testsuite/repro-build-test.py b/testsuite/repro-build-test.py
> index c06269f5..c1b51aff 100755
> --- a/testsuite/repro-build-test.py
> +++ b/testsuite/repro-build-test.py
> @@ -50,6 +50,7 @@ class ReproBuild(CIBuilder):
> # Build
> self.log.info("Started Build " + image_name)
> self.configure(
> + targets=target,
> source_date_epoch=source_date_epoch, use_apt_snapshot=True
> )
> self.bitbake(target)
> --
> 2.53.0
--
You received this message because you are subscribed to the Google Groups "isar-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to isar-users+unsubscribe@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/isar-users/92e2fd972464b9b9fd9ce7d6b4acfd7f86bf5cec.camel%40siemens.com.
prev parent reply other threads:[~2026-07-17 15:50 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-17 15:00 'Felix Moessbauer' via isar-users
2026-07-17 15:49 ` 'MOESSBAUER, Felix' via isar-users [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=92e2fd972464b9b9fd9ce7d6b4acfd7f86bf5cec.camel@siemens.com \
--to=isar-users@googlegroups.com \
--cc=felix.moessbauer@siemens.com \
--cc=jan.kiszka@siemens.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox