Skip to content
Snippets Groups Projects
Commit 814a6c84 authored by Pierre-Yves David's avatar Pierre-Yves David
Browse files

from_disk: only build a model object once

Before this change, a Directory object was built to compute the `id` of
we fed to the Directory object we built for `to_model`.

We tested this change on simple information of the Mercurial loader,
with a noop-loader stockage:

    swh loader run mercurial https://foss.heptapod.net/mercurial/mercurial-devel directory=/data/repos/mercurial-devel

= Median time of 3 run =
before: 17 minutes 48 seconds
after:  12 minutes 59 seconds

On a profile of the same run, the `to_model` call of the from_disk's `Directory` class took the following percentage:
before: 43%
after:  24%
parent 9ce6feb9
No related branches found
No related tags found
No related merge requests found
Daniele Serafini
Ishan Bhanuka
Antoine Cezar
Pierre-Yves David
......@@ -401,7 +401,7 @@ class Directory(MerkleNode):
for instance when the client is applying diffs.
"""
__slots__ = ["__entries"]
__slots__ = ["__entries", "__model_object"]
object_type: Final = "directory"
@classmethod
......@@ -447,9 +447,11 @@ class Directory(MerkleNode):
def __init__(self, data=None):
super().__init__(data=data)
self.__entries = None
self.__model_object = None
def invalidate_hash(self):
self.__entries = None
self.__model_object = None
super().invalidate_hash()
@staticmethod
......@@ -497,12 +499,14 @@ class Directory(MerkleNode):
return CoreSWHID(object_type=ObjectType.DIRECTORY, object_id=self.hash)
def compute_hash(self):
return model.Directory.from_dict({"entries": self.entries}).id
return self.to_model().id
def to_model(self) -> model.Directory:
"""Builds a `model.Directory` object based on this node;
ignoring its children."""
return model.Directory.from_dict(self.get_data())
if self.__model_object is None:
self.__model_object = model.Directory.from_dict({"entries": self.entries})
return self.__model_object
def __getitem__(self, key):
if not isinstance(key, bytes):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment