@Override public Object attempt(Connection cnx) throws Exception { this.failed = true; this.timedOut = false; long start = startAttempt(cnx.getStats()); try { try { attemptSend(cnx); this.failed = false; } finally { endSendAttempt(cnx.getStats(), start); } this.failed = true; try { Object result = attemptReadResponse(cnx); this.failed = false; return result; } catch (SocketTimeoutException ste) { this.failed = false; this.timedOut = true; throw ste; } } finally { endAttempt(cnx.getStats(), start); } }