Mercurial > public > mercurial-scm > hg
diff mercurial/revlogutils/docket.py @ 47389:e6292eb33384
revlog: store sidedata in their own file
This makes sidedata manipulation simpler and results in more compact data when
traversing either data or sidedata.
Differential Revision: https://phab.mercurial-scm.org/D10787
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 28 May 2021 23:41:17 +0200 |
parents | bcf92bdc2bca |
children | be903d043099 |
line wrap: on
line diff
--- a/mercurial/revlogutils/docket.py Fri May 28 23:41:12 2021 +0200 +++ b/mercurial/revlogutils/docket.py Fri May 28 23:41:17 2021 +0200 @@ -90,12 +90,15 @@ # | revlog index header. # * 1 bytes: size of index uuid # * 1 bytes: size of data uuid +# * 1 bytes: size of sizedata uuid # * 8 bytes: size of index-data # * 8 bytes: pending size of index-data # * 8 bytes: size of data +# * 8 bytes: size of sidedata # * 8 bytes: pending size of data +# * 8 bytes: pending size of sidedata # * 1 bytes: default compression header -S_HEADER = struct.Struct(constants.INDEX_HEADER_FMT + b'BBLLLLc') +S_HEADER = struct.Struct(constants.INDEX_HEADER_FMT + b'BBBLLLLLLc') class RevlogDocket(object): @@ -108,10 +111,13 @@ version_header=None, index_uuid=None, data_uuid=None, + sidedata_uuid=None, index_end=0, pending_index_end=0, data_end=0, pending_data_end=0, + sidedata_end=0, + pending_sidedata_end=0, default_compression_header=None, ): self._version_header = version_header @@ -122,19 +128,25 @@ self._opener = revlog.opener self._index_uuid = index_uuid self._data_uuid = data_uuid + self._sidedata_uuid = sidedata_uuid # thes asserts should be True as long as we have a single index filename assert index_end <= pending_index_end assert data_end <= pending_data_end + assert sidedata_end <= pending_sidedata_end self._initial_index_end = index_end self._pending_index_end = pending_index_end self._initial_data_end = data_end self._pending_data_end = pending_data_end + self._initial_sidedata_end = sidedata_end + self._pending_sidedata_end = pending_sidedata_end if use_pending: self._index_end = self._pending_index_end self._data_end = self._pending_data_end + self._sidedata_end = self._pending_sidedata_end else: self._index_end = self._initial_index_end self._data_end = self._initial_data_end + self._sidedata_end = self._initial_sidedata_end self.default_compression_header = default_compression_header def index_filepath(self): @@ -151,6 +163,13 @@ self._data_uuid = make_uid() return b"%s-%s.dat" % (self._radix, self._data_uuid) + def sidedata_filepath(self): + """file path to the current sidedata file associated to this docket""" + # very simplistic version at first + if self._sidedata_uuid is None: + self._sidedata_uuid = make_uid() + return b"%s-%s.sda" % (self._radix, self._sidedata_uuid) + @property def index_end(self): return self._index_end @@ -171,6 +190,16 @@ self._data_end = new_size self._dirty = True + @property + def sidedata_end(self): + return self._sidedata_end + + @sidedata_end.setter + def sidedata_end(self, new_size): + if new_size != self._sidedata_end: + self._sidedata_end = new_size + self._dirty = True + def write(self, transaction, pending=False, stripping=False): """write the modification of disk if any @@ -196,26 +225,33 @@ if pending: official_index_end = self._initial_index_end official_data_end = self._initial_data_end + official_sidedata_end = self._initial_sidedata_end else: official_index_end = self._index_end official_data_end = self._data_end + official_sidedata_end = self._sidedata_end # this assert should be True as long as we have a single index filename assert official_data_end <= self._data_end + assert official_sidedata_end <= self._sidedata_end data = ( self._version_header, len(self._index_uuid), len(self._data_uuid), + len(self._sidedata_uuid), official_index_end, self._index_end, official_data_end, self._data_end, + official_sidedata_end, + self._sidedata_end, self.default_compression_header, ) s = [] s.append(S_HEADER.pack(*data)) s.append(self._index_uuid) s.append(self._data_uuid) + s.append(self._sidedata_uuid) return b''.join(s) @@ -262,6 +298,9 @@ data_uuid_size = next(iheader) data_uuid = get_data(data_uuid_size) + sidedata_uuid_size = next(iheader) + sidedata_uuid = get_data(sidedata_uuid_size) + index_size = next(iheader) pending_index_size = next(iheader) @@ -270,6 +309,10 @@ pending_data_size = next(iheader) + sidedata_size = next(iheader) + + pending_sidedata_size = next(iheader) + default_compression_header = next(iheader) docket = RevlogDocket( @@ -278,10 +321,13 @@ version_header=version_header, index_uuid=index_uuid, data_uuid=data_uuid, + sidedata_uuid=sidedata_uuid, index_end=index_size, pending_index_end=pending_index_size, data_end=data_size, pending_data_end=pending_data_size, + sidedata_end=sidedata_size, + pending_sidedata_end=pending_sidedata_size, default_compression_header=default_compression_header, ) return docket