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
. Код был написан в ночной ржавчине с альфа-библиотеками, и я подумал, что в зависимости может быть ошибка, затем я обновил свой код и переключил его на стабильную ржавчину с последним выпуском зависимостей, но проблема все еще остается.