From 9c4483c5889295ff23c54ea19a85fbae375f5be7 Mon Sep 17 00:00:00 2001 From: niekvanderreest Date: Wed, 9 Nov 2022 10:53:27 +0100 Subject: [PATCH 1/2] Fix for Issue: 13354 https://github.com/umbraco/Umbraco-CMS/issues/13354 --- .../Persistence/UmbracoDatabase.cs | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs index 80970ec63770..67e878e60839 100644 --- a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs @@ -92,6 +92,43 @@ private void Init() { Mappers.AddRange(_mapperCollection); } + + InitCommandTimeout(); + } + + // https://github.com/umbraco/Umbraco-CMS/issues/13354 + // This sets the Database Command to connectionString Connection Timeout / Connect Timeout + // This could be better, ideally the UmbracoDatabaseFactory.CreateDatabase() function would set this based on a setting (global or connectionstring setting) + private void InitCommandTimeout() + { + if (this.Connection != null && this.Connection.ConnectionTimeout > 0) + { + this.CommandTimeout = this.Connection.ConnectionTimeout; + } + else // get from _connectionString + { + var connectionParser = new DbConnectionStringBuilder + { + ConnectionString = ConnectionString + }; + + if (connectionParser.ContainsKey("connection timeout")) + { + if (int.TryParse(connectionParser["connection timeout"].ToString(), out int connectionTimeout)) + { + _logger.LogInformation($"Setting Command Timeout to value configured in connectionstring Connection Timeout : {connectionTimeout} seconds"); + this.CommandTimeout = connectionTimeout; + } + } + else if (connectionParser.ContainsKey("connect timeout")) + { + if (int.TryParse(connectionParser["connect timeout"].ToString(), out int connectionTimeout)) + { + _logger.LogInformation($"Setting Command Timeout to value configured in connectionstring Connect Timeout : {connectionTimeout} seconds"); + this.CommandTimeout = connectionTimeout; + } + } + } } #endregion From 2f47f43733cc5de12bb92faf426af4ebe0d874b3 Mon Sep 17 00:00:00 2001 From: Mole Date: Mon, 21 Nov 2022 13:47:54 +0100 Subject: [PATCH 2/2] Update src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs --- .../Persistence/UmbracoDatabase.cs | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs index 67e878e60839..fc66f301a7bd 100644 --- a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs @@ -101,32 +101,40 @@ private void Init() // This could be better, ideally the UmbracoDatabaseFactory.CreateDatabase() function would set this based on a setting (global or connectionstring setting) private void InitCommandTimeout() { - if (this.Connection != null && this.Connection.ConnectionTimeout > 0) + if (CommandTimeout != 0) { - this.CommandTimeout = this.Connection.ConnectionTimeout; + // CommandTimeout configured elsewhere, so we'll skip + return; } - else // get from _connectionString + + if (Connection is not null && Connection.ConnectionTimeout > 0) { - var connectionParser = new DbConnectionStringBuilder - { - ConnectionString = ConnectionString - }; + CommandTimeout = Connection.ConnectionTimeout; + return; + } + + // get from ConnectionString + var connectionParser = new DbConnectionStringBuilder + { + ConnectionString = ConnectionString + }; - if (connectionParser.ContainsKey("connection timeout")) + if (connectionParser.TryGetValue("connection timeout", out var connectionTimeoutString)) + { + if (int.TryParse(connectionTimeoutString.ToString(), out var connectionTimeout)) { - if (int.TryParse(connectionParser["connection timeout"].ToString(), out int connectionTimeout)) - { - _logger.LogInformation($"Setting Command Timeout to value configured in connectionstring Connection Timeout : {connectionTimeout} seconds"); - this.CommandTimeout = connectionTimeout; - } + _logger.LogTrace("Setting Command Timeout to value configured in connectionstring Connection Timeout : {TimeOut} seconds", connectionTimeout); + CommandTimeout = connectionTimeout; + return; } - else if (connectionParser.ContainsKey("connect timeout")) + } + + if (connectionParser.TryGetValue("connect timeout", out var connectTimeoutString)) + { + if (int.TryParse(connectTimeoutString.ToString(), out var connectionTimeout)) { - if (int.TryParse(connectionParser["connect timeout"].ToString(), out int connectionTimeout)) - { - _logger.LogInformation($"Setting Command Timeout to value configured in connectionstring Connect Timeout : {connectionTimeout} seconds"); - this.CommandTimeout = connectionTimeout; - } + _logger.LogTrace("Setting Command Timeout to value configured in connectionstring Connect Timeout : {TimeOut} seconds", connectionTimeout); + CommandTimeout = connectionTimeout; } } }