code: private Object doOp(Op op) throws TimeoutException {
          try {
              if (op.txn != null)
                  op.txn.add(op);
              Object result = runOp(op);
              if (result == PENDING)
                  return op.getResult(timeout, TimeUnit.MILLISECONDS);
              else if (result == null && op.isCancelled())
                  throw new CancellationException();
              else
                  return result;
          } catch (java.util.concurrent.TimeoutException e) {
              throw new TimeoutException(e);
          } catch (InterruptedException e) {
              return null;
          } catch (ExecutionException e) {
              Throwable ex = e.getCause();
              if (ex instanceof TimeoutException)
                  throw (TimeoutException) ex;
              Throwables.propagateIfPossible(ex);
              throw Throwables.propagate(ex);
          }
      }
docs: This one blocks!
  
  @param op
  @return