cassandra-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From alek...@apache.org
Subject [1/2] git commit: Fix handling of concurrent directory creation failure
Date Sat, 07 Dec 2013 10:31:54 GMT
Updated Branches:
  refs/heads/cassandra-2.0 f2a82ee73 -> 3c15ff2e4


Fix handling of concurrent directory creation failure

patch by Ryan Fowler; reviewed by Aleksey Yeschenko for
CASSANDRA-6459


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/510eabfe
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/510eabfe
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/510eabfe

Branch: refs/heads/cassandra-2.0
Commit: 510eabfeb4111b6acb27ce1c443e5aef99341d1d
Parents: 86e949f
Author: Aleksey Yeschenko <aleksey@apache.org>
Authored: Sat Dec 7 13:30:26 2013 +0300
Committer: Aleksey Yeschenko <aleksey@apache.org>
Committed: Sat Dec 7 13:30:26 2013 +0300

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/db/Directories.java    |  2 +-
 .../apache/cassandra/db/DirectoriesTest.java    | 22 ++++++++++++++++++++
 3 files changed, 24 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/510eabfe/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 3b1f2f6..6f5f23b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -15,6 +15,7 @@
  * Fix cache persistence when both row and key cache are enabled 
    (CASSANDRA-6413)
  * (Hadoop) add describe_local_ring (CASSANDRA-6268)
+ * Fix handling of concurrent directory creation failure (CASSANDRA-6459)
 
 
 1.2.12

http://git-wip-us.apache.org/repos/asf/cassandra/blob/510eabfe/src/java/org/apache/cassandra/db/Directories.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/Directories.java b/src/java/org/apache/cassandra/db/Directories.java
index 351c0c0..8973327 100644
--- a/src/java/org/apache/cassandra/db/Directories.java
+++ b/src/java/org/apache/cassandra/db/Directories.java
@@ -448,7 +448,7 @@ public class Directories
             if (!dir.isDirectory())
                 throw new AssertionError(String.format("Invalid directory path %s: path exists
but is not a directory", dir));
         }
-        else if (!dir.mkdirs())
+        else if (!dir.mkdirs() && !(dir.exists() && dir.isDirectory()))
         {
             throw new FSWriteError(new IOException("Unable to create directory " + dir),
dir);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/510eabfe/test/unit/org/apache/cassandra/db/DirectoriesTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/DirectoriesTest.java b/test/unit/org/apache/cassandra/db/DirectoriesTest.java
index dce6f87..2c055c7 100644
--- a/test/unit/org/apache/cassandra/db/DirectoriesTest.java
+++ b/test/unit/org/apache/cassandra/db/DirectoriesTest.java
@@ -20,6 +20,7 @@ package org.apache.cassandra.db;
 import java.io.File;
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.*;
 
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -236,4 +237,25 @@ public class DirectoriesTest
             DatabaseDescriptor.setDiskFailurePolicy(origPolicy);
         }
     }
+
+    @Test
+    public void testMTSnapshots() throws Exception
+    {
+        for (final String cf : CFS)
+        {
+            final Directories directories = Directories.create(KS, cf);
+            Assert.assertEquals(cfDir(cf), directories.getDirectoryForNewSSTables(0));
+            final String n = Long.toString(System.nanoTime());
+            Callable<File> directoryGetter = new Callable<File>() {
+                public File call() throws Exception {
+                    Descriptor desc = new Descriptor(cfDir(cf), KS, cf, 1, false);
+                    return directories.getSnapshotDirectory(desc, n);
+                }
+            };
+            List<Future<File>> invoked = Executors.newFixedThreadPool(2).invokeAll(Arrays.asList(directoryGetter,
directoryGetter));
+            for(Future<File> fut:invoked) {
+                Assert.assertTrue(fut.get().exists());
+            }
+        }
+    }
 }


Mime
View raw message