Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id C2BDD200D0B for ; Wed, 27 Sep 2017 13:57:56 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id C125E1609CA; Wed, 27 Sep 2017 11:57:56 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 126A51609BC for ; Wed, 27 Sep 2017 13:57:55 +0200 (CEST) Received: (qmail 64462 invoked by uid 500); 27 Sep 2017 11:57:55 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 64452 invoked by uid 99); 27 Sep 2017 11:57:55 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 27 Sep 2017 11:57:55 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 2AFF1F5836; Wed, 27 Sep 2017 11:57:55 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: ptupitsyn@apache.org To: commits@ignite.apache.org Message-Id: <6909e53332f042d2b6e6ba3b34769398@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: ignite git commit: IGNITE-5730 .NET: Fix ignite.jni.dll temp dir race Date: Wed, 27 Sep 2017 11:57:55 +0000 (UTC) archived-at: Wed, 27 Sep 2017 11:57:57 -0000 Repository: ignite Updated Branches: refs/heads/master 690694cad -> fca47345f IGNITE-5730 .NET: Fix ignite.jni.dll temp dir race This closes #2755 Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/fca47345 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/fca47345 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/fca47345 Branch: refs/heads/master Commit: fca47345fae7adf80a1d40cc6c4c711924df2de2 Parents: 690694c Author: Pavel Tupitsyn Authored: Wed Sep 27 14:57:47 2017 +0300 Committer: Pavel Tupitsyn Committed: Wed Sep 27 14:57:47 2017 +0300 ---------------------------------------------------------------------- .../Apache.Ignite.Core/Impl/IgniteUtils.cs | 30 ++++++++++---------- .../Impl/Unmanaged/UnmanagedUtils.cs | 4 +++ 2 files changed, 19 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/fca47345/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteUtils.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteUtils.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteUtils.cs index f3bdd2b..d55960a 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteUtils.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteUtils.cs @@ -82,16 +82,6 @@ namespace Apache.Ignite.Core.Impl private static Random _rnd; /// - /// Initializes the class. - /// - [SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", - Justification = "Readability.")] - static IgniteUtils() - { - TryCleanTempDirectories(); - } - - /// /// Gets thread local random. /// /// Thread local random. @@ -388,10 +378,20 @@ namespace Apache.Ignite.Core.Impl /// /// Tries to clean temporary directories created with . /// - private static void TryCleanTempDirectories() + internal static void TryCleanTempDirectories() { - foreach (var dir in Directory.GetDirectories(Path.GetTempPath(), DirIgniteTmp + "*")) + var dt = DateTime.Now; + + foreach (var dir in Directory.EnumerateDirectories(Path.GetTempPath(), DirIgniteTmp + "*")) { + if ((dt - Directory.GetCreationTime(dir)).TotalMinutes < 1) + { + // Do not clean up recently created temp directories: + // they may be used by currently starting up nodes. + // This is a workaround for multiple node startup problem, see IGNITE-5730. + continue; + } + try { Directory.Delete(dir, true); @@ -413,13 +413,13 @@ namespace Apache.Ignite.Core.Impl /// The full path of the temporary directory. internal static string GetTempDirectoryName() { + var baseDir = Path.Combine(Path.GetTempPath(), DirIgniteTmp); + while (true) { - var dir = Path.Combine(Path.GetTempPath(), DirIgniteTmp + Path.GetRandomFileName()); - try { - return Directory.CreateDirectory(dir).FullName; + return Directory.CreateDirectory(baseDir + Path.GetRandomFileName()).FullName; } catch (IOException) { http://git-wip-us.apache.org/repos/asf/ignite/blob/fca47345/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs index b6e6582..511bb7a 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs @@ -21,6 +21,7 @@ namespace Apache.Ignite.Core.Impl.Unmanaged using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; + using System.Threading.Tasks; using Apache.Ignite.Core.Common; using JNI = IgniteJniNativeMethods; @@ -57,6 +58,9 @@ namespace Apache.Ignite.Core.Impl.Unmanaged AppDomain.CurrentDomain.DomainUnload += CurrentDomain_DomainUnload; JNI.SetConsoleHandler(UnmanagedCallbacks.ConsoleWriteHandler); + + // Clean directories in background to avoid extra work on start. + Task.Factory.StartNew(IgniteUtils.TryCleanTempDirectories); } ///