docs: @Override
  	public OperationResult<R> tryOperation(Operation<CL, R> operation) throws ConnectionException {
  	    Operation<CL, R> filteredOperation = config.getOperationFilterFactory().attachFilter(operation);
  	    
          while (true) {
              attemptCounter++;
              
              try {
                  connection = borrowConnection(filteredOperation);
                  startTime = System.currentTimeMillis();
                  OperationResult<R> result = connection.execute(filteredOperation);
                  result.setAttemptsCount(attemptCounter);
                  monitor.incOperationSuccess(getCurrentHost(), result.getLatency());
                  return result;
              }
              catch (Exception e) {
                  ConnectionException ce = (e instanceof ConnectionException) ? (ConnectionException) e
                          : new UnknownException(e);
              	try {
              		informException(ce);
                      monitor.incFailover(ce.getHost(), ce);
              	}
              	catch (ConnectionException ex) {
                      monitor.incOperationFailure(getCurrentHost(), ex);
                      throw ex;
              	}
              }
              finally {
              	releaseConnection();
              }
          }
      }