sshnet / sshnet/SSH.NET

SFTPClient hangs forever in Windows- and Linux-based Azure App Service

Abierto
#736 0 comentarios 4 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
C#
Estrellas
4.4k
Forks
993
Merge medio
9 d 21 h
PR fusionados (30 d)
1

Descripción

We use an ASP.NET Core 3.1 Background Service to watch and import files from an Sftp Server.

We encountered two issues:

  • ListDirectoryAsync hangs forever (SSH.NET 2016.1.0)
  • Connect hangs forever (SSH.NET 2020.0.0-beta1)
    • After running it for about 2 days successfully)

I created a little repro application were calls to ListDirectoryAsync and Connect are involved.

public class BackgroundWorker : BackgroundService
{
    private readonly ILogger<BackgroundWorker> _logger;

    public BackgroundWorker(ILogger<BackgroundWorker> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        do
        {
            var host = "";
            var username = "";
            var password = "";
            var uri = new Uri(host);
            var path = "FI/Sample";
            var parsedHost = uri.Host;

            _logger.LogInformation($"{DateTime.Now} - Creating new client ...");
            var parsedPort = uri.Port;
            var connectionInfo = new PasswordConnectionInfo(parsedHost, parsedPort, username, password)
            {
                Timeout = TimeSpan.FromSeconds(120),
            };

            var client = new SftpClient(connectionInfo);

            _logger.LogInformation($"{DateTime.Now} - Client created.");

            client.OperationTimeout = TimeSpan.FromMinutes(3);
            _logger.LogInformation($"{DateTime.Now} - Connecting ...");
            client.Connect();
            _logger.LogInformation($"{DateTime.Now} - Connected");

            var stopwatch = new Stopwatch();
            stopwatch.Start();
            _logger.LogInformation($"{DateTime.Now} - ListDirectoryAsync ...");
            var immutableArray = (await client.ListDirectoryAsync(path))
                .Where(x => x.IsRegularFile)
                .Select(x => new { x.Name, x.LastWriteTimeUtc })
                .ToImmutableArray();

            _logger.LogInformation($"{DateTime.Now} - Done({immutableArray.Length}) {stopwatch.ElapsedMilliseconds}ms");

            _logger.LogInformation($"{DateTime.Now} - Disposing ...");
            client.Dispose();
            connectionInfo.Dispose();
            _logger.LogInformation($"{DateTime.Now} - Disposed.");
            await Task.Delay(1000);

        } while (true);
    }
}

Further findings:

  • We could see that both Linux and Windows-based App Services hung at the same time. So it seems that the Sftp Server might have had an issue at that time. Nevertheless SSH.NET should handle this with a timeout.
  • We could also see that if we increase our polling interval hanging process were less frequent.

If you need more information, let me know.

Update:
Seems like https://github.com/sshnet/SSH.NET/blob/cefdc203d98cd890815e029bc759bc43ec5a9643/src/Renci.SshNet/Session.cs#L1945 is the problem.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con el BackgroundWorker de reproducción mostrado en el issue e inspecciona Session.cs alrededor de la línea enlazada 1945, centrándote en las rutas Connect y ListDirectoryAsync. Reproduce el bloqueo de Azure App Service o un servidor SFTP no disponible y verifica después que la operación afectada respeta el timeout configurado en lugar de quedarse bloqueada indefinidamente.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
csharp
Área
networking
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.