comparison contrib/perf.py @ 50671:b10c786b0145

perf: add a function to find a stream version generator The logic is clearer and can be reused for other commands in the future.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 06 Jun 2023 01:43:48 +0200
parents 714b63a707b7
children 3ce370a00225
comparison
equal deleted inserted replaced
50670:5d84b1385f7f 50671:b10c786b0145
1898 1898
1899 timer(d) 1899 timer(d)
1900 fm.end() 1900 fm.end()
1901 1901
1902 1902
1903 def _find_stream_generator(version):
1904 """find the proper generator function for this stream version"""
1905 import mercurial.streamclone
1906
1907 available = {}
1908
1909 # try to fetch a v1 generator
1910 generatev1 = getattr(mercurial.streamclone, "generatev1", None)
1911 if generatev1 is not None:
1912
1913 def generate(repo):
1914 entries, bytes, data = generatev2(repo, None, None, True)
1915 return data
1916
1917 available[b'v1'] = generatev1
1918 # try to fetch a v2 generator
1919 generatev2 = getattr(mercurial.streamclone, "generatev2", None)
1920 if generatev2 is not None:
1921
1922 def generate(repo):
1923 entries, bytes, data = generatev2(repo, None, None, True)
1924 return data
1925
1926 available[b'v2'] = generate
1927 # resolve the request
1928 if version == b"latest":
1929 latest_key = max(available)
1930 return available[latest_key]
1931 elif version in available:
1932 return available[version]
1933 else:
1934 msg = b"unkown or unavailable version: %s"
1935 msg %= version
1936 hint = b"available versions: %s"
1937 hint %= b', '.join(sorted(available))
1938 raise error.Abort(msg, hint=hint)
1939
1940
1903 @command( 1941 @command(
1904 b'perf::stream-locked-section', 1942 b'perf::stream-locked-section',
1905 [ 1943 [
1906 ( 1944 (
1907 b'', 1945 b'',
1912 ] 1950 ]
1913 + formatteropts, 1951 + formatteropts,
1914 ) 1952 )
1915 def perf_stream_clone_scan(ui, repo, stream_version, **opts): 1953 def perf_stream_clone_scan(ui, repo, stream_version, **opts):
1916 """benchmark the initial, repo-locked, section of a stream-clone""" 1954 """benchmark the initial, repo-locked, section of a stream-clone"""
1917 import mercurial.streamclone
1918
1919 generatev1 = mercurial.streamclone.generatev1
1920 generatev2 = mercurial.streamclone.generatev2
1921 1955
1922 opts = _byteskwargs(opts) 1956 opts = _byteskwargs(opts)
1923 timer, fm = gettimer(ui, opts) 1957 timer, fm = gettimer(ui, opts)
1924 1958
1925 # deletion of the generator may trigger some cleanup that we do not want to 1959 # deletion of the generator may trigger some cleanup that we do not want to
1927 result_holder = [None] 1961 result_holder = [None]
1928 1962
1929 def setupone(): 1963 def setupone():
1930 result_holder[0] = None 1964 result_holder[0] = None
1931 1965
1932 def runone_v1(): 1966 generate = _find_stream_generator(stream_version)
1967
1968 def runone():
1933 # the lock is held for the duration the initialisation 1969 # the lock is held for the duration the initialisation
1934 result_holder[0] = generatev1(repo) 1970 result_holder[0] = generate(repo)
1935
1936 def runone_v2():
1937 # the lock is held for the duration the initialisation
1938 result_holder[0] = generatev2(repo, None, None, True)
1939
1940 if stream_version == b'latest':
1941 runone = runone_v2
1942 elif stream_version == b'v2':
1943 runone = runone_v2
1944 elif stream_version == b'v1':
1945 runone = runone_v1
1946 else:
1947 msg = b'unknown stream version: "%s"' % stream_version
1948 raise error.Abort(msg)
1949 1971
1950 timer(runone, setup=setupone, title=b"load") 1972 timer(runone, setup=setupone, title=b"load")
1951 fm.end() 1973 fm.end()
1952 1974
1953 1975