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