Use canonical path for directory in SSTable descriptor

patch by yukim; reviewed by Paulo Motta for CASSANDRA-10587


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

Branch: refs/heads/trunk
Commit: c662259fe9e1e25e10e58eb1146de80c53e69867
Parents: caaa9fc
Author: Yuki Morishita <yu...@apache.org>
Authored: Tue Feb 16 12:45:36 2016 -0600
Committer: Yuki Morishita <yu...@apache.org>
Committed: Fri Apr 1 12:10:08 2016 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/io/sstable/Descriptor.java | 20 +++++---
 .../cassandra/io/sstable/DescriptorTest.java    | 51 ++++++++++++++------
 3 files changed, 51 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/c662259f/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 78ea961..c8a4f21 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.2.6
+ * Use canonical path for directory in SSTable descriptor (CASSANDRA-10587)
  * Add cassandra-stress keystore option (CASSANDRA-9325)
  * Fix out-of-space error treatment in memtable flushing (CASSANDRA-11448).
  * Dont mark sstables as repairing with sub range repairs (CASSANDRA-11451)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c662259f/src/java/org/apache/cassandra/io/sstable/Descriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/Descriptor.java 
b/src/java/org/apache/cassandra/io/sstable/Descriptor.java
index 9f259fe..ed81616 100644
--- a/src/java/org/apache/cassandra/io/sstable/Descriptor.java
+++ b/src/java/org/apache/cassandra/io/sstable/Descriptor.java
@@ -18,6 +18,8 @@
 package org.apache.cassandra.io.sstable;
 
 import java.io.File;
+import java.io.IOError;
+import java.io.IOException;
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.StringTokenizer;
@@ -58,7 +60,7 @@ public class Descriptor
         }
     }
 
-
+    /** canonicalized path to the directory where SSTable resides */
     public final File directory;
     /** version has the following format: <code>[a-z]+</code> */
     public final Version version;
@@ -91,14 +93,21 @@ public class Descriptor
     {
         assert version != null && directory != null && ksname != null && 
cfname != null && 
formatType.info.getLatestVersion().getClass().equals(version.getClass());
         this.version = version;
-        this.directory = directory;
+        try
+        {
+            this.directory = directory.getCanonicalFile();
+        }
+        catch (IOException e)
+        {
+            throw new IOError(e);
+        }
         this.ksname = ksname;
         this.cfname = cfname;
         this.generation = generation;
         this.type = temp;
         this.formatType = formatType;
 
-        hashCode = Objects.hashCode(version, directory, generation, ksname, 
cfname, temp, formatType);
+        hashCode = Objects.hashCode(version, this.directory, generation, 
ksname, cfname, temp, formatType);
     }
 
     public Descriptor withGeneration(int newGeneration)
