diff --git a/build/Version.props b/build/Version.props
index dc59a0b959f..f6e5331f590 100644
--- a/build/Version.props
+++ b/build/Version.props
@@ -3,7 +3,7 @@
- 6.11.1
+ 6.11.2
5.3.0
10.10.0
0.2.0
diff --git a/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs b/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs
index 86ae2c28ca8..93e1a0b9193 100644
--- a/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs
+++ b/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs
@@ -463,6 +463,8 @@ await ValueTaskExtensions.WhenAll(entries.Select(async file =
await EnsureDirectories(cancellationToken);
var path = ValidateConfigRelativePath(configurationRelativePath);
+ logger.LogTrace("Starting write to {path}", path);
+
ConfigurationFileResponse? result = null;
void WriteImpl()
@@ -476,14 +478,21 @@ async Task UploadHandler()
await using (fileTicket)
{
var fileHash = previousHash;
+ logger.LogTrace("Write to {path} waiting for upload stream", path);
var uploadStream = await fileTicket.GetResult(uploadCancellationToken);
if (uploadStream == null)
+ {
+ logger.LogTrace("Write to {path} expired", path);
return; // expired
+ }
+ logger.LogTrace("Write to {path} received stream of length {length}...", path, uploadStream.Length);
bool success = false;
void WriteCallback()
{
+ logger.LogTrace("Running synchronous write...");
success = synchronousIOManager.WriteFileChecked(path, uploadStream, ref fileHash, cancellationToken);
+ logger.LogTrace("Finished write {un}successfully!", success ? String.Empty : "un");
}
if (fileTicket == null)
diff --git a/src/Tgstation.Server.Host/IO/SynchronousIOManager.cs b/src/Tgstation.Server.Host/IO/SynchronousIOManager.cs
index 4dbf3d833bf..cfa8707209a 100644
--- a/src/Tgstation.Server.Host/IO/SynchronousIOManager.cs
+++ b/src/Tgstation.Server.Host/IO/SynchronousIOManager.cs
@@ -6,11 +6,27 @@
using System.Security.Cryptography;
using System.Threading;
+using Microsoft.Extensions.Logging;
+
namespace Tgstation.Server.Host.IO
{
///
sealed class SynchronousIOManager : ISynchronousIOManager
{
+ ///
+ /// The for the
+ ///
+ readonly ILogger logger;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The value of .
+ public SynchronousIOManager(ILogger logger)
+ {
+ this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
+ }
+
///
public bool CreateDirectory(string path, CancellationToken cancellationToken)
{
@@ -85,13 +101,18 @@ public bool WriteFileChecked(string path, Stream data, ref string? sha1InOut, Ca
cancellationToken.ThrowIfCancellationRequested();
+ logger.LogTrace("Starting checked write to {path} ({fileType} file)", path, newFile ? "New" : "Pre-existing");
+
using (var file = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
{
cancellationToken.ThrowIfCancellationRequested();
// no sha1? no write
if (file.Length != 0 && sha1InOut == null)
+ {
+ logger.LogDebug("Aborting checked write due to missing SHA!");
return false;
+ }
// suppressed due to only using for consistency checks
using (var sha1 = SHA1.Create())
@@ -109,6 +130,10 @@ public bool WriteFileChecked(string path, Stream data, ref string? sha1InOut, Ca
}
var originalSha1 = GetSha1(file);
+
+ if (!newFile)
+ logger.LogTrace("Existing SHA calculated to be {sha}", originalSha1);
+
if (originalSha1 != sha1InOut && !(newFile && sha1InOut == null))
{
sha1InOut = originalSha1;
@@ -122,6 +147,7 @@ public bool WriteFileChecked(string path, Stream data, ref string? sha1InOut, Ca
if (data.Length != 0)
{
+ logger.LogDebug("Writing file of length {size}", data.Length);
file.Seek(0, SeekOrigin.Begin);
data.Seek(0, SeekOrigin.Begin);
@@ -132,7 +158,11 @@ public bool WriteFileChecked(string path, Stream data, ref string? sha1InOut, Ca
}
if (data.Length == 0)
+ {
+ logger.LogDebug("Stream is empty, deleting file");
File.Delete(path);
+ }
+
return true;
}
}