Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revlogutils/docket.py @ 47266: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 | 4abd474a10af |
children | 921648d31553 |
comparison
equal
deleted
inserted
replaced
47265:eac3591abbf4 | 47266:ff9fd7107d11 |
---|---|
19 | 19 |
20 import struct | 20 import struct |
21 | 21 |
22 from .. import ( | 22 from .. import ( |
23 error, | 23 error, |
24 util, | |
24 ) | 25 ) |
25 | 26 |
26 from . import ( | 27 from . import ( |
27 constants, | 28 constants, |
28 ) | 29 ) |
34 # | revlog index header. | 35 # | revlog index header. |
35 # * 8 bytes: size of index-data | 36 # * 8 bytes: size of index-data |
36 # * 8 bytes: pending size of index-data | 37 # * 8 bytes: pending size of index-data |
37 # * 8 bytes: size of data | 38 # * 8 bytes: size of data |
38 # * 8 bytes: pending size of data | 39 # * 8 bytes: pending size of data |
39 S_HEADER = struct.Struct(constants.INDEX_HEADER.format + 'LLLL') | 40 # * 1 bytes: default compression header |
41 S_HEADER = struct.Struct(constants.INDEX_HEADER.format + 'LLLLc') | |
40 | 42 |
41 | 43 |
42 class RevlogDocket(object): | 44 class RevlogDocket(object): |
43 """metadata associated with revlog""" | 45 """metadata associated with revlog""" |
44 | 46 |
49 version_header=None, | 51 version_header=None, |
50 index_end=0, | 52 index_end=0, |
51 pending_index_end=0, | 53 pending_index_end=0, |
52 data_end=0, | 54 data_end=0, |
53 pending_data_end=0, | 55 pending_data_end=0, |
56 default_compression_header=None, | |
54 ): | 57 ): |
55 self._version_header = version_header | 58 self._version_header = version_header |
56 self._read_only = bool(use_pending) | 59 self._read_only = bool(use_pending) |
57 self._dirty = False | 60 self._dirty = False |
58 self._radix = revlog.radix | 61 self._radix = revlog.radix |
69 self._index_end = self._pending_index_end | 72 self._index_end = self._pending_index_end |
70 self._data_end = self._pending_data_end | 73 self._data_end = self._pending_data_end |
71 else: | 74 else: |
72 self._index_end = self._initial_index_end | 75 self._index_end = self._initial_index_end |
73 self._data_end = self._initial_data_end | 76 self._data_end = self._initial_data_end |
77 self.default_compression_header = default_compression_header | |
74 | 78 |
75 def index_filepath(self): | 79 def index_filepath(self): |
76 """file path to the current index file associated to this docket""" | 80 """file path to the current index file associated to this docket""" |
77 # very simplistic version at first | 81 # very simplistic version at first |
78 return b"%s.idx" % self._radix | 82 return b"%s.idx" % self._radix |
132 self._version_header, | 136 self._version_header, |
133 official_index_end, | 137 official_index_end, |
134 self._index_end, | 138 self._index_end, |
135 official_data_end, | 139 official_data_end, |
136 self._data_end, | 140 self._data_end, |
141 self.default_compression_header, | |
137 ) | 142 ) |
138 return S_HEADER.pack(*data) | 143 return S_HEADER.pack(*data) |
139 | 144 |
140 | 145 |
141 def default_docket(revlog, version_header): | 146 def default_docket(revlog, version_header): |
142 """given a revlog version a new docket object for the given revlog""" | 147 """given a revlog version a new docket object for the given revlog""" |
143 if (version_header & 0xFFFF) != constants.REVLOGV2: | 148 if (version_header & 0xFFFF) != constants.REVLOGV2: |
144 return None | 149 return None |
145 docket = RevlogDocket(revlog, version_header=version_header) | 150 comp = util.compengines[revlog._compengine].revlogheader() |
151 docket = RevlogDocket( | |
152 revlog, | |
153 version_header=version_header, | |
154 default_compression_header=comp, | |
155 ) | |
146 docket._dirty = True | 156 docket._dirty = True |
147 return docket | 157 return docket |
148 | 158 |
149 | 159 |
150 def parse_docket(revlog, data, use_pending=False): | 160 def parse_docket(revlog, data, use_pending=False): |
153 version_header = header[0] | 163 version_header = header[0] |
154 index_size = header[1] | 164 index_size = header[1] |
155 pending_index_size = header[2] | 165 pending_index_size = header[2] |
156 data_size = header[3] | 166 data_size = header[3] |
157 pending_data_size = header[4] | 167 pending_data_size = header[4] |
168 default_compression_header = header[5] | |
158 docket = RevlogDocket( | 169 docket = RevlogDocket( |
159 revlog, | 170 revlog, |
160 use_pending=use_pending, | 171 use_pending=use_pending, |
161 version_header=version_header, | 172 version_header=version_header, |
162 index_end=index_size, | 173 index_end=index_size, |
163 pending_index_end=pending_index_size, | 174 pending_index_end=pending_index_size, |
164 data_end=data_size, | 175 data_end=data_size, |
165 pending_data_end=pending_data_size, | 176 pending_data_end=pending_data_size, |
177 default_compression_header=default_compression_header, | |
166 ) | 178 ) |
167 return docket | 179 return docket |