@@ -168,8 +177,7 @@ public class Descriptor
      */
     public static Descriptor fromFilename(String filename)
     {
-        File file = new File(filename);
-        return fromFilename(file.getParentFile(), file.getName(), false).left;
+        return fromFilename(filename, false);
     }
 
     public static Descriptor fromFilename(String filename, SSTableFormat.Type 
formatType)
@@ -179,7 +187,7 @@ public class Descriptor
 
     public static Descriptor fromFilename(String filename, boolean 
skipComponent)
     {
-        File file = new File(filename);
+        File file = new File(filename).getAbsoluteFile();
         return fromFilename(file.getParentFile(), file.getName(), 
skipComponent).left;
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c662259f/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java 
b/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
index 70ab8ba..6354fc2 100644
--- a/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
@@ -84,16 +84,22 @@ public class DescriptorTest
         // secondary index
         String idxName = "myidx";
         File idxDir = new File(dir.getAbsolutePath() + File.separator + 
Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName);
-        checkFromFilename(new Descriptor(idxDir, ksname, cfname + 
Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 4, 
Descriptor.Type.FINAL), false);
+        checkFromFilename(new Descriptor(idxDir, ksname, cfname + 
Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName,
+                                         4, Descriptor.Type.FINAL), false);
         // secondary index tmp
-        checkFromFilename(new Descriptor(idxDir, ksname, cfname + 
Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 5, Descriptor.Type.TEMP), 
false);
+        checkFromFilename(new Descriptor(idxDir, ksname, cfname + 
Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName,
+                                         5, Descriptor.Type.TEMP), false);
 
         // legacy version
-        checkFromFilename(new Descriptor("ja", dir, ksname, cfname, 1, 
Descriptor.Type.FINAL, SSTableFormat.Type.LEGACY), false);
+        checkFromFilename(new Descriptor("ja", dir, ksname, cfname, 1, 
Descriptor.Type.FINAL,
+                                         SSTableFormat.Type.LEGACY), false);
         // legacy tmp
-        checkFromFilename(new Descriptor("ja", dir, ksname, cfname, 2, 
Descriptor.Type.TEMP, SSTableFormat.Type.LEGACY), false);
+        checkFromFilename(new Descriptor("ja", dir, ksname, cfname, 2, 
Descriptor.Type.TEMP, SSTableFormat.Type.LEGACY),
+                          false);
         // legacy secondary index
-        checkFromFilename(new Descriptor("ja", dir, ksname, cfname + 
Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 3, Descriptor.Type.FINAL, 
SSTableFormat.Type.LEGACY), false);
+        checkFromFilename(new Descriptor("ja", dir, ksname,
+                                         cfname + 
Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 3,
+                                         Descriptor.Type.FINAL, 
SSTableFormat.Type.LEGACY), false);
     }
 
     private void checkFromFilename(Descriptor original, boolean skipComponent)
@@ -121,23 +127,38 @@ public class DescriptorTest
     }
 
     @Test
+    public void testEquality()
+    {
+        // Descriptor should be equal when parent directory points to the same 
directory
+        File dir = new File(".");
+        Descriptor desc1 = new Descriptor(dir, "ks", "cf", 1, 
Descriptor.Type.FINAL);
+        Descriptor desc2 = new Descriptor(dir.getAbsoluteFile(), "ks", "cf", 
1, Descriptor.Type.FINAL);
+        assertEquals(desc1, desc2);
+        assertEquals(desc1.hashCode(), desc2.hashCode());
+    }
+
+    @Test
     public void validateNames()
     {
 
-        String names[] = {
-            /*"system-schema_keyspaces-ka-1-CompressionInfo.db",  
"system-schema_keyspaces-ka-1-Summary.db",
-            "system-schema_keyspaces-ka-1-Data.db",             
"system-schema_keyspaces-ka-1-TOC.txt",
-            "system-schema_keyspaces-ka-1-Digest.sha1",         
"system-schema_keyspaces-ka-2-CompressionInfo.db",
-            "system-schema_keyspaces-ka-1-Filter.db",           
"system-schema_keyspaces-ka-2-Data.db",
-            "system-schema_keyspaces-ka-1-Index.db",            
"system-schema_keyspaces-ka-2-Digest.sha1",
-            "system-schema_keyspaces-ka-1-Statistics.db",
-            "system-schema_keyspacest-tmp-ka-1-Data.db",*/
-            "system-schema_keyspace-ka-1-"+ 
SSTableFormat.Type.BIG.name+"-Data.db"
+        String[] names = {
+             // old formats
+             "system-schema_keyspaces-jb-1-Data.db",
+             "system-schema_keyspaces-tmp-jb-1-Data.db",
+             "system-schema_keyspaces-ka-1-big-Data.db",
+             "system-schema_keyspaces-tmp-ka-1-big-Data.db",
+             // 2ndary index
+             "keyspace1-standard1.idx1-ka-1-big-Data.db",
+             // new formats
+             "la-1-big-Data.db",
+             "tmp-la-1-big-Data.db",
+             // 2ndary index
+             ".idx1" + File.separator + "la-1-big-Data.db",
         };
 
         for (String name : names)
         {
-            Descriptor d = Descriptor.fromFilename(name);
+            assertNotNull(Descriptor.fromFilename(name));
         }
     }
 

Reply via email to