Mercurial > public > mercurial-scm > hg
comparison mercurial/exchange.py @ 23848:c5456b64eb07
discovery: run discovery on filtered repository
We have been running discovery on unfiltered repository for quite some time.
This was aimed at two things:
- save some bandwith by prevent the repushing of common but hidden changesets
- allow phases changes on secret/hidden changeset on bare push.
The cost of this unfiltered discovery combined with evolution is actually really
high. Evolution likely create thousand of hidden heads, and the discovery is
going to try to discovery if each of them are common or not. For example,
pushing from my development mercurial repository implies 17 discovery
round-trip.
The benefit are rare corner cases while the drawback are massive. So we run the
discovery on a filtered repository again.
We add some hack to detect remote heads that are known locally and adds them to
the common set anyway, so the good behavior of most of the corner case should
remains. But this will not work in all cases.
This bring my discovery phase back from 17 round-trips to 1 or 2.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Wed, 07 Jan 2015 00:07:29 -0800 |
parents | 414374cfb531 |
children | 7817059917d0 |
comparison
equal
deleted
inserted
replaced
23847:71402bb8d8b2 | 23848:c5456b64eb07 |
---|---|
269 step(pushop) | 269 step(pushop) |
270 | 270 |
271 @pushdiscovery('changeset') | 271 @pushdiscovery('changeset') |
272 def _pushdiscoverychangeset(pushop): | 272 def _pushdiscoverychangeset(pushop): |
273 """discover the changeset that need to be pushed""" | 273 """discover the changeset that need to be pushed""" |
274 unfi = pushop.repo.unfiltered() | |
275 fci = discovery.findcommonincoming | 274 fci = discovery.findcommonincoming |
276 commoninc = fci(unfi, pushop.remote, force=pushop.force) | 275 commoninc = fci(pushop.repo, pushop.remote, force=pushop.force) |
277 common, inc, remoteheads = commoninc | 276 common, inc, remoteheads = commoninc |
278 fco = discovery.findcommonoutgoing | 277 fco = discovery.findcommonoutgoing |
279 outgoing = fco(unfi, pushop.remote, onlyheads=pushop.revs, | 278 outgoing = fco(pushop.repo, pushop.remote, onlyheads=pushop.revs, |
280 commoninc=commoninc, force=pushop.force) | 279 commoninc=commoninc, force=pushop.force) |
281 pushop.outgoing = outgoing | 280 pushop.outgoing = outgoing |
282 pushop.remoteheads = remoteheads | 281 pushop.remoteheads = remoteheads |
283 pushop.incoming = inc | 282 pushop.incoming = inc |
284 | 283 |
925 def _pulldiscoverychangegroup(pullop): | 924 def _pulldiscoverychangegroup(pullop): |
926 """discovery phase for the pull | 925 """discovery phase for the pull |
927 | 926 |
928 Current handle changeset discovery only, will change handle all discovery | 927 Current handle changeset discovery only, will change handle all discovery |
929 at some point.""" | 928 at some point.""" |
930 tmp = discovery.findcommonincoming(pullop.repo.unfiltered(), | 929 tmp = discovery.findcommonincoming(pullop.repo, |
931 pullop.remote, | 930 pullop.remote, |
932 heads=pullop.heads, | 931 heads=pullop.heads, |
933 force=pullop.force) | 932 force=pullop.force) |
934 pullop.common, pullop.fetch, pullop.rheads = tmp | 933 common, fetch, rheads = tmp |
934 nm = pullop.repo.unfiltered().changelog.nodemap | |
935 if fetch and rheads: | |
936 # If a remote heads in filtered locally, lets drop it from the unknown | |
937 # remote heads and put in back in common. | |
938 # | |
939 # This is a hackish solution to catch most of "common but locally | |
940 # hidden situation". We do not performs discovery on unfiltered | |
941 # repository because it end up doing a pathological amount of round | |
942 # trip for w huge amount of changeset we do not care about. | |
943 # | |
944 # If a set of such "common but filtered" changeset exist on the server | |
945 # but are not including a remote heads, we'll not be able to detect it, | |
946 scommon = set(common) | |
947 filteredrheads = [] | |
948 for n in rheads: | |
949 if n in nm and n not in scommon: | |
950 common.append(n) | |
951 else: | |
952 filteredrheads.append(n) | |
953 if not filteredrheads: | |
954 fetch = [] | |
955 rheads = filteredrheads | |
956 pullop.common = common | |
957 pullop.fetch = fetch | |
958 pullop.rheads = rheads | |
935 | 959 |
936 def _pullbundle2(pullop): | 960 def _pullbundle2(pullop): |
937 """pull data using bundle2 | 961 """pull data using bundle2 |
938 | 962 |
939 For now, the only supported data are changegroup.""" | 963 For now, the only supported data are changegroup.""" |