diff mercurial/httppeer.py @ 35698:0c4b23ccf1a5

httppeer: add support for tracing all http request made by the peer This changeset introduces a new 'devel.debug.peer-request' config. When set to True, debug message about request made by peer will be issued. This help to understand what actually happens during an exchange and tracks source of performance loss. This changeset implement support for http peer only.
author Boris Feld <boris.feld@octobus.net>
date Fri, 12 Jan 2018 10:41:03 +0000
parents 5a7906ed78d4
children 197d10e157ce
line wrap: on
line diff
--- a/mercurial/httppeer.py	Fri Jan 12 10:14:20 2018 +0000
+++ b/mercurial/httppeer.py	Fri Jan 12 10:41:03 2018 +0000
@@ -162,7 +162,39 @@
                 getattr(h, "close_all", lambda: None)()
 
     def _openurl(self, req):
-        return self._urlopener.open(req)
+        if (self._ui.debugflag
+            and self._ui.configbool('devel', 'debug.peer-request')):
+            dbg = self._ui.debug
+            line = 'devel-peer-request: %s\n'
+            dbg(line % '%s %s' % (req.get_method(), req.get_full_url()))
+            hgargssize = None
+
+            for header, value in sorted(req.header_items()):
+                if header.startswith('X-hgarg-'):
+                    if hgargssize is None:
+                        hgargssize = 0
+                    hgargssize += len(value)
+                else:
+                    dbg(line % '  %s %s' % (header, value))
+
+            if hgargssize is not None:
+                dbg(line % '  %d bytes of commands arguments in headers'
+                    % hgargssize)
+
+            if req.has_data():
+                data = req.get_data()
+                length = getattr(data, 'length', None)
+                if length is None:
+                    length = len(data)
+                dbg(line % '  %d bytes of data' % length)
+
+            start = util.timer()
+
+        ret = self._urlopener.open(req)
+        if self._ui.configbool('devel', 'debug.peer-request'):
+            dbg(line % '  finished in %.4f seconds (%s)'
+                % (util.timer() - start, ret.code))
+        return ret
 
     # Begin of _basepeer interface.