[OE-core] [PATCH] python-smartpm: Add an attempt install mode
Mark Hatle
mark.hatle at windriver.com
Wed Sep 11 02:04:29 UTC 2013
Time measurements with:
MACHINE = "qemux86"
PACKAGE_CLASSES = "package_rpm"
EXTRA_IMAGE_FEATURES = "dev-pkgs staticdev-pkgs doc-pkgs dbg-pkgs ptest-pkgs"
BB_NUMBER_THREADS ?= "8"
PARALLEL_MAKE ?= "-j 8"
image: core-image-sato
Quad Core i7 workstation...
With all of the recipes built, and just executing the do_rootfs:
Before this change:
real 26m2.541s
user 21m8.458s
sys 7m9.683s
After this change:
real 14m43.436s
user 15m57.525s
sys 5m16.412s
This is a significant performance boost when using the 'complementary' installs
and attemptonly installs. The performance is by doing the complementary
installs as a batch instead of one at a time, ignoring failures.
--Mark
On 9/10/13 8:59 PM, Mark Hatle wrote:
> [ YOCTO #3723 ]
>
> Add a mode to smart that will allow an installation to continue, instead of
> failure in the case that one or more items is uninstallable.
>
> Uninstallable packages are simply ignored, and no error is generated.
>
> Signed-off-by: Mark Hatle <mark.hatle at windriver.com>
> ---
> meta/classes/package_rpm.bbclass | 7 +--
> .../python/python-smartpm/smart-attempt.patch | 59 ++++++++++++++++++++++
> .../python/python-smartpm_1.4.1.bb | 1 +
> 3 files changed, 62 insertions(+), 5 deletions(-)
> create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-attempt.patch
>
> diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
> index 8ab42c4..699d0f2 100644
> --- a/meta/classes/package_rpm.bbclass
> +++ b/meta/classes/package_rpm.bbclass
> @@ -472,11 +472,8 @@ EOF
> echo "Attempting $pkgs_to_install"
> echo "Note: see `dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}"
> translate_oe_to_smart ${sdk_mode} --attemptonly $package_attemptonly
> - for each_pkg in $pkgs_to_install ; do
> - # We need to try each package individually as a single dependency failure
> - # will break the whole set otherwise.
> - smart --data-dir=${target_rootfs}/var/lib/smart install -y $each_pkg >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}" 2>&1 || true
> - done
> + echo "Attempting $pkgs_to_install" >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}"
> + smart --data-dir=${target_rootfs}/var/lib/smart install --attempt -y ${pkgs_to_install} >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}" 2>&1
> fi
> }
>
> diff --git a/meta/recipes-devtools/python/python-smartpm/smart-attempt.patch b/meta/recipes-devtools/python/python-smartpm/smart-attempt.patch
> new file mode 100644
> index 0000000..0d603d3
> --- /dev/null
> +++ b/meta/recipes-devtools/python/python-smartpm/smart-attempt.patch
> @@ -0,0 +1,59 @@
> +Add a mechanism to attempt the install operation, w/o failing.
> +
> +For complementary and 'attemptonly' packages, we need a way to instruct smart to
> +try to install, but ignore any failures.
> +
> +This option only works for the install operation.
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: Mark Hatle <mark.hatle at windriver.com>
> +
> +Index: smart-1.4.1/smart/commands/install.py
> +===================================================================
> +--- smart-1.4.1.orig/smart/commands/install.py
> ++++ smart-1.4.1/smart/commands/install.py
> +@@ -50,6 +50,8 @@ def option_parser():
> + parser = OptionParser(usage=USAGE,
> + description=DESCRIPTION,
> + examples=EXAMPLES)
> ++ parser.add_option("--attempt", action="store_true",
> ++ help=_("attempt to install packages, ignore failures"))
> + parser.add_option("--stepped", action="store_true",
> + help=_("split operation in steps"))
> + parser.add_option("--urls", action="store_true",
> +@@ -80,6 +82,9 @@ def main(ctrl, opts):
> + if not opts.args:
> + raise Error, _("no package(s) given")
> +
> ++ if opts.attempt:
> ++ sysconf.set("attempt-install", True, soft=True)
> ++
> + if opts.explain:
> + sysconf.set("explain-changesets", True, soft=True)
> +
> +Index: smart-1.4.1/smart/transaction.py
> +===================================================================
> +--- smart-1.4.1.orig/smart/transaction.py
> ++++ smart-1.4.1/smart/transaction.py
> +@@ -1216,9 +1216,17 @@ class Transaction(object):
> + else:
> + op = REMOVE
> + if op is INSTALL or op is REINSTALL:
> +- self._install(pkg, changeset, locked, pending)
> +- if pkg in changeset:
> +- changeset.setRequested(pkg, True)
> ++ try:
> ++ self._install(pkg, changeset, locked, pending)
> ++ if pkg in changeset:
> ++ changeset.setRequested(pkg, True)
> ++ except Failed, e:
> ++ if sysconf.has("attempt-install", soft=True):
> ++ if pkg in changeset:
> ++ del changeset[pkg]
> ++ continue
> ++ else:
> ++ raise Failed, e
> + elif op is REMOVE:
> + self._remove(pkg, changeset, locked, pending)
> + elif op is UPGRADE:
> diff --git a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
> index 5d673b9..f406d69 100644
> --- a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
> +++ b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
> @@ -30,6 +30,7 @@ SRC_URI = "\
> file://smart-flag-ignore-recommends.patch \
> file://smart-flag-exclude-packages.patch \
> file://smart-config-ignore-all-recommends.patch \
> + file://smart-attempt.patch \
> "
>
> SRC_URI[md5sum] = "573ef32ba177a6b3c4bf7ef04873fcb6"
>
More information about the Openembedded-core
mailing list