@Override
  public void onFillInterestedFailed(Throwable cause) {
    // this means that the fill interest in encrypted bytes has failed.
    // However we do not handle that here on this callback, but instead wakeup
    // the decrypted readInterest and/or writeFlusher so that they will attempt
    // to do the fill and/or flush again and these calls will do the actually
    // handle the cause.
    _decryptedEndPoint.getFillInterest().onFail(cause);

    boolean failFlusher = false;
    synchronized (_decryptedEndPoint) {
      if (_decryptedEndPoint._flushRequiresFillToProgress) {
        _decryptedEndPoint._flushRequiresFillToProgress = false;
        failFlusher = true;
      }
    }
    if (failFlusher) _decryptedEndPoint.getWriteFlusher().onFail(cause);
  }
 @Override
 public void run() {
   _decryptedEndPoint.getWriteFlusher().completeWrite();
 }