Netty Channel.close () периодически зависает - PullRequest
0 голосов
/ 06 марта 2012

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

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

Спасибо

1 Ответ

0 голосов
/ 07 марта 2012

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

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

...