Mercurial > public > mercurial-scm > hg
diff mercurial/revlog.py @ 47255:ff9fd7107d11
revlog: implement a "default compression" mode
The revlog docker is now storing a default compression engine. When a chunk use
that compression, a dedicated mode is used in the revlog entry and we can
directly route it to the right decompressor.
We should probably make PLAIN and DEFAULT mode the only available mode for
revlogv2, but this is something for later.
Differential Revision: https://phab.mercurial-scm.org/D10652
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 03 May 2021 21:13:24 +0200 |
parents | eac3591abbf4 |
children | 2b69555e4875 |
line wrap: on
line diff
--- a/mercurial/revlog.py Mon May 03 21:04:55 2021 +0200 +++ b/mercurial/revlog.py Mon May 03 21:13:24 2021 +0200 @@ -35,6 +35,7 @@ from .pycompat import getattr from .revlogutils.constants import ( ALL_KINDS, + COMP_MODE_DEFAULT, COMP_MODE_INLINE, COMP_MODE_PLAIN, FEATURES_BY_VERSION, @@ -708,6 +709,15 @@ engine = util.compengines[self._compengine] return engine.revlogcompressor(self._compengineopts) + @util.propertycache + def _decompressor(self): + """the default decompressor""" + if self._docket is None: + return None + t = self._docket.default_compression_header + c = self._get_decompressor(t) + return c.decompress + def _indexfp(self): """file object for the revlog's index file""" return self.opener(self._indexfile, mode=b"r") @@ -1776,6 +1786,8 @@ data = self._getsegmentforrevs(rev, rev, df=df)[1] if compression_mode == COMP_MODE_PLAIN: return data + elif compression_mode == COMP_MODE_DEFAULT: + return self._decompressor(data) elif compression_mode == COMP_MODE_INLINE: return self.decompress(data) else: @@ -1829,6 +1841,8 @@ return [self._chunk(rev, df=df) for rev in revschunk] decomp = self.decompress + # self._decompressor might be None, but will not be used in that case + def_decomp = self._decompressor for rev in revschunk: chunkstart = start(rev) if inline: @@ -1840,6 +1854,8 @@ ladd(c) elif comp_mode == COMP_MODE_INLINE: ladd(decomp(c)) + elif comp_mode == COMP_MODE_DEFAULT: + ladd(def_decomp(c)) else: msg = 'unknown compression mode %d' msg %= comp_mode @@ -2489,8 +2505,12 @@ if not h and not d: # not data to store at all... declare them uncompressed compression_mode = COMP_MODE_PLAIN - elif not h and d[0:1] == b'\0': - compression_mode = COMP_MODE_PLAIN + elif not h: + t = d[0:1] + if t == b'\0': + compression_mode = COMP_MODE_PLAIN + elif t == self._docket.default_compression_header: + compression_mode = COMP_MODE_DEFAULT elif h == b'u': # we have a more efficient way to declare uncompressed h = b''