docs: Session getReadSession() throws SpannerException {
      Span span = Tracing.getTracer().getCurrentSpan();
      span.addAnnotation("Acquiring session");
      Waiter waiter = null;
      PooledSession sess = null;
      synchronized (lock) {
        if (closureFuture != null) {
          span.addAnnotation("Pool has been closed");
          throw new IllegalStateException("Pool has been closed");
        }
        sess = readSessions.poll();
        if (sess == null) {
          sess = writePreparedSessions.poll();
          if (sess == null) {
            span.addAnnotation("No session available");
            maybeCreateSession();
            waiter = new Waiter();
            readWaiters.add(waiter);
          } else {
            span.addAnnotation("Acquired read write session");
          }
        } else {
          span.addAnnotation("Acquired read only session");
        }
      }
      if (waiter != null) {
        logger.log(
            Level.FINE,
            "No session available in the pool. Blocking for one to become available/created");
        span.addAnnotation("Waiting for read only session to be available");
        sess = waiter.take();
      }
      sess.markBusy();
      incrementNumSessionsInUse();
      span.addAnnotation(sessionAnnotation(sess));
      return sess;
    }