On 11/18/19 11:41 PM, Sergei Trofimovich wrote:
> On Mon, 18 Nov 2019 16:45:58 -0800
> Zac Medico <zmed...@gentoo.org> wrote:
> 
>> On 11/18/19 4:21 PM, Sergei Trofimovich wrote:
>>> repoman slows down ~linearly with amount of profiles being scanned.
>>> In case of amd64 we have 28 stable profiles.
>>>
>>> To speed up processing and fit into time budged of various CIs we can
>>> split the work across different processes that handle different profiles.
>>>
>>> Example benchmark on ::haskell overlay:
>>>     $ ./repoman full --include-arches=amd64
>>>     ~65 minutes
>>>     $ ./repoman full --include-profiles=default/linux/amd64/17.0
>>>     ~4 minutes
>>> This allows for a crude sharding of work across processes and allows for
>>> cheap tree-wide scans for early failures.
>>>
>>> Bug: https://bugs.gentoo.org/700456
>>> Signed-off-by: Sergei Trofimovich <sly...@gentoo.org>
>>> ---
>>>  repoman/lib/repoman/actions.py                      | 4 ++++
>>>  repoman/lib/repoman/argparser.py                    | 7 +++++++
>>>  repoman/lib/repoman/modules/scan/depend/__init__.py | 3 ++-
>>>  repoman/lib/repoman/modules/scan/depend/profile.py  | 9 +++++++--
>>>  repoman/lib/repoman/scanner.py                      | 5 +++++
>>>  repoman/man/repoman.1                               | 4 ++++
>>>  6 files changed, 29 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/repoman/lib/repoman/actions.py b/repoman/lib/repoman/actions.py
>>> index 1c9989a72..92d4d4e94 100644
>>> --- a/repoman/lib/repoman/actions.py
>>> +++ b/repoman/lib/repoman/actions.py
>>> @@ -412,6 +412,10 @@ the whole commit message to abort.
>>>                     report_options.append(
>>>                             "--include-arches=\"%s\"" %
>>>                             " ".join(sorted(self.scanner.include_arches)))
>>> +           if self.scanner.include_profiles is not None:
>>> +                   report_options.append(
>>> +                           "--include-profiles=\"%s\"" %
>>> +                           " ".join(sorted(self.scanner.include_profiles)))
>>>  
>>>             if portage_version is None:
>>>                     sys.stderr.write("Failed to insert portage version in 
>>> message!\n")
>>> diff --git a/repoman/lib/repoman/argparser.py 
>>> b/repoman/lib/repoman/argparser.py
>>> index fa0e6ff90..670a0e91d 100644
>>> --- a/repoman/lib/repoman/argparser.py
>>> +++ b/repoman/lib/repoman/argparser.py
>>> @@ -164,6 +164,13 @@ def parse_args(argv, repoman_default_opts):
>>>                     'A space separated list of arches used to '
>>>                     'filter the selection of profiles for dependency 
>>> checks'))
>>>  
>>> +   parser.add_argument(
>>> +           '--include-profiles',
>>> +           dest='include_profiles', metavar='PROFILES', action='append',
>>> +           help=(
>>> +                   'A space separated list of profiles used to '
>>> +                   'define the selection of profiles for dependency 
>>> checks'))
>>> +
>>>     parser.add_argument(
>>>             '-d', '--include-dev', dest='include_dev', action='store_true',
>>>             default=False,
>>> diff --git a/repoman/lib/repoman/modules/scan/depend/__init__.py 
>>> b/repoman/lib/repoman/modules/scan/depend/__init__.py
>>> index c3cc0ddeb..9068760bb 100644
>>> --- a/repoman/lib/repoman/modules/scan/depend/__init__.py
>>> +++ b/repoman/lib/repoman/modules/scan/depend/__init__.py
>>> @@ -19,7 +19,8 @@ module_spec = {
>>>                     'func_desc': {
>>>                     },
>>>                     'mod_kwargs': ['qatracker', 'portdb', 'profiles', 
>>> 'options',
>>> -                           'repo_metadata', 'repo_settings', 
>>> 'include_arches', 'caches',
>>> +                           'repo_metadata', 'repo_settings', 
>>> 'include_arches',
>>> +                           'include_profiles', 'caches',
>>>                             'repoman_incrementals', 'env', 'have', 
>>> 'dev_keywords'
>>>                     ],
>>>                     'func_kwargs': {
>>> diff --git a/repoman/lib/repoman/modules/scan/depend/profile.py 
>>> b/repoman/lib/repoman/modules/scan/depend/profile.py
>>> index d980f4eca..0b1d74483 100644
>>> --- a/repoman/lib/repoman/modules/scan/depend/profile.py
>>> +++ b/repoman/lib/repoman/modules/scan/depend/profile.py
>>> @@ -33,6 +33,7 @@ class ProfileDependsChecks(ScanBase):
>>>             @param options: cli options
>>>             @param repo_settings: repository settings instance
>>>             @param include_arches: set
>>> +           @param include_profiles: set
>>>             @param caches: dictionary of our caches
>>>             @param repoman_incrementals: tuple
>>>             @param env: the environment
>>> @@ -46,6 +47,7 @@ class ProfileDependsChecks(ScanBase):
>>>             self.options = kwargs.get('options')
>>>             self.repo_settings = kwargs.get('repo_settings')
>>>             self.include_arches = kwargs.get('include_arches')
>>> +           self.include_profiles = kwargs.get('include_profiles')
>>>             self.caches = kwargs.get('caches')
>>>             self.repoman_incrementals = kwargs.get('repoman_incrementals')
>>>             self.env = kwargs.get('env')
>>> @@ -81,8 +83,11 @@ class ProfileDependsChecks(ScanBase):
>>>                             if arch not in self.include_arches:
>>>                                     continue
>>>  
>>> -                   relevant_profiles.extend(
>>> -                           (keyword, groups, prof) for prof in 
>>> self.profiles[arch])
>>> +                   for prof in self.profiles[arch]:
>>> +                           if self.include_profiles is not None:
>>> +                                   if prof not in self.include_profiles:
>>> +                                           continue
>>> +                           relevant_profiles.append((keyword, groups, 
>>> prof))
>>>  
>>>             relevant_profiles.sort(key=sort_key)
>>>  
>>> diff --git a/repoman/lib/repoman/scanner.py b/repoman/lib/repoman/scanner.py
>>> index 1b3242a51..06234b0ad 100644
>>> --- a/repoman/lib/repoman/scanner.py
>>> +++ b/repoman/lib/repoman/scanner.py
>>> @@ -164,6 +164,10 @@ class Scanner(object):
>>>             if self.options.include_arches:
>>>                     self.include_arches = set()
>>>                     self.include_arches.update(*[x.split() for x in 
>>> self.options.include_arches])
>>> +           self.include_profiles = None
>>> +           if self.options.include_profiles:
>>> +                   self.include_profiles = set()
>>> +                   self.include_profiles.update(*[x.split() for x in 
>>> self.options.include_profiles])
>>>  
>>>             # Disable the "self.modules['Ebuild'].notadded" check when not 
>>> in commit mode and
>>>             # running `svn status` in every package dir will be too 
>>> expensive.
>>> @@ -190,6 +194,7 @@ class Scanner(object):
>>>                     "repo_metadata": self.repo_metadata,
>>>                     "profiles": profiles,
>>>                     "include_arches": self.include_arches,
>>> +                   "include_profiles": self.include_profiles,
>>>                     "caches": self.caches,
>>>                     "repoman_incrementals": self.repoman_incrementals,
>>>                     "env": self.env,
>>> diff --git a/repoman/man/repoman.1 b/repoman/man/repoman.1
>>> index 766146f57..f33fb6098 100644
>>> --- a/repoman/man/repoman.1
>>> +++ b/repoman/man/repoman.1
>>> @@ -120,6 +120,10 @@ Ignore masked packages (not allowed with commit mode)
>>>  A space separated list of arches used to filter the selection of
>>>  profiles for dependency checks.
>>>  .TP
>>> +.BR "\-\-include\-profiles " PROFILES
>>> +A space separated list of profiles used to
>>> +define the selection of profiles for dependency checks.
>>> +.TP
>>>  \fB\-d\fR, \fB\-\-include\-dev\fR
>>>  Include dev profiles in dependency checks.
>>>  .TP
>>>   
>>
>> Looks good. Please merge.
>> -- 
>> Thanks,
>> Zac
>>
> 
> Thank you!
> 
> Does not look like I have permissions to do it:

Ok, merged with prof.sub_path fix:

https://gitweb.gentoo.org/proj/portage.git/commit/?id=e9bb1e9681685f4e4d7174f51751356fd3f67d0c

-- 
Thanks,
Zac

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to