##// END OF EJS Templates
delta-find: add a way to control the number of bases tested at the same time...
marmoute -
r50552:f5f113f1 default
parent child Browse files
Show More
@@ -2042,6 +2042,11 b' coreconfigitem('
2042 )
2042 )
2043 coreconfigitem(
2043 coreconfigitem(
2044 b'storage',
2044 b'storage',
2045 b'revlog.delta-parent-search.candidate-group-chunk-size',
2046 default=0,
2047 )
2048 coreconfigitem(
2049 b'storage',
2045 b'revlog.issue6528.fix-incoming',
2050 b'revlog.issue6528.fix-incoming',
2046 default=True,
2051 default=True,
2047 )
2052 )
@@ -2281,6 +2281,21 b' category impact performance and reposito'
2281 To fix affected revisions that already exist within the repository, one can
2281 To fix affected revisions that already exist within the repository, one can
2282 use :hg:`debug-repair-issue-6528`.
2282 use :hg:`debug-repair-issue-6528`.
2283
2283
2284 .. container:: verbose
2285
2286 ``revlog.delta-parent-search.candidate-group-chunk-size``
2287 Tune the number of delta bases the storage will consider in the
2288 same "round" of search. In some very rare cases, using a smaller value
2289 might result in faster processing at the possible expense of storage
2290 space, while using larger values might result in slower processing at the
2291 possible benefit of storage space. A value of "0" means no limitation.
2292
2293 default: no limitation
2294
2295 This is unlikely that you'll have to tune this configuration. If you think
2296 you do, consider talking with the mercurial developer community about your
2297 repositories.
2298
2284 ``revlog.optimize-delta-parent-choice``
2299 ``revlog.optimize-delta-parent-choice``
2285 When storing a merge revision, both parents will be equally considered as
2300 When storing a merge revision, both parents will be equally considered as
2286 a possible delta base. This results in better delta selection and improved
2301 a possible delta base. This results in better delta selection and improved
@@ -1081,6 +1081,11 b' def resolverevlogstorevfsoptions(ui, req'
1081 b'storage', b'revlog.optimize-delta-parent-choice'
1081 b'storage', b'revlog.optimize-delta-parent-choice'
1082 )
1082 )
1083 options[b'deltabothparents'] = deltabothparents
1083 options[b'deltabothparents'] = deltabothparents
1084 dps_cgds = ui.configint(
1085 b'storage',
1086 b'revlog.delta-parent-search.candidate-group-chunk-size',
1087 )
1088 options[b'delta-parent-search.candidate-group-chunk-size'] = dps_cgds
1084 options[b'debug-delta'] = ui.configbool(b'debug', b'revlog.debug-delta')
1089 options[b'debug-delta'] = ui.configbool(b'debug', b'revlog.debug-delta')
1085
1090
1086 issue6528 = ui.configbool(b'storage', b'revlog.issue6528.fix-incoming')
1091 issue6528 = ui.configbool(b'storage', b'revlog.issue6528.fix-incoming')
@@ -348,6 +348,7 b' class revlog:'
348 self._chunkcachesize = 65536
348 self._chunkcachesize = 65536
349 self._maxchainlen = None
349 self._maxchainlen = None
350 self._deltabothparents = True
350 self._deltabothparents = True
351 self._candidate_group_chunk_size = 0
351 self._debug_delta = False
352 self._debug_delta = False
352 self.index = None
353 self.index = None
353 self._docket = None
354 self._docket = None
@@ -422,6 +423,9 b' class revlog:'
422 self._maxchainlen = opts[b'maxchainlen']
423 self._maxchainlen = opts[b'maxchainlen']
423 if b'deltabothparents' in opts:
424 if b'deltabothparents' in opts:
424 self._deltabothparents = opts[b'deltabothparents']
425 self._deltabothparents = opts[b'deltabothparents']
426 dps_cgds = opts.get(b'delta-parent-search.candidate-group-chunk-size')
427 if dps_cgds:
428 self._candidate_group_chunk_size = dps_cgds
425 self._lazydelta = bool(opts.get(b'lazydelta', True))
429 self._lazydelta = bool(opts.get(b'lazydelta', True))
426 self._lazydeltabase = False
430 self._lazydeltabase = False
427 if self._lazydelta:
431 if self._lazydelta:
@@ -680,6 +680,7 b' def _candidategroups('
680 good = None
680 good = None
681
681
682 deltas_limit = textlen * LIMIT_DELTA2TEXT
682 deltas_limit = textlen * LIMIT_DELTA2TEXT
683 group_chunk_size = revlog._candidate_group_chunk_size
683
684
684 tested = {nullrev}
685 tested = {nullrev}
685 candidates = _refinedgroups(
686 candidates = _refinedgroups(
@@ -770,11 +771,30 b' def _candidategroups('
770
771
771 group.append(rev)
772 group.append(rev)
772 if group:
773 if group:
773 # XXX: in the sparse revlog case, group can become large,
774 # When the size of the candidate group is big, it can result in a
774 # impacting performances. Some bounding or slicing mecanism
775 # quite significant performance impact. To reduce this, we can send
775 # would help to reduce this impact.
776 # them in smaller batches until the new batch does not provide any
776 tested.update(group)
777 # improvements.
777 good = yield tuple(group)
778 #
779 # This might reduce the overall efficiency of the compression in
780 # some corner cases, but that should also prevent very pathological
781 # cases from being an issue. (eg. 20 000 candidates).
782 #
783 # XXX note that the ordering of the group becomes important as it
784 # now impacts the final result. The current order is unprocessed
785 # and can be improved.
786 if group_chunk_size == 0:
787 tested.update(group)
788 good = yield tuple(group)
789 else:
790 prev_good = good
791 for start in range(0, len(group), group_chunk_size):
792 sub_group = group[start : start + group_chunk_size]
793 tested.update(sub_group)
794 good = yield tuple(sub_group)
795 if prev_good == good:
796 break
797
778 yield None
798 yield None
779
799
780
800
General Comments 0
You need to be logged in to leave comments. Login now