# HG changeset patch # User Paul Morelle # Date 2017-10-14 15:05:41 # Node ID 4d5d5009bd7544ac0c2c5366bd04bc4228a5b148 # Parent e2ad93bcc084b97c48f54c179365376edb702858 revlog-sparse-read: add a lower-threshold for read block size The option experimental.sparse-read.min-block-size specifies the minimal size of a deltachain span, under which it won't be split by _slicechunk. diff --git a/mercurial/configitems.py b/mercurial/configitems.py --- a/mercurial/configitems.py +++ b/mercurial/configitems.py @@ -417,6 +417,9 @@ coreconfigitem('experimental', 'sparse-r coreconfigitem('experimental', 'sparse-read.density-threshold', default=0.25, ) +coreconfigitem('experimental', 'sparse-read.min-block-size', + default='256K', +) coreconfigitem('experimental', 'treemanifest', default=False, ) diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -611,8 +611,11 @@ class localrepository(object): withsparseread = self.ui.configbool('experimental', 'sparse-read') srdensitythres = float(self.ui.config('experimental', 'sparse-read.density-threshold')) + srminblocksize = self.ui.configbytes('experimental', + 'sparse-read.min-block-size') self.svfs.options['with-sparse-read'] = withsparseread self.svfs.options['sparse-read-density-threshold'] = srdensitythres + self.svfs.options['sparse-read-min-block-size'] = srminblocksize for r in self.requirements: if r.startswith('exp-compression-'): diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -180,7 +180,7 @@ def _slicechunk(revlog, revs): endbyte = start(revs[-1]) + length(revs[-1]) deltachainspan = endbyte - startbyte - if len(revs) <= 1: + if deltachainspan <= revlog._srminblocksize or len(revs) <= 1: yield revs continue @@ -360,6 +360,7 @@ class revlog(object): self._maxdeltachainspan = -1 self._withsparseread = False self._srdensitythreshold = 0.25 + self._srminblocksize = 262144 mmapindexthreshold = None v = REVLOG_DEFAULT_VERSION @@ -389,6 +390,8 @@ class revlog(object): self._withsparseread = bool(opts.get('with-sparse-read', False)) if 'sparse-read-density-threshold' in opts: self._srdensitythreshold = opts['sparse-read-density-threshold'] + if 'sparse-read-min-block-size' in opts: + self._srminblocksize = opts['sparse-read-min-block-size'] if self._chunkcachesize <= 0: raise RevlogError(_('revlog chunk cache size %r is not greater '