docs: @Override
      @FFDCIgnore(IOException.class)
      public void complete(VirtualConnection vc, TCPReadRequestContext rsc) {
  
          if(vc == null){
              return;
          }
          synchronized(_srtUpgradeStream){
              if(_upgradeStream.isClosing()){
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "The upgradedStream is closing, won't notify user of data");
                  }
                  _srtUpgradeStream.notify();
                  return;
              }
  
              //We have read our 1 byte of data. Now configure the buffer for use when the user calls read
              _upgradeStream.configurePostInitialReadBuffer();
          }
          try{
              //Set the original Context Class Loader before calling the users onDataAvailable
              //Push the original thread's context onto the current thread, also save off the current thread's context
              _contextManager.pushContextData();
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Calling user's ReadListener.onDataAvailable : " + _rl);
              }
              //Call into the user's ReadListener to indicate there is data available
              _rl.onDataAvailable();
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "User's ReadListener.onDataAvailable complete, reading for more data : " + _rl);
              }
          } catch(Throwable onDataAvailableException) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "ReadListener.onDataAvailable threw an exception : " + onDataAvailableException + ", " + _rl);
              }
              //Call directly into the customers ReadListener.onError
              _rl.onError(onDataAvailableException);
          } finally {
              //Revert back to the thread's current context
              _contextManager.popContextData();
  
              synchronized(_srtUpgradeStream){
                  if(!_upgradeStream.isClosing()){
                      _upgradeStream.initialRead();
                  } else {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "The upgradedStream is closing, won't issue the initial read");
                      }
                      _srtUpgradeStream.notify();
                  }
              }
          }
      }