contrib/perf.py
changeset 52705 42dd6ec73c28
parent 52704 492de5c0ecdd
child 52706 6a7b0d0f090d
--- a/contrib/perf.py	Fri Nov 29 22:21:18 2024 +0100
+++ b/contrib/perf.py	Sat Nov 30 03:25:22 2024 +0100
@@ -2182,6 +2182,12 @@
     [
         (
             b'',
+            b'in-memory-bundle',
+            False,
+            b'load the full bundle in userspace memory before proceeding',
+        ),
+        (
+            b'',
             b'unbundle-progress',
             False,
             b"compute and display progress during stream processing",
@@ -2225,7 +2231,7 @@
     if not (os.path.isfile(filename) and os.access(filename, os.R_OK)):
         raise error.Abort("not a readable file: %s" % filename)
 
-    run_variables = [None, None]
+    run_variables = [None, None, None]
 
     # we create the new repository next to the other one for two reasons:
     # - this way we use the same file system, which are relevant for benchmark
@@ -2235,20 +2241,29 @@
     @contextlib.contextmanager
     def context():
         with open(filename, mode='rb') as bundle:
+            bundle_name = bundle.name
+            if opts.get(b'in_memory_bundle'):
+                # you hate memory, don't you?
+                import io
+
+                bundle = io.BytesIO(bundle.read())
             with tempfile.TemporaryDirectory(
                 prefix=b'hg-perf-stream-consume-',
                 dir=source_repo_dir,
             ) as tmp_dir:
                 tmp_dir = fsencode(tmp_dir)
                 run_variables[0] = bundle
-                run_variables[1] = tmp_dir
+                run_variables[1] = bundle_name
+                run_variables[2] = tmp_dir
                 yield
                 run_variables[0] = None
                 run_variables[1] = None
+                run_variables[2] = None
 
     def runone():
         bundle = run_variables[0]
-        tmp_dir = run_variables[1]
+        bundle_name = run_variables[1]
+        tmp_dir = run_variables[2]
 
         # we actually wants to copy all config to ensure the repo config is
         # taken in account during the benchmark
@@ -2263,7 +2278,7 @@
         # benchmark.
         show_progress = bool(opts.get("show_progress"))
         target.ui.setconfig(b"progress", b"disable", not show_progress)
-        gen = exchange.readbundle(target.ui, bundle, bundle.name)
+        gen = exchange.readbundle(target.ui, bundle, bundle_name)
         # stream v1
         if util.safehasattr(gen, 'apply'):
             gen.apply(target)