[OE-core] [PATCH 1/4] sstate: Add extra directory level

akuster808 akuster808 at gmail.com
Mon Jan 6 00:41:41 UTC 2020



On 1/5/20 4:06 PM, Richard Purdie wrote:
> We're having speed issues on the autobuilder due to the numbers of files in sstate
> directories. We previously split these by the first two characters of the hash.
> This change extends this to split by the next two characters as well, creating
> more layers of directories.
>
> This should signifiantly speed up eSDK builds on the autobuilder as the current
> sstate layout simply isn't scaling there but addresses a general complaint.
>
> gen-lockedsig-cache needed to be updated for the new split level sstateI.

I assume zeus worthy?

> Also update tests for new layout.
>
> Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
> ---
>  meta/classes/sstate.bbclass             |  4 ++--
>  meta/lib/oeqa/selftest/cases/signing.py |  4 ++--
>  meta/lib/oeqa/selftest/cases/sstate.py  |  4 ++--
>  scripts/gen-lockedsig-cache             | 13 ++++++++++---
>  4 files changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
> index c0329cd5d18..7d2cb9eb840 100644
> --- a/meta/classes/sstate.bbclass
> +++ b/meta/classes/sstate.bbclass
> @@ -6,7 +6,7 @@ SSTATE_MANFILEPREFIX = "${SSTATE_MANIFESTS}/manifest-${SSTATE_MANMACH}-${PN}"
>  def generate_sstatefn(spec, hash, d):
>      if not hash:
>          hash = "INVALID"
> -    return hash[:2] + "/" + spec + hash
> +    return hash[:2] + "/" + hash[2:4] + "/" + spec + hash
>  
>  SSTATE_PKGARCH    = "${PACKAGE_ARCH}"
>  SSTATE_PKGSPEC    = "sstate:${PN}:${PACKAGE_ARCH}${TARGET_VENDOR}-${TARGET_OS}:${PV}:${PR}:${SSTATE_PKGARCH}:${SSTATE_VERSION}:"
> @@ -15,7 +15,7 @@ SSTATE_PKGNAME    = "${SSTATE_EXTRAPATH}${@generate_sstatefn(d.getVar('SSTATE_PK
>  SSTATE_PKG        = "${SSTATE_DIR}/${SSTATE_PKGNAME}"
>  SSTATE_EXTRAPATH   = ""
>  SSTATE_EXTRAPATHWILDCARD = ""
> -SSTATE_PATHSPEC   = "${SSTATE_DIR}/${SSTATE_EXTRAPATHWILDCARD}*/${SSTATE_PKGSPEC}"
> +SSTATE_PATHSPEC   = "${SSTATE_DIR}/${SSTATE_EXTRAPATHWILDCARD}*/*/${SSTATE_PKGSPEC}"
>  
>  # explicitly make PV to depend on evaluated value of PV variable
>  PV[vardepvalue] = "${PV}"
> diff --git a/meta/lib/oeqa/selftest/cases/signing.py b/meta/lib/oeqa/selftest/cases/signing.py
> index b65f3de64c4..9ea31328eff 100644
> --- a/meta/lib/oeqa/selftest/cases/signing.py
> +++ b/meta/lib/oeqa/selftest/cases/signing.py
> @@ -157,8 +157,8 @@ class Signing(OESelftestTestCase):
>              bitbake('-c clean %s' % test_recipe)
>              bitbake('-c populate_lic %s' % test_recipe)
>  
> -            recipe_sig = glob.glob(sstatedir + '/*/*:ed:*_populate_lic.tgz.sig')
> -            recipe_tgz = glob.glob(sstatedir + '/*/*:ed:*_populate_lic.tgz')
> +            recipe_sig = glob.glob(sstatedir + '/*/*/*:ed:*_populate_lic.tgz.sig')
> +            recipe_tgz = glob.glob(sstatedir + '/*/*/*:ed:*_populate_lic.tgz')
>  
>              self.assertEqual(len(recipe_sig), 1, 'Failed to find .sig file.')
>              self.assertEqual(len(recipe_tgz), 1, 'Failed to find .tgz file.')
> diff --git a/meta/lib/oeqa/selftest/cases/sstate.py b/meta/lib/oeqa/selftest/cases/sstate.py
> index 410dec64fcd..80ce9e353c0 100644
> --- a/meta/lib/oeqa/selftest/cases/sstate.py
> +++ b/meta/lib/oeqa/selftest/cases/sstate.py
> @@ -56,11 +56,11 @@ class SStateBase(OESelftestTestCase):
>      def search_sstate(self, filename_regex, distro_specific=True, distro_nonspecific=True):
>          result = []
>          for root, dirs, files in os.walk(self.sstate_path):
> -            if distro_specific and re.search("%s/[a-z0-9]{2}$" % self.hostdistro, root):
> +            if distro_specific and re.search(r"%s/%s/[a-z0-9]{2}/[a-z0-9]{2}$" % (self.sstate_path, self.hostdistro), root):
>                  for f in files:
>                      if re.search(filename_regex, f):
>                          result.append(f)
> -            if distro_nonspecific and re.search("%s/[a-z0-9]{2}$" % self.sstate_path, root):
> +            if distro_nonspecific and re.search(r"%s/[a-z0-9]{2}/[a-z0-9]{2}$" % self.sstate_path, root):
>                  for f in files:
>                      if re.search(filename_regex, f):
>                          result.append(f)
> diff --git a/scripts/gen-lockedsig-cache b/scripts/gen-lockedsig-cache
> index 9bfae9d8323..6a7d2859104 100755
> --- a/scripts/gen-lockedsig-cache
> +++ b/scripts/gen-lockedsig-cache
> @@ -78,11 +78,18 @@ files = set()
>  sstate_content_cache = {}
>  for s in sigs:
>      prefix = s[:2]
> +    prefix2 = s[2:4]
>      if prefix not in sstate_content_cache:
>          sstate_content_cache[prefix] = build_sha_cache(prefix)
> -
> -    for f in sstate_content_cache[prefix][s]:
> -        files.add(f)
> +    if prefix2 not in sstate_content_cache[prefix]:
> +        sstate_content_cache[prefix][prefix2] = build_sha_cache(prefix + "/" + prefix2)
> +
> +    if s in sstate_content_cache[prefix]:
> +        for f in sstate_content_cache[prefix][s]:
> +            files.add(f)
> +    if s in sstate_content_cache[prefix][prefix2]:
> +        for f in sstate_content_cache[prefix][prefix2][s]:
> +            files.add(f)
>  
>  elapsed = time.perf_counter() - start_time
>  print("Gathering file list took %.1fs" % elapsed)



More information about the Openembedded-core mailing list