httppeer: remove support for connecting to <0.9.1 servers (BC)
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
395a84f78736 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
fda0867cfe03 in 2017 and the SSH client in
9f6e0e7ef828 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.
Differential Revision: https://phab.mercurial-scm.org/D2001
--- a/mercurial/httppeer.py Thu Feb 01 21:55:06 2018 -0800
+++ b/mercurial/httppeer.py Fri Feb 02 13:13:46 2018 -0800
@@ -16,7 +16,6 @@
import tempfile
from .i18n import _
-from .node import nullid
from . import (
bundle2,
error,
@@ -491,13 +490,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: