comparison mercurial/debugcommands.py @ 46535:4f5e9a77ff7a

debugdiscovery: add flags to run discovery on subsets of the local repo Generating new repository using strip of local clone is very expensive for large repositories. And such large repository are the most likely to requires debugging around discovery. So we add a simple way to run discovery using provided sets of heads. Differential Revision: https://phab.mercurial-scm.org/D9945
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 29 Jan 2021 15:23:07 +0100
parents 3e3b81b6e7da
children c2435280ca63
comparison
equal deleted inserted replaced
46534:d6e73351533b 46535:4f5e9a77ff7a
67 policy, 67 policy,
68 pvec, 68 pvec,
69 pycompat, 69 pycompat,
70 registrar, 70 registrar,
71 repair, 71 repair,
72 repoview,
72 revlog, 73 revlog,
73 revset, 74 revset,
74 revsetlang, 75 revsetlang,
75 scmutil, 76 scmutil,
76 setdiscovery, 77 setdiscovery,
962 None, 963 None,
963 _(b'use old-style discovery with non-heads included'), 964 _(b'use old-style discovery with non-heads included'),
964 ), 965 ),
965 (b'', b'rev', [], b'restrict discovery to this set of revs'), 966 (b'', b'rev', [], b'restrict discovery to this set of revs'),
966 (b'', b'seed', b'12323', b'specify the random seed use for discovery'), 967 (b'', b'seed', b'12323', b'specify the random seed use for discovery'),
968 (
969 b'',
970 b'local-as-revs',
971 "",
972 'treat local has having these revisions only',
973 ),
974 (
975 b'',
976 b'remote-as-revs',
977 "",
978 'use local as remote, with only these these revisions',
979 ),
967 ] 980 ]
968 + cmdutil.remoteopts, 981 + cmdutil.remoteopts,
969 _(b'[--rev REV] [OTHER]'), 982 _(b'[--rev REV] [OTHER]'),
970 ) 983 )
971 def debugdiscovery(ui, repo, remoteurl=b"default", **opts): 984 def debugdiscovery(ui, repo, remoteurl=b"default", **opts):
972 """runs the changeset discovery protocol in isolation""" 985 """runs the changeset discovery protocol in isolation
986
987 The local peer can be "replaced" by a subset of the local repository by
988 using the `--local-as-revs` flag. Int he same way, usual `remote` peer can
989 be "replaced" by a subset of the local repository using the
990 `--local-as-revs` flag. This is useful to efficiently debug pathological
991 discovery situation.
992 """
973 opts = pycompat.byteskwargs(opts) 993 opts = pycompat.byteskwargs(opts)
974 remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl)) 994 unfi = repo.unfiltered()
975 remote = hg.peer(repo, opts, remoteurl) 995
976 ui.status(_(b'comparing with %s\n') % util.hidepassword(remoteurl)) 996 # setup potential extra filtering
997 local_revs = opts[b"local_as_revs"]
998 remote_revs = opts[b"remote_as_revs"]
977 999
978 # make sure tests are repeatable 1000 # make sure tests are repeatable
979 random.seed(int(opts[b'seed'])) 1001 random.seed(int(opts[b'seed']))
1002
1003 if not remote_revs:
1004
1005 remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl))
1006 remote = hg.peer(repo, opts, remoteurl)
1007 ui.status(_(b'comparing with %s\n') % util.hidepassword(remoteurl))
1008 else:
1009 branches = (None, [])
1010 remote_filtered_revs = scmutil.revrange(
1011 unfi, [b"not (::(%s))" % remote_revs]
1012 )
1013 remote_filtered_revs = frozenset(remote_filtered_revs)
1014
1015 def remote_func(x):
1016 return remote_filtered_revs
1017
1018 repoview.filtertable[b'debug-discovery-remote-filter'] = remote_func
1019
1020 remote = repo.peer()
1021 remote._repo = remote._repo.filtered(b'debug-discovery-remote-filter')
1022
1023 if local_revs:
1024 local_filtered_revs = scmutil.revrange(
1025 unfi, [b"not (::(%s))" % local_revs]
1026 )
1027 local_filtered_revs = frozenset(local_filtered_revs)
1028
1029 def local_func(x):
1030 return local_filtered_revs
1031
1032 repoview.filtertable[b'debug-discovery-local-filter'] = local_func
1033 repo = repo.filtered(b'debug-discovery-local-filter')
980 1034
981 data = {} 1035 data = {}
982 if opts.get(b'old'): 1036 if opts.get(b'old'):
983 1037
984 def doit(pushedrevs, remoteheads, remote=remote): 1038 def doit(pushedrevs, remoteheads, remote=remote):