Bug 9717

Summary: oeqa.runtime.smart.SmartBasicTest complains about missing smart module
Product: [QA/Testing] Runtime Testing Reporter: Alejandro Hernandez <alejandro.hernandez>
Component: generalAssignee: Alejandro Hernandez <alejandro.hernandez>
Status: VERIFIED FIXED QA Contact: Jose Perez C <jose.perez.carranza>
Severity: normal    
Priority: Medium+ CC: alexandru.costinx.roman, bill.randle, jose.perez.carranza, joshuagloe, leonardo.sandoval.gonzalez, mark.hatle, maxin.john, richard.purdie, ross.burton
Version: unspecified   
Target Milestone: 2.2 M1   
Hardware: x86   
OS: Multiple   
Whiteboard:
OS type for building Yocto: --- Type of Regression: ---
Verified: Documentation change: No (bug/feature does not impact docs)
Attachments:
Description Flags
Incorrect Install Log
none
Correct Install Log none

Description Alejandro Hernandez 2016-06-06 15:20:00 UTC
When executing oeqa.runtime.smart.SmartBasicTest the test fails, complaining about missing the smart python module:

| ======================================================================
| FAIL: test_smart_help (oeqa.runtime.smart.SmartBasicTest)
| ----------------------------------------------------------------------
| Traceback (most recent call last):
|   File "/home/pokybuild/yocto-autobuilder/yocto-worker/nightly-multilib/build/meta/lib/oeqa/utils/decorators.py", line 109, in wrapped_f
|     return func(*args, **kwargs)
|   File "/home/pokybuild/yocto-autobuilder/yocto-worker/nightly-multilib/build/meta/lib/oeqa/utils/decorators.py", line 97, in wrapped_f
|     return f(*args, **kwargs)
|   File "/home/pokybuild/yocto-autobuilder/yocto-worker/nightly-multilib/build/meta/lib/oeqa/runtime/smart.py", line 31, in test_smart_help
|     self.smart('--help')
|   File "/home/pokybuild/yocto-autobuilder/yocto-worker/nightly-multilib/build/meta/lib/oeqa/utils/decorators.py", line 97, in wrapped_f
|     return f(*args, **kwargs)
|   File "/home/pokybuild/yocto-autobuilder/yocto-worker/nightly-multilib/build/meta/lib/oeqa/runtime/smart.py", line 22, in smart
|     self.assertEqual(status, expected, message)
| AssertionError: 1 != 0 : smart --help
| Traceback (most recent call last):
|   File "/usr/bin/smart", line 27, in <module>
|     from smart import init, initDistro, initPlugins, initPycurl, initPsyco
| ImportError: No module named smart
Comment 2 Joshua Lock 2016-06-09 14:50:39 UTC
Is this because the tests are run with Python3 and the Smart module is python2?

