Patchwork D2001: httppeer: remove support for connecting to <0.9.1 servers (BC)

login
register
mail settings
Submitter phabricator
Date Feb. 2, 2018, 7:03 a.m.
Message ID <differential-rev-PHID-DREV-b5jh4qy7p6tygu47wizk-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/27213/
State Superseded
Headers show

Comments

phabricator - Feb. 2, 2018, 7:03 a.m.
indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  Previously, HTTP wire protocol clients would attempt a
  "capabilities" wire protocol command. If that failed, they would
  fall back to issuing a "between" command.
  
  The "capabilities" command was added in Mercurial 0.9.1 (released
  July 2006). The "between" command has been present for as long as
  the wire protocol has existed. So if the "between" command failed,
  it was safe to assume that the remote could not speak any version
  of the Mercurial wire protocol.
  
  The "between" fallback was added in https://phab.mercurial-scm.org/rHG395a84f78736aa1912d16ae2138e7d5596bdaa42 in 2011. Before that
  changeset, Mercurial would *always* issue the "between" command and
  would issue "capabilities" if capabilities were requested. At that time,
  many connections would issue "capabilities" eventually, so it was
  decided to issue "capabilities" by default and fall back to "between"
  if that failed. This saved a round trip when connecting to modern
  servers while still preserving compatibility with legacy servers.
  
  Fast forward ~7 years. Mercurial servers supporting "capabilities"
  have been around for over a decade. If modern clients are
  connecting to <0.9.1 servers, they are getting a bad experience.
  They may even be getting bad data (an old server is vulnerable to
  numerous security issues and could have been p0wned, leading to a
  Mercurial repository serving backdoors or other badness).
  
  In addition, the fallback can harm experience for modern servers.
  If a client experiences an intermittent HTTP request failure (due to
  bad network, etc) and falls back to a "between" that works, it would
  assume an empty capability set and would attempt to communicate with
  the repository using a very ancient wire protocol. Auditing HTTP logs
  for hg.mozilla.org, I did find a handful of requests for the
  null range of the "between" command. However, requests can be days
  apart. And when I do see requests, they come in batches. Those
  batches seem to correlate to spikes of HTTP 500 or other
  server/network events. So I think these requests are fallbacks from
  failed "capabilities" requests and not from old clients.
  
  If you need even more evidence to discontinue support, apparently
  we have no test coverage for communicating with servers not
  supporting "capabilities." I know this because all tests pass
  with the "between" fallback removed.
  
  Finally, server-side support for <0.9.1 pushing (the "addchangegroup"
  wire protocol command along with locking-related commands) was dropped
  from the HTTP client in https://phab.mercurial-scm.org/rHGfda0867cfe03ebf457c12b7e0ff1b174aeb67759 in 2017 and the SSH client in
  https://phab.mercurial-scm.org/rHG9f6e0e7ef82884e3ec66455dac7312820c2b35ce in 2015.
  
  I think this all adds up to enough justification for removing client
  support for communicating with servers not supporting "capabilities."
  So this commit removes that fallback.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D2001

AFFECTED FILES
  mercurial/httppeer.py

CHANGE DETAILS




To: indygreg, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/mercurial/httppeer.py b/mercurial/httppeer.py
--- a/mercurial/httppeer.py
+++ b/mercurial/httppeer.py
@@ -491,13 +491,9 @@ 
             inst = httpspeer(ui, path)
         else:
             inst = httppeer(ui, path)
-        try:
-            # Try to do useful work when checking compatibility.
-            # Usually saves a roundtrip since we want the caps anyway.
-            inst._fetchcaps()
-        except error.RepoError:
-            # No luck, try older compatibility check.
-            inst.between([(nullid, nullid)])
+
+        inst._fetchcaps()
+
         return inst
     except error.RepoError as httpexception:
         try: