[PATCH 1 of 2 V2] peer: introduce a limitedarguments attributes

Pierre-Yves David pierre-yves.david at ens-lyon.org
Wed Apr 17 13:07:00 EDT 2019

# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at octobus.net>
# Date 1555516590 -7200
#      Wed Apr 17 17:56:30 2019 +0200
# Node ID 6882a0101d389e27d697bf2e9717de176f273309
# Parent  607a0de9bae31df526da75b68ab2853787d8c31e
# EXP-Topic discovery-speedup
# Available At https://bitbucket.org/octobus/mercurial-devel/
#              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 6882a0101d38
peer: introduce a limitedarguments attributes

When set to True, it signal that the peer cannot receive too larges arguments
and that algorithm must adapt. This should only be True for http peer that does
not support argument passed as "post".

This will be useful to unlock better discovery performance in the next

I am using a dedicated argument because this is not really a usual
"capabilities" things. An alternative approach would be to adds a
"large-arguments" to all peer, but the http peers. That seemed a bit too hacky
to me.

diff --git a/mercurial/httppeer.py b/mercurial/httppeer.py
--- a/mercurial/httppeer.py
+++ b/mercurial/httppeer.py
@@ -382,6 +382,7 @@ class httppeer(wireprotov1peer.wirepeer)
         self._path = path
         self._url = url
         self._caps = caps
+        self.limitedarguments = caps is not None and 'httppostargs' not in caps
         self._urlopener = opener
         self._requestbuilder = requestbuilder
@@ -750,6 +751,9 @@ class httpv2executor(object):
 class httpv2peer(object):
+    limitedarguments = False
     def __init__(self, ui, repourl, apipath, opener, requestbuilder,
         self.ui = ui
diff --git a/mercurial/repository.py b/mercurial/repository.py
--- a/mercurial/repository.py
+++ b/mercurial/repository.py
@@ -291,6 +291,10 @@ class ipeercommandexecutor(interfaceutil
 class ipeerrequests(interfaceutil.Interface):
     """Interface for executing commands on a peer."""
+    limitedarguments = interfaceutil.Attribute(
+        """True if the peer cannot receive large argument value for commands."""
+    )
     def commandexecutor():
         """A context manager that resolves to an ipeercommandexecutor.
@@ -329,6 +333,8 @@ class ipeerv2(ipeerconnection, ipeercapa
 class peer(object):
     """Base class for peer repositories."""
+    limitedarguments = False
     def capable(self, name):
         caps = self.capabilities()
         if name in caps:

More information about the Mercurial-devel mailing list