From 2bd15eca26e7944d4d99a69575932749b01ac7fc Mon Sep 17 00:00:00 2001 From: Arun Kulshreshtha Date: Fri, 28 Jun 2019 15:02:56 -0700 Subject: [PATCH] remotefilelog: move edenapi error logging into dedicated function Summary: We need to log (and in debug mode print out) Eden API exceptions in several places in the code. Let's factor out this logic into a function in the edenapi module. Reviewed By: xavierd Differential Revision: D16027147 fbshipit-source-id: 76c8e97dcaaa114e0c22448d117caae948fb60f4 --- edenscm/hgext/remotefilelog/__init__.py | 12 +----------- edenscm/hgext/remotefilelog/edenapi.py | 18 ++++++++++++++++++ .../hgext/remotefilelog/fileserverclient.py | 14 +------------- edenscm/hgext/treemanifest/__init__.py | 4 ++-- lib/edenapi/src/errors.rs | 2 +- 5 files changed, 23 insertions(+), 27 deletions(-) diff --git a/edenscm/hgext/remotefilelog/__init__.py b/edenscm/hgext/remotefilelog/__init__.py index b3a93c4219..781db89725 100644 --- a/edenscm/hgext/remotefilelog/__init__.py +++ b/edenscm/hgext/remotefilelog/__init__.py @@ -477,17 +477,7 @@ def setupclient(ui, repo): except Exception as e: ui.warn(_("failed to initialize Eden API client;")) ui.warn(_(" disabling HTTPS data fetching\n")) - - if edenapi.debug(ui): - ui.warn(_("exception: %s\n") % str(e)) - - ui.log( - "edenapi_error", - exception_msg=str(e), - exception_type=type(e).__name__, - traceback=traceback.format_exc(), - ) - + edenapi.logexception(ui, e) edenapi._disabled = True diff --git a/edenscm/hgext/remotefilelog/edenapi.py b/edenscm/hgext/remotefilelog/edenapi.py index 8806a5f99e..3a562e706a 100644 --- a/edenscm/hgext/remotefilelog/edenapi.py +++ b/edenscm/hgext/remotefilelog/edenapi.py @@ -5,6 +5,8 @@ from __future__ import absolute_import +import traceback + from edenscm.mercurial import error, httpconnection from edenscm.mercurial.i18n import _ from edenscmnative.bindings import edenapi @@ -30,6 +32,22 @@ def bailifdisabled(ui): raise error.Abort(_("HTTPS data fetching is disabled")) +def logexception(ui, exc): + """Log an exception to Mercurial's telemetry and print a user warning.""" + exctype = type(exc).__name__ + excmsg = str(exc) + + if debug(ui): + ui.warn("%s: %s\n" % (exctype, excmsg)) + + ui.log( + "edenapi_error", + exception_msg=excmsg, + exception_type=exctype, + traceback=traceback.format_exc(), + ) + + def _getbaseurl(ui): """Get the base URL of the API server.""" url = ui.config("edenapi", "url") diff --git a/edenscm/hgext/remotefilelog/fileserverclient.py b/edenscm/hgext/remotefilelog/fileserverclient.py index 6f92f315b9..beb7b6431e 100644 --- a/edenscm/hgext/remotefilelog/fileserverclient.py +++ b/edenscm/hgext/remotefilelog/fileserverclient.py @@ -704,17 +704,7 @@ class fileserverclient(object): except Exception as e: self.ui.warn(_("encountered error during HTTPS fetching;")) self.ui.warn(_(" falling back to SSH\n")) - - if edenapi.debug(self.ui): - self.ui.warn(_("exception: %s\n") % str(e)) - - self.ui.log( - "edenapi_error", - exception_msg=str(e), - exception_type=type(e).__name__, - traceback=traceback.format_exc(), - ) - + edenapi.logexception(self.ui, e) self.ui.metrics.gauge("edenapi_fallbacks", 1) rcvd = 0 @@ -1043,8 +1033,6 @@ class fileserverclient(object): assert all(store.has(p.oid()) for p in pointers) def logstacktrace(self): - import traceback - self.ui.log( "remotefilelog", "excess remotefilelog fetching:\n%s\n", diff --git a/edenscm/hgext/treemanifest/__init__.py b/edenscm/hgext/treemanifest/__init__.py index 7a80054a10..45cfea0818 100644 --- a/edenscm/hgext/treemanifest/__init__.py +++ b/edenscm/hgext/treemanifest/__init__.py @@ -536,8 +536,8 @@ def wraprepo(repo): except Exception as e: self.ui.warn(_("encountered error during HTTPS fetching;")) self.ui.warn(_(" falling back to SSH\n")) - if edenapi.debug(self.ui): - self.ui.warn(_("exception: %s\n") % str(e)) + edenapi.logexception(self.ui, e) + self.ui.metrics.gauge("edenapi_fallbacks", 1) start = util.timer() with self.ui.timesection("fetchingtrees"): diff --git a/lib/edenapi/src/errors.rs b/lib/edenapi/src/errors.rs index 4518f69990..1e93cdd781 100644 --- a/lib/edenapi/src/errors.rs +++ b/lib/edenapi/src/errors.rs @@ -125,7 +125,7 @@ pub enum ApiErrorKind { BadResponse, #[fail(display = "libcurl returned an error")] Curl, - #[fail(display = "Received HTTP status {} with response: {:?}", code, msg)] + #[fail(display = "Received HTTP status '{}' with response: {:?}", code, msg)] Http { code: StatusCode, msg: String }, #[fail(display = "Proxy server returned an error (HTTP {})", _0)] Proxy(StatusCode),