store: directly pass the filesize in the `details` of revlog
The dictionary only contains 1 (or 0) entries, we can directly store that
information (or None).
Moving to a simpler argument passing result in a noticable speedup (because
Python)
The number below use `hg perf::stream-locked-section` to measure the time spend
in the locked section of the streaming clone. Number are run on various
repository.
### mercurial-2018-08-01-zstd-sparse-revlog
before: 0.031247 seconds
after: 0.030246 seconds (-3.20%)
### mozilla-central-2018-08-01-zstd-sparse-revlog
before: 6.718968 seconds
after: 6.304179 seconds (-6.17%)
### mozilla-try-2019-02-18-zstd-sparse-revlog
before: 14.631343 seconds
after: 14.142687 seconds (-3.34%)
### netbeans-2018-08-01-zstd-sparse-revlog
before: 2.895584 seconds
after: 2.719939 seconds (-6.07%)
### pypy-2018-08-01-zstd-sparse-revlog
before: 0.561843 seconds
after: 0.543034 seconds (-3.35%)
--- a/mercurial/store.py Tue May 30 16:35:10 2023 +0100
+++ b/mercurial/store.py Tue May 30 16:38:13 2023 +0100
@@ -607,14 +607,13 @@
self._files = []
for ext in sorted(self._details, key=_ext_key):
path = self._path_prefix + ext
- data = self._details[ext]
+ file_size = self._details[ext]
# files that are "volatile" and might change between
# listing and streaming
#
# note: the ".nd" file are nodemap data and won't "change"
# but they might be deleted.
volatile = ext.endswith(REVLOG_FILES_VOLATILE_EXT)
- file_size = data.get('file_size')
f = StoreFile(path, file_size, volatile)
self._files.append(f)
return self._files
@@ -802,10 +801,8 @@
if strip_filename and b'/' in revlog:
revlog_target_id = revlog_target_id.rsplit(b'/', 1)[0]
revlog_target_id += b'/'
- for ext, (t, s) in sorted(details.items()):
- file_details[ext] = {
- 'file_size': s,
- }
+ for ext, (t, size) in sorted(details.items()):
+ file_details[ext] = size
yield RevlogStoreEntry(
path_prefix=revlog,
revlog_type=rl_type,
@@ -857,10 +854,8 @@
for data, revlog_type in top_rl:
for revlog, details in sorted(data.items()):
file_details = {}
- for ext, (t, s) in details.items():
- file_details[ext] = {
- 'file_size': s,
- }
+ for ext, (t, size) in details.items():
+ file_details[ext] = size
yield RevlogStoreEntry(
path_prefix=revlog,
revlog_type=revlog_type,
@@ -1160,8 +1155,8 @@
else:
# unreachable
assert False, revlog
- for ext, t in details.items():
- file_details[ext] = {}
+ for ext in details:
+ file_details[ext] = None
entry = RevlogStoreEntry(
path_prefix=revlog,
revlog_type=rl_type,