TcpListener застрял в accept (), даже если клиент считает, что соединение уже установлено - PullRequest
0 голосов
/ 21 февраля 2020
let addr: SocketAddr = self.listen_bind.parse().unwrap();
let mut listener = TcpListener::bind(&addr).await?;
info!("Nightfort listening on {}", addr);
loop {
    info!("debug1");
    match listener.accept().await {
        Ok((stream, addr)) => {
            info!("debug2");
            let watcher = self.watcher.clone();
            info!("debug3");
            tokio::spawn(async move {
                info!("debug4");
                if let Err(e) = Nightfort::process(watcher, stream, addr).await {
                    error!("Error on this ranger: {}, error: {:?}", addr, e);
                }
            });
        }
        Err(e) => error!("Socket conn error {}", e),
    }
    // let (stream, addr) = listener.accept().await?;
}

Я потратил два дня на устранение этой странной проблемы. Процесс с ржавчиной может очень хорошо работать на моих локальных макросах, linux, docker на linux, но не может работать на aws linux или k8s на aws. Основные проблемы, которые я обнаружил: процесс зависает на accept(), даже если клиент считает, что установил соединение с сервером и начал отправлять ему сообщения. ps показывает, что процесс сервера находится в состоянии S. Код был написан в ночной ржавчине с альфа-библиотеками, и я подумал, что в зависимости может быть ошибка, затем я обновил свой код и переключил его на стабильную ржавчину с последним выпуском зависимостей, но проблема все еще остается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...