docs: public void error(VirtualConnection vc, TCPReadRequestContext rsc, IOException ioe) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "error() called: vc=" + vc + " ioe=" + ioe);
          }
  
          HttpOutboundServiceContextImpl osc = (HttpOutboundServiceContextImpl) vc.getStateMap().get(CallbackIDs.CALLBACK_HTTPOSC);
          if (osc.markReadCancelSuccess()) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Ignoring error callback on canceled read");
              }
              return;
          }
  
          int state;
          // query/set the states in one block to avoid timing windows
          synchronized (osc.stateSyncObject) {
              state = osc.getReadState();
              osc.setCallbackState(HttpOutboundServiceContextImpl.CALLBACK_STATE_ERROR, ioe);
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "Read-ahead state: " + state);
          }
          switch (state) {
              case (HttpOutboundServiceContextImpl.READ_STATE_IDLE):
                  // new connection hasn't started yet, notify app channel now
                  osc.getAppReadCallback().error(vc, ioe);
                  break;
              case (HttpOutboundServiceContextImpl.READ_STATE_TIME_RESET):
                  // new conn has been initialized but the read for response hasn't
                  // been started yet
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Received the read-ahead immed timeout.");
                  }
                  break;
              case (HttpOutboundServiceContextImpl.READ_STATE_SYNC):
                  // d264854: no longer possible
                  // a synchronous read for the response has been started already
                  osc.wakeupReadAhead();
                  break;
              case (HttpOutboundServiceContextImpl.READ_STATE_ASYNC):
                  // d264854: no longer possible
                  // an async read for the response has been started already
                  osc.setPersistent(false);
                  osc.reConnect(vc, ioe);
                  break;
              default:
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Unexpected read-ahead state: " + state);
                  }
                  break;
          }
      }