From a70f6b68d95a3e92a94941caa5a07a81a73e102a Mon Sep 17 00:00:00 2001 From: iSazonov Date: Tue, 13 Nov 2018 18:10:51 +0500 Subject: [PATCH 1/5] Fix race condition to access powershell.config.json --- src/System.Management.Automation/engine/PSConfiguration.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/System.Management.Automation/engine/PSConfiguration.cs b/src/System.Management.Automation/engine/PSConfiguration.cs index 7f3597f8405..773b8f4739f 100644 --- a/src/System.Management.Automation/engine/PSConfiguration.cs +++ b/src/System.Management.Automation/engine/PSConfiguration.cs @@ -355,7 +355,8 @@ internal PSKeyword GetLogKeywords() fileLock.EnterReadLock(); try { - using (var streamReader = new StreamReader(fileName)) + using (FileStream readerStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var streamReader = new StreamReader(readerStream)) using (var jsonReader = new JsonTextReader(streamReader)) { var settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.None, MaxDepth = 10 }; From f79a4f5fc4a30d6dbf0b440819922d068e9f7a79 Mon Sep 17 00:00:00 2001 From: iSazonov Date: Wed, 14 Nov 2018 10:52:25 +0500 Subject: [PATCH 2/5] Use var --- src/System.Management.Automation/engine/PSConfiguration.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/System.Management.Automation/engine/PSConfiguration.cs b/src/System.Management.Automation/engine/PSConfiguration.cs index 773b8f4739f..404e55a28f9 100644 --- a/src/System.Management.Automation/engine/PSConfiguration.cs +++ b/src/System.Management.Automation/engine/PSConfiguration.cs @@ -355,7 +355,7 @@ internal PSKeyword GetLogKeywords() fileLock.EnterReadLock(); try { - using (FileStream readerStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var readerStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (var streamReader = new StreamReader(readerStream)) using (var jsonReader = new JsonTextReader(streamReader)) { From 3f4e60472a4c50c5e60934d9626b6efca38516d0 Mon Sep 17 00:00:00 2001 From: iSazonov Date: Wed, 14 Nov 2018 12:00:01 +0500 Subject: [PATCH 3/5] Reduce an impact of the inter process race condition --- .../engine/PSConfiguration.cs | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/System.Management.Automation/engine/PSConfiguration.cs b/src/System.Management.Automation/engine/PSConfiguration.cs index 404e55a28f9..8e4f1c5c453 100644 --- a/src/System.Management.Automation/engine/PSConfiguration.cs +++ b/src/System.Management.Automation/engine/PSConfiguration.cs @@ -355,7 +355,9 @@ internal PSKeyword GetLogKeywords() fileLock.EnterReadLock(); try { - using (var readerStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + // The config file can be locked by another process + // so we wait some milliseconds in 'WaitForFile()' for recovery before stop current process. + using (var readerStream = WaitForFile(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (var streamReader = new StreamReader(readerStream)) using (var jsonReader = new JsonTextReader(streamReader)) { @@ -377,6 +379,29 @@ internal PSKeyword GetLogKeywords() return defaultValue; } + FileStream WaitForFile(string fullPath, FileMode mode, FileAccess access, FileShare share) + { + const int MaxTries = 5; + for (int numTries = 0; numTries < MaxTries; numTries++) + { + try + { + return new FileStream (fullPath, mode, access, share); + } + catch (IOException) + { + if (numTries == (MaxTries - 1)) + { + throw; + } + + Thread.Sleep (50); + } + } + + throw new IOException(nameof(WaitForFile)); + } + /// /// Update a value in the configuration file. /// From e5462e7419e8f9cfa9fb0b20ae132bf5f3c50a6e Mon Sep 17 00:00:00 2001 From: iSazonov Date: Fri, 23 Nov 2018 14:13:14 +0500 Subject: [PATCH 4/5] Add private modifier --- src/System.Management.Automation/engine/PSConfiguration.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/System.Management.Automation/engine/PSConfiguration.cs b/src/System.Management.Automation/engine/PSConfiguration.cs index 8e4f1c5c453..c8e910374d7 100644 --- a/src/System.Management.Automation/engine/PSConfiguration.cs +++ b/src/System.Management.Automation/engine/PSConfiguration.cs @@ -379,7 +379,7 @@ internal PSKeyword GetLogKeywords() return defaultValue; } - FileStream WaitForFile(string fullPath, FileMode mode, FileAccess access, FileShare share) + private FileStream WaitForFile(string fullPath, FileMode mode, FileAccess access, FileShare share) { const int MaxTries = 5; for (int numTries = 0; numTries < MaxTries; numTries++) From 3556792ec0941aa893d3ca599ba3e821f777bf07 Mon Sep 17 00:00:00 2001 From: iSazonov Date: Wed, 28 Nov 2018 08:17:31 +0500 Subject: [PATCH 5/5] Fix CodeFactor issues --- src/System.Management.Automation/engine/PSConfiguration.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/System.Management.Automation/engine/PSConfiguration.cs b/src/System.Management.Automation/engine/PSConfiguration.cs index c8e910374d7..643d8d08a87 100644 --- a/src/System.Management.Automation/engine/PSConfiguration.cs +++ b/src/System.Management.Automation/engine/PSConfiguration.cs @@ -386,7 +386,7 @@ private FileStream WaitForFile(string fullPath, FileMode mode, FileAccess access { try { - return new FileStream (fullPath, mode, access, share); + return new FileStream(fullPath, mode, access, share); } catch (IOException) { @@ -395,7 +395,7 @@ private FileStream WaitForFile(string fullPath, FileMode mode, FileAccess access throw; } - Thread.Sleep (50); + Thread.Sleep(50); } }