##// END OF EJS Templates
exchange: improve computation of relevant markers for large repos...
exchange: improve computation of relevant markers for large repos Compute the candidate nodes with relevant markers directly from keys of the predecessors/successors/children dictionaries of obsstore. This is faster than iterating over all nodes directly. This test could be further improved for repositories with relative few markers compared to the repository size, but this is no longer hot already. With the current loop structure, the obshashrange use works as well as before as it passes lists with a single node. Adjust the interface by allowing revision lists as well as node lists. This helps cases that computes ancestors as it reduces the materialisation cost. Use this in _pushdiscoveryobsmarker and _getbundleobsmarkerpart. Improve the latter further by directly using ancestors(). Performance benchmarks show notable and welcome improvement to no-op push and pull (that would also apply to other push/pull). This apply to push and pull done without evolve. ### push/pull Benchmark parameter # bin-env-vars.hg.flavor = default # benchmark.variants.explicit-rev = none # benchmark.variants.protocol = ssh # benchmark.variants.revs = none ## benchmark.name = hg.command.pull # data-env-vars.name = mercurial-devel-2024-03-22-zstd-sparse-revlog before: 5.968537 seconds after: 5.668507 seconds (-5.03%, -0.30) # data-env-vars.name = tryton-devel-2024-03-22-zstd-sparse-revlog before: 1.446232 seconds after: 0.835553 seconds (-42.23%, -0.61) # data-env-vars.name = netbsd-src-draft-2024-09-19-zstd-sparse-revlog before: 5.777412 seconds after: 2.523454 seconds (-56.32%, -3.25) ## benchmark.name = hg.command.push # data-env-vars.name = mercurial-devel-2024-03-22-zstd-sparse-revlog before: 6.155501 seconds after: 5.885072 seconds (-4.39%, -0.27) # data-env-vars.name = tryton-devel-2024-03-22-zstd-sparse-revlog before: 1.491054 seconds after: 0.934882 seconds (-37.30%, -0.56) # data-env-vars.name = netbsd-src-draft-2024-09-19-zstd-sparse-revlog before: 5.902494 seconds after: 2.957644 seconds (-49.89%, -2.94) There is not notable different in these result using the "rust" flavor instead of the "default". The performance impact on the same operation when using evolve were also tested and no impact was noted.

File last commit:

r52756:f4733654 default
r52789:8583d138 default
Show More
docket.py
71 lines | 2.3 KiB | text/x-python | PythonLexer
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474 # dirstatedocket.py - docket file for dirstate-v2
#
# Copyright Mercurial Contributors
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
Matt Harbison
typing: add `from __future__ import annotations` to most files...
r52756 from __future__ import annotations
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474
import struct
from ..revlogutils import docket as docket_mod
Simon Sapin
dirstate-v2: initial Python parser...
r49035 from . import v2
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474
V2_FORMAT_MARKER = b"dirstate-v2\n"
# * 12 bytes: format marker
# * 32 bytes: node ID of the working directory's first parent
# * 32 bytes: node ID of the working directory's second parent
Simon Sapin
dirstate-v2: Move data file info in the docket closer together...
r48977 # * {TREE_METADATA_SIZE} bytes: tree metadata, parsed separately
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474 # * 4 bytes: big-endian used size of the data file
# * 1 byte: length of the data file's UUID
# * variable: data file's UUID
#
# Node IDs are null-padded if shorter than 32 bytes.
# A data file shorter than the specified used size is corrupted (truncated)
Simon Sapin
dirstate-v2: Move fixed-size tree metadata into the docket file...
r48482 HEADER = struct.Struct(
Simon Sapin
dirstate-v2: initial Python parser...
r49035 ">{}s32s32s{}sLB".format(len(V2_FORMAT_MARKER), v2.TREE_METADATA_SIZE)
Simon Sapin
dirstate-v2: Move fixed-size tree metadata into the docket file...
r48482 )
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474
Gregory Szorc
py3: use class X: instead of class X(object):...
r49801 class DirstateDocket:
Simon Sapin
dirstate-v2: Remove the `.d` suffix in data file names...
r48780 data_filename_pattern = b'dirstate.%s'
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474
Simon Sapin
dirstate-v2: Move fixed-size tree metadata into the docket file...
r48482 def __init__(self, parents, data_size, tree_metadata, uuid):
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474 self.parents = parents
self.data_size = data_size
Simon Sapin
dirstate-v2: Move fixed-size tree metadata into the docket file...
r48482 self.tree_metadata = tree_metadata
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474 self.uuid = uuid
@classmethod
Simon Sapin
dirstate-v2: Move fixed-size tree metadata into the docket file...
r48482 def with_new_uuid(cls, parents, data_size, tree_metadata):
return cls(parents, data_size, tree_metadata, docket_mod.make_uid())
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474
@classmethod
def parse(cls, data, nodeconstants):
if not data:
parents = (nodeconstants.nullid, nodeconstants.nullid)
Simon Sapin
dirstate-v2: Move fixed-size tree metadata into the docket file...
r48482 return cls(parents, 0, b'', None)
Simon Sapin
dirstate-v2: Move data file info in the docket closer together...
r48977 marker, p1, p2, meta, data_size, uuid_size = HEADER.unpack_from(data)
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474 if marker != V2_FORMAT_MARKER:
raise ValueError("expected dirstate-v2 marker")
uuid = data[HEADER.size : HEADER.size + uuid_size]
p1 = p1[: nodeconstants.nodelen]
p2 = p2[: nodeconstants.nodelen]
Simon Sapin
dirstate-v2: Move fixed-size tree metadata into the docket file...
r48482 return cls((p1, p2), data_size, meta, uuid)
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474
def serialize(self):
p1, p2 = self.parents
header = HEADER.pack(
Simon Sapin
dirstate-v2: Move fixed-size tree metadata into the docket file...
r48482 V2_FORMAT_MARKER,
p1,
p2,
Simon Sapin
dirstate-v2: Move data file info in the docket closer together...
r48977 self.tree_metadata,
Simon Sapin
dirstate-v2: Move fixed-size tree metadata into the docket file...
r48482 self.data_size,
len(self.uuid),
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474 )
return header + self.uuid
def data_filename(self):
return self.data_filename_pattern % self.uuid