https://bugzilla.yoctoproject.org/show_bug.cgi?id=9675
Comment 3 Joshua Lock 2016-06-09 15:02:46 UTC
(In reply to comment #2)
> Is this because the tests are run with Python3 and the Smart module is
> python2?

I should have read the error message more clearly, as we're calling the smart program rather than trying to make use of the modules from within the test suite it's unlikely to be python3 trying to call Python2 modules. May still be worth investigating that though?

Has anyone checked whether Smart works on the target since the switch to a Python3 userspace?
Comment 4 Jose Perez C 2016-06-09 15:10:18 UTC
This is an intermittent fail, below the details :


*Public AB :

#  -> Status -> Host   
--------------------------
814 -> PASS -> ubuntu1404
815 -> Fail -> opensuse132
816 -> PASS -> ubuntu1404
818 -> Fail -> fedora23
819 -> fail -> debian8
821 -> PASS -> debian8
822 -> PASS -> centos7
823 -> fail -> opensuse421

https://autobuilder.yoctoproject.org/main/builders/nightly-multilib 

*GDC AB :

#  -> Status -> Host   
--------------------------
02 -> PASS -> ubuntu1404
03 -> PASS -> opensuse132
Comment 5 Jose Perez C 2016-06-09 15:13:23 UTC
Tests on GDC AB were applied on commit:  2228b16bef534e337bc0f7c988b9f96dea7a3271
Comment 6 Alejandro Hernandez 2016-06-09 17:58:33 UTC
(In reply to comment #3)
> (In reply to comment #2)
> > Is this because the tests are run with Python3 and the Smart module is
> > python2?
> 
> I should have read the error message more clearly, as we're calling the
> smart program rather than trying to make use of the modules from within the
> test suite it's unlikely to be python3 trying to call Python2 modules. May
> still be worth investigating that though?
> 
> Has anyone checked whether Smart works on the target since the switch to a
> Python3 userspace?

Well I just checked manually and also ran the test, on master, smart works just fine for me on both cases.
Comment 7 Alejandro Hernandez 2016-06-09 22:23:07 UTC
I downloaded the image from the AB, and was able to reproduce it:

Just checking that smart calls python2
# head -n 2 /usr/bin/smart 
#!/usr/bin/env python

# which python
/usr/bin/python

# python
Python 2.7.11 (default, Jun  2 2016, 10:48:06) 
[GCC 6.1.1 20160511] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import smart
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named smart
Comment 8 Alejandro Hernandez 2016-06-09 22:27:41 UTC
As a matter of fact, the smart module isnt present:
root@qemux86-64:/usr/lib/python2.7# find | grep smart
root@qemux86-64:/usr/lib/python2.7# cd site-packages
-sh: cd: site-packages: No such file or directory


Whereas on a working image:
/usr/lib/python2.7/site-packages# ls
rpm  smart  smart-1.5-py2.7.egg-info
Comment 9 Alejandro Hernandez 2016-06-09 22:35:36 UTC
This is a multilib image, smart gets installed on /usr/lib64/python2.7/site-packages/smart, instead of /usr/lib/python2.7/site-packages/smart

And python isnt aware of that:

# python
Python 2.7.11 (default, Jun  2 2016, 10:48:06) 
[GCC 6.1.1 20160511] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python27.zip', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload']

If we do:

>>> sys.path.append('/usr/lib64/python2.7/site-packages')
>>> sys.path
['', '/usr/lib/python27.zip', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/lib64/python2.7', '/usr/lib64/python2.7/site-packages']
>>> import smart
>>> 


It works!

I need to check another multilib image where the test passed to see whats happening.
Comment 10 Bill Randle 2016-06-10 00:00:00 UTC
It was suggested on jabber that the build host path might be somehow polluting the installation path for the smart module. Here is the default python path for all the public autobuilders:

centos7.yp
['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib64/python2.7/site-packages/gtk-2.0', '/usr/lib/python2.7/site-packages']

debian8.yp
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/pymodules/python2.7']

fedora22.yp
['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib64/python2.7/site-packages/gtk-2.0', '/usr/lib/python2.7/site-packages']

fedora23.yp
['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages']

opensuse132.yp
['', '/usr/lib/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/local/lib64/python2.7/site-packages', '/usr/local/lib/python2.7/site-packages', '/usr/lib/python2.7/site-packages']

opensuse421.yp
['', '/usr/lib/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/local/lib64/python2.7/site-packages', '/usr/local/lib/python2.7/site-packages', '/usr/lib/python2.7/site-packages']

ubuntu1404.yp
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

ubuntu1510.yp
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

Summarizing the list of passes and failures noted earlier, along with lib paths:

build host   pass/fail   host python lib path
=============================================
opensuse421   fail       /usr/lib64/python2.7/site-packages
opensuse421   pass       /usr/lib64/python2.7/site-packages
centos7       pass       /usr/lib64/python2.7/site-packages
debian8       pass       /usr/lib/python2.7
debian8       fail       /usr/lib/python2.7
ubuntu1404    fail       /usr/lib/python2.7/site-packages
fedora23      fail       /usr/lib64/python2.7/site-packages

There does not appear to be a direct correlation between host paths and pass/fail. In fact, in some cases, the same build host generated images that failed one time and passed another time when trying to load smart.
Comment 11 Alejandro Hernandez 2016-06-10 16:17:17 UTC
This is an image where the test passed, and unsurprisingly the sys.path contains the correct path:

root@qemux86-64:~# python
Python 2.7.11 (default, Jun  3 2016, 18:24:02) 
[GCC 6.1.1 20160511] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.path
['', '/usr/lib/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages']
Comment 12 Bill Randle 2016-06-10 16:18:10 UTC
*** Bug 9754 has been marked as a duplicate of this bug. ***
Comment 13 Alejandro Hernandez 2016-06-10 20:59:21 UTC
Checking the working image vs the non-working one, I found a couple of things:

Checking the python libraries directory on both:

## WORKING IMAGE
# ls -l /usr/lib64/python2.7/
total 4120
-rw-r--r-- 1 root root 27746 Jun  3 18:24 ConfigParser.py
-rw-r--r-- 1 root root 25213 Jun  3 18:24 ConfigParser.pyc
-rw-r--r-- 1 root root 26537 Jun  3 18:24 Cookie.py
-rw-r--r-- 1 root root 22657 Jun  3 18:24 Cookie.pyc
-rw-r--r-- 1 root root  6482 Jun  3 18:24 MimeWriter.py
-rw-r--r-- 1 root root  7364 Jun  3 18:24 MimeWriter.pyc
-rw-r--r-- 1 root root  8577 Jun  3 18:24 Queue.py
-rw-r--r-- 1 root root  9424 Jun  3 18:24 Queue.pyc

...

## NON-WORKING IMAGE
# ls -l /usr/lib64/python2.7/
drwxr-xr-x    4 root     root          1024 Jun  2 11:51 site-packages


What this means is that, for one, this isn't a python-smartpm bug, it is likely a python-multilib bug, since on the non-working image smart is actually the one python package that's being installed correctly on /usr/lib64, while all the others are being installed on /usr/lib meaning that python is unaware that this is a multilib image.

Checking the python-smartpm recipe I don't see anything important at first look, although I see that this is installed using distutils, whereas lots of other packages use setuputils instead, it might be worth checking if there is a problem with setuptools on multilib images, this would not explain while this bug is intermitent though, only found on certain hosts.
Comment 14 Bill Randle 2016-06-13 19:22:46 UTC
I took a look at setuptools and distutils. Distutils has both a "purelib" and "platlib" (for platform specific libs).

The multilib patch changes the distutils install command to fixup the platform install patch, changing it from:
   $platbase/lib/python$py_version_short/site-packages'
to:
   '$platbase/'+libname+'/python$py_version_short/site-packages'

where libname is earlier set as the value returned sys.lib. On a 64-bit system with the multilib patch, sys.lib will return '${prefix}/lib64' (typically, "/usr/lib64").

Setuptools, on the other hand, has just a single installation path:
   INSTALL_SCHEMES = dict(
        posix=dict(
            install_dir='$base/lib/python$py_version_short/site-packages',
            script_dir='$base/bin',
        ),
    )

where you can see it's hard coded as (typically) under "/usr/lib".

So, that does explain why smart is installed under /usr/lib64 in some cases, but still doesn't explain why, if distutils is used for installing smart that is picks up /usr/lib for some autobuilders, but /usr/lib64 for others.
Comment 15 Alejandro Hernandez 2016-06-15 22:09:24 UTC
I was checking the images again, just wanted to comment which packages are being built incorreclty:

On the non-working image were missing on /usr/lib64:
< coreutils
< gconv
< libkmod.so.2
< libkmod.so.2.3.0
< locale
< ssl

and all these but coreutils are located on /usr/lib/ incorrectly
Comment 16 Alejandro Hernandez 2016-06-15 22:37:35 UTC
Also python2 is installed incorrectly on /usr/lib/ instead of /usr/lib64/, the folder doesexiste because python-smartpm was correctly installed on /usr/lib64.

Looking at python's sysconfigdata we can see that the working one was built for x86_64-poky and the nono-working was built for i686-pokymlib32:


Working:
 'AR': 'x86_64-poky-linux-ar',
 'CC': 'x86_64-poky-linux-gcc  -m64 -march=core2 -mtune=core2 -msse3 -mfpmath=sse '


Non-Working:
'AR': 'i686-pokymllib32-linux-ar',
'CC': 'i686-pokymllib32-linux-gcc  -m32 ',
Comment 17 Maxin B. John 2016-06-17 06:38:46 UTC
(SWAT update) This test still fails on master:
http://errors.yoctoproject.org/Errors/Details/69498/
Comment 18 Bill Randle 2016-06-17 19:53:57 UTC
More information. I think I finally figured out what is going on.

The multilib build set actually builds several images in a row:
  machine: qemux86_64; multilib: True; image: lib32-core-image-minimal
  machine: qemux86_64; multilib: True; packages: ipk; image: lib32-core-image-minimal
  machine: qemux86_64; multilib: lib32; image: core-image-sato
  machine: qemux86_64; multilib: lib32; packages: ipk; image: core-image-sato
  machine: qemux86; multilib: lib64; image: lib64-core-image-sato

Build config #3 is the that is failing.

Looking at the log for creating the rootfs, we see:
  DEBUG: Executing python function do_rootfs
  NOTE: configuring RPM platform settings
  NOTE: configuring RPM system provides
  NOTE: configuring RPM DB settings
  NOTE: configuring Smart settings
  NOTE: Adding Smart channel lib32_qemux86_64 (45)
  NOTE: Adding Smart channel lib32_x86 (40)
  NOTE: Adding Smart channel all (35)
  NOTE: Adding Smart channel qemux86_64 (30)
  NOTE: Adding Smart channel core2_64 (25)
  NOTE: adding Smart RPM DB channel

Also consider that after the first build, there are rpm packages for python2.7 in build/tmp/deploy/rpm/lib32_x86 and after the third build, there are rpm packages for python in build/tmp/deploy/rpm/core2_64. Notice that the package manager appears to be looking in both locations to find packages to install in the rootfs. I do not know how it decides which ones to use when there are multiple options, but in the fail case, it is using the packages in lib32_x86 when it should be using the ones in core2_64.

On a build that had failed, I forced a rebuild of python and core-image-sato:
  $ bitbake -C install python
  $ bitbake core-image-minimal

This time, after the rebuild, the packages in core2_64 were used to create the rootfs.
Comment 19 Alejandro Hernandez 2016-06-17 23:52:08 UTC
I am checking for the same thing, I wasnt able to reproduce it just using the failing config since the beginning (since apparently it uses the right packages), I am at thi very moment building the same configs in order to see if rootfs gets populated incorreclty that way.
Comment 20 Alejandro Hernandez 2016-06-20 01:17:43 UTC
After using the buildset configs in order, I still wasn't able to reproduce it manually.
Comment 21 Bill Randle 2016-06-20 04:08:27 UTC
Hmmm... I still think it's a smartpm issue, since it is fed both 32-bit and 64-bit channels. A brief look at the smartpm documentation says it uses the "newest" package when there are multiple to chose from - which may or may not be the one we want it to use. I did notice you can assign priorities to different channels, so the 64-bit channel could potentially be given higher priority for the core-image-sato build.

In the morning, I'm going to look at the rootfs generation class and see if there's anyway to pass different parameters to smartpm, based on the image name and multilib setting.
Comment 22 Bill Randle 2016-06-20 23:32:43 UTC
Additional information: subsequent test builds (which used SSTATE) did not fail and created images with python in /usr/lib64, as it should be. Did a "very clean" build with build/tmp deleted and SSTATE_DIR commented out so everything would get built and packaged from scratch. In this case, the qemux86_64 rootfs image has the python libraries installed in /usr/lib and are 32-bit libraries. (Verified by inspecting the core-image-minimal rootfs .tar.gz file.)

Both lib32_x86 and core2_64 rpm packages were built and are present in deploy/rpm/core2_64 and deploy/rpm/lib32_x86. (In the AB config, lib32-core-image-minimal is built first, followed by core-image-sato - which should be a mostly 64-bit image.)

Verified the python rpms in lib32_x86 are using /usr/lib and the ones in core2_64 are using /usr/lib64.

It still seems like a package manager issue to me in deciding which rpm packages to use to build the rootfs.
Comment 23 Alejandro Hernandez 2016-06-21 06:33:05 UTC
Digging a little bit more, I've got 2 lists of packages to be installed, the Non-mulitib and the multilib ones, they're very long but I just wanted to state that python (which is an example of what is incorrectly installed) is on the Non-mulitilib packages list, which means that at least bitbake knows what its doing, and it should install the correct one, so the problem comes when smart is called and it chooses poorly:

Multilib pkgs: lib32-libgdk-pixbuf-2.0-loader-png lib32-pango-module-basic-fc lib32-connman-gnome lib32-libgdk-pixbuf-2.0-loader-jpeg lib32-connman lib32-hicolor-icon-theme lib32-dbus-glib lib32-glib-2.0 lib32-gtk+3 lib32-glibc ...

non-Multilib pkgs: locale-base-en-us locale-base-en-gb libgdk-pixbuf-2.0-loader-png packagegroup-base-extended pango-module-basic-fc packagegroup-core-x11-sato-games rpm psplash packagegroup-core-ssh-dropbear packagegroup-core-x11-base smartpm ... python-smartpm python-core python-smartpm-backend-rpm python-codecs python-textutils python-xml python-fcntl python-pickle python-crypt python-compression python-shell python-resource python-netclient python-threading ...
Comment 24 Alejandro Hernandez 2016-06-21 07:00:29 UTC
Ok so to debug what smart is doing I added "--explain" to the smart install command on package_manager.py (which I think should probably be enabled by default btw, it doesn't hurt anyone having more info in the log, although they're quite long), and as a result I can see which packages are being installed and where they're coming from:

After a bitbake core-image-sato -c cleansstate I get:

$ bibtake core-image-sato -c rootfs:

python-core-2.7.11-r1.0@lib32_x86 [lib32_x86]
    Requires:
      libc6-2.24-r0.0@lib32_x86 (installed)
      python-lang-2.7.11-r1.0@lib32_x86 (installed)
      libpython2.7-1.0-2.7.11-r1.0@lib32_x86 (installed)
      libpython2.7-1.0-2.7.11-r1.0@core2_64 (installed)
      libz1-1.2.8-r0.0@core2_64 (installed)
      coreutils-8.25-r0.0@lib32_x86 (installed)
      libc6-2.24-r0.0@core2_64 (installed)
      python-re-2.7.11-r1.0@lib32_x86 (installed)
      busybox-1.24.1-r0.0@lib32_x86 (installed)

Now that's obviously wrong, interestignly, if I do a (a couple of times actually, it didn't work on the first try):

$ bibtake core-image-sato -c rootfs --force 

python-core-2.7.11-r1.0@core2_64 [core2_64]
    Requires:
      libc6-2.24-r0.0@lib32_x86 (installed)
      python-lang-2.7.11-r1.0@core2_64 (installed)
      libpython2.7-1.0-2.7.11-r1.0@core2_64 (installed)
      python-re-2.7.11-r1.0@core2_64 (installed)
      libz1-1.2.8-r0.0@core2_64 (installed)
      coreutils-8.25-r0.0@core2_64 (installed)
      libc6-2.24-r0.0@core2_64 (installed)
      libz1-1.2.8-r0.0@lib32_x86 (installed)
      busybox-1.24.1-r0.0@core2_64 (installed)


Which is correct, so just wanted say that its not reproducible every time, it does however seems to be reproducible after a cleansstate

I'm attaching the (long) longs here, so we can see how they differ, its a litte difficult since most things are not in the same order though.
Comment 25 Alejandro Hernandez 2016-06-21 07:01:07 UTC
Created attachment 3240 [details]
Incorrect Install Log
Comment 26 Alejandro Hernandez 2016-06-21 07:01:58 UTC
Created attachment 3241 [details]
Correct Install Log
Comment 27 Alejandro Hernandez 2016-06-21 07:12:47 UTC
Found something interesting on the logs:

When adding the channels to smart we've got:

NOTE: Adding Smart channel qemux86_64 (45)
NOTE: Adding Smart channel core2_64 (40)
NOTE: Adding Smart channel all (35)
NOTE: Adding Smart channel lib32_qemux86_64 (30)
NOTE: Adding Smart channel lib32_x86 (25)

vs

NOTE: Adding Smart channel lib32_qemux86_64 (45)
NOTE: Adding Smart channel lib32_x86 (40)
NOTE: Adding Smart channel all (35)
NOTE: Adding Smart channel qemux86_64 (30)
NOTE: Adding Smart channel core2_64 (25)

Where for example in the last one core2_64 is the architecture and the (25) is the priority of it.

Also as we can see the priorities are not the same on both cases, hence why smart prefers to install python-core@core2_64 (correctly) in the first case and python-core@lib32_x86 (incorrectly) on the second case.

In the code, we substract (5) to the channel priority everytime we add another channel, so its all about the order in which they are added.
Comment 28 Mark Hatle 2016-06-21 12:56:56 UTC
Priorities for the channel feeds weigh on the results when generating the filesystem.

If two things are considered equivalent then the priority of the feed affects which is chosen.  In a 'standard' multilib build, the result SHOULD be:

NOTE: Adding Smart channel qemux86_64 (45)
NOTE: Adding Smart channel core2_64 (40)
NOTE: Adding Smart channel all (35)
NOTE: Adding Smart channel lib32_qemux86_64 (30)
NOTE: Adding Smart channel lib32_x86 (25)

The machine has highest priority, then the native system lib, then all, THEN the multilibs.

The other listed in the previous comment will end up switching the system to a 32-bit default.  You should verify that this is not intentional in some way.

I thought at one point we had implemented that if you did something like

bitbake lib32-core-image-base  the system would end up switching the multilib order during install to make 32-bit the primary for installation.
Comment 29 Richard Purdie 2016-06-22 06:19:33 UTC
The code was using unordered objects (dict, set) for ordered data. I've applied a patch which deals with one case of this which was causing the ordering issue Alejandro observed. Looking at the code there are other places with the issue. The "corrected" ordering isn't as Mark describes exactly but I'm not sure that matters. We need to fix some other places in this code which suffer from ordering problems too (e.g. the use of set() ).
Comment 30 Bill Randle 2016-06-22 16:47:56 UTC
I've done an audit on package_manager.py and I believe the only issues of concern regarding sets and dicts are in RpmPM:insert_feeds_uris(), with the arch_list, default_platform_extra and platform_extra variables.

An OrderedDict can be used for arch_list, but the others make use of set() features not part of OrderedDict(), specifically, the union operation. We could either pull in an existing OrderSet module (there are a couple of them available), or rewrite the code block to locally perform a union type operation on an OrderedDict and use OrderedDicts for those two variables.
Comment 31 Leonardo Sandoval Gonzalez 2016-06-22 16:57:44 UTC
(In reply to comment #30)
> I've done an audit on package_manager.py and I believe the only issues of
> concern regarding sets and dicts are in RpmPM:insert_feeds_uris(), with the
> arch_list, default_platform_extra and platform_extra variables.
> 
> An OrderedDict can be used for arch_list, but the others make use of set()
> features not part of OrderedDict(), specifically, the union operation. We
> could either pull in an existing OrderSet module (there are a couple of them
> available), or rewrite the code block to locally perform a union type
> operation on an OrderedDict and use OrderedDicts for those two variables.

Perhaps list comprehension operations can do the union task using the current data structure, avoiding the OrderedDict/OrderSet usage.
Comment 32 Richard Purdie 2016-06-23 14:36:19 UTC
*** Bug 9794 has been marked as a duplicate of this bug. ***
Comment 33 Ross Burton 2016-06-23 14:42:26 UTC
Fixed in oe-core 61a33582dfc964d612d20d34734a787d873e312c
Comment 34 Ross Burton 2016-06-23 14:43:19 UTC
*** Bug 9797 has been marked as a duplicate of this bug. ***
Comment 35 Bill Randle 2016-06-25 04:30:01 UTC
Replaced the set add and union operations in RpmPM:insert_feeds_uris() with list and basic list operations, copying the existing code in create_configs(). This keeps the items in order, which is important because it is used later to set Smart channel priorities.

Patch sent to mailing list.
Comment 36 Jose Perez C 2016-07-01 15:23:36 UTC
Verified : issue not present in the latest steps of AB

Jun 30 16:42	1159826bb9ca...	success	#851	Build successful
Jun 28 22:50	7e9297e5722d...	success	#850	Build successful
Jun 28 16:35	39732501e105...	success	#849	Build successful
Jun 28 10:50	786d894b6b50...	success	#848	Build successful
Jun 27 22:28	594b869946ac...	success	#847	Build successful
Jun 27 15:44	684e0de230ee...	success	#846	Build successful
Jun 22 11:18	65312e5b2771...	success	#845	Build successful

https://autobuilder.yoctoproject.org/main/builders/nightly-multilib