private static void processGoAwayWriteResult(
     final ChannelHandlerContext ctx,
     final int lastStreamId,
     final long errorCode,
     final ByteBuf debugData,
     ChannelFuture future) {
   try {
     if (future.isSuccess()) {
       if (errorCode != NO_ERROR.code()) {
         if (logger.isDebugEnabled()) {
           logger.debug(
               format(
                   "Sent GOAWAY: lastStreamId '%d', errorCode '%d', "
                       + "debugData '%s'. Forcing shutdown of the connection.",
                   lastStreamId, errorCode, debugData.toString(UTF_8)),
               future.cause());
         }
         ctx.close();
       }
     } else {
       if (logger.isErrorEnabled()) {
         logger.error(
             format(
                 "Sending GOAWAY failed: lastStreamId '%d', errorCode '%d', "
                     + "debugData '%s'. Forcing shutdown of the connection.",
                 lastStreamId, errorCode, debugData.toString(UTF_8)),
             future.cause());
       }
       ctx.close();
     }
   } finally {
     // We're done with the debug data now.
     debugData.release();
   }
 }
 private void reportLeak(Level level) {
   if (!logger.isErrorEnabled()) {
     for (; ; ) {
       ResourceLeakDetector<T>.DefaultResourceLeak ref =
           (DefaultResourceLeak) this.refQueue.poll();
       if (ref == null) {
         break;
       }
       ref.close();
     }
     return;
   }
   int samplingInterval = level == Level.PARANOID ? 1 : this.samplingInterval;
   if ((this.active * samplingInterval > this.maxActive)
       && (this.loggedTooManyActive.compareAndSet(false, true))) {
     logger.error(
         "LEAK: You are creating too many "
             + this.resourceType
             + " instances.  "
             + this.resourceType
             + " is a shared resource that must be reused across the JVM,"
             + "so that only a few instances are created.");
   }
   for (; ; ) {
     ResourceLeakDetector<T>.DefaultResourceLeak ref = (DefaultResourceLeak) this.refQueue.poll();
     if (ref == null) {
       break;
     }
     ref.clear();
     if (ref.close()) {
       String records = ref.toString();
       if (this.reportedLeaks.putIfAbsent(records, Boolean.TRUE) == null) {
         if (records.isEmpty()) {
           logger.error(
               "LEAK: {}.release() was not called before it's garbage-collected. Enable advanced leak reporting to find out where the leak occurred. To enable advanced leak reporting, specify the JVM option '-D{}={}' or call {}.setLevel()",
               new Object[] {
                 this.resourceType,
                 "io.netty.leakDetectionLevel",
                 Level.ADVANCED.name().toLowerCase(),
                 StringUtil.simpleClassName(this)
               });
         } else {
           logger.error(
               "LEAK: {}.release() was not called before it's garbage-collected.{}",
               this.resourceType,
               records);
         }
       }
     }
   }
 }
 public boolean isFatalEnabled() {
   return _log.isErrorEnabled();
 }