From c0201f722bba6c424dc840f9f8edfc5c37ab9b7b Mon Sep 17 00:00:00 2001 From: Marius Thesing Date: Sat, 29 Mar 2025 11:43:26 +0100 Subject: [PATCH] lock SendData to fix random connection failures --- src/Renci.SshNet/Channels/Channel.cs | 24 +++++++++++-------- .../SftpClientTest.Upload.cs | 5 ---- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/Renci.SshNet/Channels/Channel.cs b/src/Renci.SshNet/Channels/Channel.cs index 4c3569cef..d009c3370 100644 --- a/src/Renci.SshNet/Channels/Channel.cs +++ b/src/Renci.SshNet/Channels/Channel.cs @@ -17,6 +17,7 @@ internal abstract class Channel : IChannel { private readonly Lock _serverWindowSizeLock = new Lock(); private readonly Lock _messagingLock = new Lock(); + private readonly Lock _sendDataLock = new Lock(); private readonly uint _initialWindowSize; private readonly ISession _session; private readonly ILogger _logger; @@ -340,19 +341,22 @@ public void SendData(byte[] data, int offset, int size) return; } - var totalBytesToSend = size; - while (totalBytesToSend > 0) + lock (_sendDataLock) { - var sizeOfCurrentMessage = GetDataLengthThatCanBeSentInMessage(totalBytesToSend); + var totalBytesToSend = size; + while (totalBytesToSend > 0) + { + var sizeOfCurrentMessage = GetDataLengthThatCanBeSentInMessage(totalBytesToSend); - var channelDataMessage = new ChannelDataMessage(RemoteChannelNumber, - data, - offset, - sizeOfCurrentMessage); - _session.SendMessage(channelDataMessage); + var channelDataMessage = new ChannelDataMessage(RemoteChannelNumber, + data, + offset, + sizeOfCurrentMessage); + _session.SendMessage(channelDataMessage); - totalBytesToSend -= sizeOfCurrentMessage; - offset += sizeOfCurrentMessage; + totalBytesToSend -= sizeOfCurrentMessage; + offset += sizeOfCurrentMessage; + } } } diff --git a/test/Renci.SshNet.IntegrationTests/OldIntegrationTests/SftpClientTest.Upload.cs b/test/Renci.SshNet.IntegrationTests/OldIntegrationTests/SftpClientTest.Upload.cs index c48c53211..e5cd91400 100644 --- a/test/Renci.SshNet.IntegrationTests/OldIntegrationTests/SftpClientTest.Upload.cs +++ b/test/Renci.SshNet.IntegrationTests/OldIntegrationTests/SftpClientTest.Upload.cs @@ -77,11 +77,6 @@ public void Test_Sftp_Upload_Forbidden() [TestCategory("Sftp")] public void Test_Sftp_Multiple_Async_Upload_And_Download_10Files_5MB_Each() { - if (Environment.GetEnvironmentVariable("CI") == "true") - { - Assert.Inconclusive("Skipping because of failures in CI, see #1253"); - } - var maxFiles = 10; var maxSize = 5;