2012-03-05 3 views
0

Netty Channel.close() иногда зависает. В нашем конкретном случае использования у нас есть пул каналов, и наши тесты проверяют устойчивость к сетевым сбоям. Итак, в наших тестах мы пытаемся закрыть один канал.Netty Channel.close() висит с перерывами

В следующем фрагменте кода мы печатаем инструкции отладки перед вызовом Channel.close(), сразу после Channel.close() и после ChannelFuture.await(). Чтобы убедиться, что поток не прерывается, мы проверяем исключение InterruptedException.

 Channel c = partitionChannelMap.get(partition); 
     if (c != null) { 
      for (int retries = 0; retries < numRetries; retries++) { 
       try { 
        logger.debug("Attempt {}: Closing channel to partition {}", retries + 1, partition); 
        logger.debug("Channel Properties - isBound() isConnected() isOpen() " + c.isBound() + " " 
          + c.isConnected() + " " + c.isOpen()); 
        ChannelFuture closeFuture = c.close(); 
        logger.debug("About to wait"); 
        closeFuture.await(nettyTimeout); 
        if (closeFuture.isSuccess()) { 
         logger.debug("Attempt {}: CLOSED channel to partition {}", retries + 1, partition); 
         partitionChannelMap.remove(partition); 
         break; 
        } else { 
         logger.error("Attempt {}: FAILED to close partition {}", retries + 1, partition); 
         continue; 
        } 
       } catch (InterruptedException e) { 
        logger.error("Attempt {}: FAILED to close partition {}", retries + 1, partition); 
        e.printStackTrace(); 
        continue; 
       } 
      } 
     } 
    } 

В некоторых опытах (ошибочные из них), операторы отладки перед Channel.close() выполняются, в то время как сразу после этого не делают. Поскольку Channel.close() является асинхронным, мы ожидаем его немедленного возврата. В этих случаях выполнение зависает после вызова Channel.close().

Я предполагаю или что-то не так здесь?

Пример вывода для ошибочного исполнения -

15:12:32.497 [Thread-7] DEBUG org.apache.s4.comm.tcp.TCPEmitter - Attempt 1: Closing channel to partition 0 
15:12:32.497 [Thread-7] DEBUG org.apache.s4.comm.tcp.TCPEmitter - Channel Properties - isBound() isConnected() isOpen() true true true 

Я был бы очень признателен за любую помощь по этому вопросу.

Thanks

ответ

0

Проблема заключается в моем коде.

Я вызываю Channel.close() в синхронизированном блоке. Функция close() препятствует одновременной передаче сообщений в полете и асинхронно вызывает операциюComplete() неудачных передач. Так получилось, что обработчик operationComplete() также пытается закрыть тот же канал, что приводит к тупиковой ситуации.

Смежные вопросы