Skip to content

Commit 486b34f

Browse files
Switch config dictionaries to ConcurrentDictionary
Replaced Dictionary with ConcurrentDictionary for Configurations and Validation in ConfigurationHost to improve thread safety. Updated related code in SetDbatoolsConfigCommand and WriteMessageCommand to use TryGetValue for safer concurrent access. Bumped module and assembly versions to reflect these changes.
1 parent 8e6c372 commit 486b34f

File tree

5 files changed

+9
-10
lines changed

5 files changed

+9
-10
lines changed

dbatools.library.psd1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#
88
@{
99
# Version number of this module.
10-
ModuleVersion = '2025.8.17'
10+
ModuleVersion = '2025.11.2'
1111

1212
# ID used to uniquely identify this module
1313
GUID = '00b61a37-6c36-40d8-8865-ac0180288c84'

project/dbatools/Commands/SetDbatoolsConfigCommand.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,7 @@ protected override void BeginProcessing()
258258
}
259259
#endregion Name Interpretation
260260

261-
_Exists = ConfigurationHost.Configurations.ContainsKey(_NameFull);
262-
if (_Exists)
263-
_Config = ConfigurationHost.Configurations[_NameFull];
261+
_Exists = ConfigurationHost.Configurations.TryGetValue(_NameFull, out _Config);
264262
_Initialize = Initialize;
265263
_Persisted = !String.IsNullOrEmpty(PersistedValue);
266264
_PolicyEnforced = (_Exists && _Config.PolicyEnforced);

project/dbatools/Commands/WriteMessageCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ whether this function was called from Stop-Function.
420420
if (!String.IsNullOrEmpty(Once))
421421
{
422422
string onceName = String.Format("MessageOnce.{0}.{1}", FunctionName, Once).ToLower();
423-
if (!(Configuration.ConfigurationHost.Configurations.ContainsKey(onceName) && (bool)Configuration.ConfigurationHost.Configurations[onceName].Value))
423+
if (!(Configuration.ConfigurationHost.Configurations.TryGetValue(onceName, out var existingConfig) && (bool)existingConfig.Value))
424424
{
425425
WriteWarning(_MessageStreams);
426426
channels = channels | LogEntryType.Warning;
@@ -454,7 +454,7 @@ whether this function was called from Stop-Function.
454454
if (!String.IsNullOrEmpty(Once))
455455
{
456456
string onceName = String.Format("MessageOnce.{0}.{1}", FunctionName, Once).ToLower();
457-
if (!(Configuration.ConfigurationHost.Configurations.ContainsKey(onceName) && (bool)Configuration.ConfigurationHost.Configurations[onceName].Value))
457+
if (!(Configuration.ConfigurationHost.Configurations.TryGetValue(onceName, out var existingConfig) && (bool)existingConfig.Value))
458458
{
459459
InvokeCommand.InvokeScript(false, ScriptBlock.Create(_writeHostScript), null, _MessageHost);
460460
channels = channels | LogEntryType.Information;

project/dbatools/Configuration/ConfigurationHost.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections;
3+
using System.Collections.Concurrent;
34
using System.Collections.Generic;
45
using System.Management.Automation;
56

@@ -13,12 +14,12 @@ public static class ConfigurationHost
1314
/// <summary>
1415
/// Hashtable containing all the configuration entries
1516
/// </summary>
16-
public static Dictionary<string, Config> Configurations = new Dictionary<string, Config>(StringComparer.InvariantCultureIgnoreCase);
17+
public static ConcurrentDictionary<string, Config> Configurations = new ConcurrentDictionary<string, Config>(StringComparer.InvariantCultureIgnoreCase);
1718

1819
/// <summary>
1920
/// Hashtable containing all the registered validations
2021
/// </summary>
21-
public static Dictionary<string, string> Validation = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
22+
public static ConcurrentDictionary<string, string> Validation = new ConcurrentDictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
2223

2324
/// <summary>
2425
/// Whether the import from registry has been completed. Prevents multiple imports and overwrites when importing the module multiple times.

project/dbatools/dbatools.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
<Product>dbatools</Product>
88
<Description>The dbatools PowerShell Module library</Description>
99
<Copyright>Copyright © 2023</Copyright>
10-
<AssemblyVersion>0.10.0.76</AssemblyVersion>
11-
<FileVersion>0.10.0.76</FileVersion>
10+
<AssemblyVersion>0.10.0.77</AssemblyVersion>
11+
<FileVersion>0.10.0.77</FileVersion>
1212
<AssemblyName>dbatools</AssemblyName>
1313
<SkipFunctionsDepsCopy>false</SkipFunctionsDepsCopy>
1414
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

0 commit comments

Comments
 (0)