usage: add configuration option to adjust resources usage
authorPierre-Yves David <pierre-yves.david@octobus.net>
Mon, 09 Oct 2023 15:12:16 +0200
changeset 51283 83c6dceeb10d
parent 51282 d737bc8a36c9
child 51284 58d39c7865e5
usage: add configuration option to adjust resources usage They currently do nothing, but this open the way to actually use them.
mercurial/configitems.toml
mercurial/helptext/config.txt
mercurial/scmutil.py
--- a/mercurial/configitems.toml	Mon Oct 09 15:06:21 2023 +0200
+++ b/mercurial/configitems.toml	Mon Oct 09 15:12:16 2023 +0200
@@ -2501,6 +2501,64 @@
 """
 
 [[items]]
+section = "usage"
+name = "resources"
+default = "default"
+documentation = """How aggressive Mercurial can be with resource usage:
+
+Currently recognised values are:
+- default: the default value currently is equivalent to medium,
+- high:    allows for higher cpu, memory and disk-space usage to improve the performance of some operations.
+- medium:  aims at a moderate resource usage,
+- low:     reduces resources usage when possible, decreasing overall performance.
+
+For finer configuration, see also `usage.resources.cpu`,
+`usage.resources.disk` and `usage.resources.memory`.
+"""
+
+[[items]]
+section = "usage"
+name = "resources.cpu"
+default = "default"
+documentation = """How aggressive Mercurial can be in terms of cpu usage:
+
+Currently recognised values are:
+- default: the default value, inherits the value from `usage.resources`,
+- high:    allows for more aggressive cpu usage, improving storage quality and
+           the performance of some operations at the expense of machine load
+- medium:  aims at a moderate cpu usage,
+- low:     reduces cpu usage when possible, potentially at the expense of
+           slower operations, increased storage and exchange payload.
+
+"""
+
+[[items]]
+section = "usage"
+name = "resources.disk"
+default = "default"
+documentation = """How aggressive Mercurial can be in terms of disk usage:
+
+Currently recognised values are:
+- default: the default value, inherits the value from `usage.resources`,
+- high:    allows for more disk space usage where it can improve the performance,
+- medium:  aims at a moderate disk usage,
+- low:     reduces disk usage when possible, decreasing performance in some occasion.
+"""
+
+[[items]]
+section = "usage"
+name = "resources.memory"
+default = "default"
+documentation = """How aggressive Mercurial can be in terms of memory usage:
+
+Currently recognised values are:
+- default: the default value, inherits the value from `usage.resources`,
+- high:    allows for more aggressive memory usage to improve overall performance,
+- medium:  aims at a moderate memory usage,
+- low:     reduces memory usage when possible at the cost of overall performance.
+"""
+
+[[items]]
 section = "verify"
 name = "skipflags"
 default = 0
--- a/mercurial/helptext/config.txt	Mon Oct 09 15:06:21 2023 +0200
+++ b/mercurial/helptext/config.txt	Mon Oct 09 15:12:16 2023 +0200
@@ -3005,6 +3005,52 @@
     Currently recognised values are:
     - default: an all purpose repository
 
+``resources``
+    How aggressive Mercurial can be with resource usage:
+
+    Currently recognised values are:
+    - default: the default value currently is equivalent to medium,
+    - high:    allows for higher cpu, memory and disk-space usage to improve
+               performance of some operations.
+    - medium:  aims at a moderate resource usage,
+    - low:     reduces resources usage when possible, decreasing overall
+      performance.
+
+    For finer configuration, see also `usage.resources.cpu`,
+    `usage.resources.disk` and `usage.resources.memory`.
+
+``resources.cpu``
+    How aggressive Mercurial can be in terms of cpu usage:
+
+    Currently recognised values are:
+    - default: the default value, inherits the value from `usage.resources`,
+    - high:    allows for more aggressive cpu usage, improving storage quality and
+               the performance of some operations at the expense of machine load
+    - medium:  aims at a moderate cpu usage,
+    - low:     reduces cpu usage when possible, potentially at the expense of
+               slower operations, increased storage and exchange payload.
+
+``resources.disk``
+    How aggressive Mercurial can be in terms of disk usage:
+
+    Currently recognised values are:
+    - default: the default value, inherits the value from `usage.resources`,
+    - high:    allows for more disk space usage where it can improve performance,
+    - medium:  aims at a moderate disk usage,
+    - low:     reduces disk usage when possible, decreasing performance in some
+               occasion.
+
+``resources.memory``
+    How aggressive Mercurial can be in terms of memory usage:
+
+    Currently recognised values are:
+    - default: the default value, inherits the value from `usage.resources`,
+    - high:    allows for more aggressive memory usage to improve overall
+               performance,
+    - medium:  aims at a moderate memory usage,
+    - low:     reduces memory usage when possible at the cost of overall
+               performance.
+
 
 ``command-templates``
 ---------------------
--- a/mercurial/scmutil.py	Mon Oct 09 15:06:21 2023 +0200
+++ b/mercurial/scmutil.py	Mon Oct 09 15:12:16 2023 +0200
@@ -2325,3 +2325,34 @@
     schemes.
     """
     return userlist == [b'*'] or username in userlist
+
+
+RESOURCE_HIGH = 3
+RESOURCE_MEDIUM = 2
+RESOURCE_LOW = 1
+RESOURCE_DEFAULT = 0
+
+RESOURCE_MAPPING = {
+    b'default': RESOURCE_DEFAULT,
+    b'low': RESOURCE_LOW,
+    b'medium': RESOURCE_MEDIUM,
+    b'high': RESOURCE_HIGH,
+}
+
+DEFAULT_RESOURCE = RESOURCE_MEDIUM
+
+
+def get_resource_profile(ui, dimension=None):
+    """return the resource profile for a dimension
+
+    If no dimension is specified, the generic value is returned"""
+    generic_name = ui.config(b'usage', b'resources')
+    value = RESOURCE_MAPPING.get(generic_name, RESOURCE_DEFAULT)
+    if value == RESOURCE_DEFAULT:
+        value = DEFAULT_RESOURCE
+    if dimension is not None:
+        sub_name = ui.config(b'usage', b'resources.%s' % dimension)
+        sub_value = RESOURCE_MAPPING.get(sub_name, RESOURCE_DEFAULT)
+        if sub_value != RESOURCE_DEFAULT:
+            value = sub_value
+    return value