Fix "Unable to create hard link" SSTableReaderTest error messages

patch by jbellis and scode; reviewed by slebresne for CASSANDRA-3735


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

Branch: refs/heads/cassandra-1.1
Commit: 099f04e609487a4e01b2e21758593a820869f8d9
Parents: e6b3cbb
Author: Sylvain Lebresne <sylv...@datastax.com>
Authored: Mon Feb 6 16:05:23 2012 +0100
Committer: Sylvain Lebresne <sylv...@datastax.com>
Committed: Mon Feb 6 17:04:07 2012 +0100

----------------------------------------------------------------------
 .../org/apache/cassandra/db/ColumnFamilyStore.java |   25 ++++++++++++-
 src/java/org/apache/cassandra/db/Directories.java  |   13 ++++++-
 .../cassandra/io/sstable/SSTableReaderTest.java    |   29 +++++++--------
 3 files changed, 49 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/099f04e6/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java 
b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 65d7c60..33112c6 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -495,8 +495,18 @@ public class ColumnFamilyStore implements 
ColumnFamilyStoreMBean
             SSTableReader.releaseReferences(sstables);
         }
 
-        logger.info("Setting up new generation: " + generation);
-        fileIndexGenerator.set(generation);
+        if (fileIndexGenerator.get() < generation)
+        {
+            // we don't bother with CAS here since if the generations used in 
the new files overlap with
+            // files that we create during load, we're already screwed
+            logger.info("Setting up new generation: " + generation);
+            fileIndexGenerator.set(generation);
+        }
+        else
+        {
+            logger.warn("Largest generation seen in loaded sstables was {}, 
which may overlap with native sstable files (generation {}).",
+                        generation, fileIndexGenerator.get());
+        }
 
         logger.info("Done loading load new SSTables for " + table.name + "/" + 
columnFamily);
     }
@@ -1519,6 +1529,17 @@ public class ColumnFamilyStore implements 
ColumnFamilyStoreMBean
      */
     public void clearUnsafe()
     {
+        fileIndexGenerator.set(0); // Avoid unit test failures (see 
CASSANDRA-3735).
+
+        // Clear backups
+        Directories.SSTableLister lister = 
directories.sstableLister().onlyBackups(true);
+        for (Map.Entry<Descriptor, Set<Component>> entry : 
lister.list().entrySet())
+        {
+            Descriptor desc = entry.getKey();
+            for (Component comp : entry.getValue())
+                FileUtils.delete(desc.filenameFor(comp));
+        }
+
         for (ColumnFamilyStore cfs : concatWithIndexes())
             cfs.data.init();
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/099f04e6/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 e514fd9..2afefd2 100644
--- a/src/java/org/apache/cassandra/db/Directories.java
+++ b/src/java/org/apache/cassandra/db/Directories.java
@@ -181,6 +181,7 @@ public class Directories
         private boolean skipCompacted;
         private boolean skipTemporary;
         private boolean includeBackups;
+        private boolean onlyBackups;
         private int nbFiles;
         private final Map<Descriptor, Set<Component>> components = new 
HashMap<Descriptor, Set<Component>>();
         private boolean filtered;
@@ -209,6 +210,15 @@ public class Directories
             return this;
         }
 
+        public SSTableLister onlyBackups(boolean b)
+        {
+            if (filtered)
+                throw new IllegalStateException("list() has already been 
called");
+            onlyBackups = b;
+            includeBackups = b;
+            return this;
+        }
+
         public Map<Descriptor, Set<Component>> list()
         {
             filter();
@@ -236,7 +246,8 @@ public class Directories
 
             for (File location : sstableDirectories)
             {
-                location.listFiles(getFilter());
+                if (!onlyBackups)
+                    location.listFiles(getFilter());
 
                 if (includeBackups)
                     new File(location, BACKUPS_SUBDIR).listFiles(getFilter());

http://git-wip-us.apache.org/repos/asf/cassandra/blob/099f04e6/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java 
b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java
index b801f4e..bcb761b 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java
@@ -24,14 +24,17 @@ package org.apache.cassandra.io.sstable;
 import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.concurrent.ExecutionException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
 
 import org.junit.Test;
 
 import org.apache.cassandra.CleanupHelper;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.columniterator.IdentityQueryFilter;
@@ -51,10 +54,6 @@ import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.CLibrary;
 import org.apache.cassandra.utils.Pair;
 
-import org.apache.cassandra.Util;
-
-import static org.junit.Assert.assertEquals;
-
 public class SSTableReaderTest extends CleanupHelper
 {
     static Token t(int i)
@@ -157,11 +156,16 @@ public class SSTableReaderTest extends CleanupHelper
         }
         store.forceBlockingFlush();
 
-        store.clearUnsafe();
-        store.loadNewSSTables();
+        clearAndLoad(store);
         assert store.getMaxRowSize() != 0;
     }
 
+    private void clearAndLoad(ColumnFamilyStore cfs) throws IOException
+    {
+        cfs.clearUnsafe();
+        cfs.loadNewSSTables();
+    }
+
     @Test
     public void testGetPositionsForRangesWithKeyCache() throws IOException, 
ExecutionException, InterruptedException
     {
@@ -240,18 +244,13 @@ public class SSTableReaderTest extends CleanupHelper
         assertIndexQueryWorks(store);
     }
 
-    private void assertIndexQueryWorks(ColumnFamilyStore indexedCFS)
+    private void assertIndexQueryWorks(ColumnFamilyStore indexedCFS) throws 
IOException
     {
         assert "Indexed1".equals(indexedCFS.getColumnFamilyName());
 
         // make sure all sstables including 2ary indexes load from disk
-        indexedCFS.clearUnsafe();
-        for (ColumnFamilyStore indexCfs : 
indexedCFS.indexManager.getIndexesBackedByCfs())
-        {
-            indexCfs.clearUnsafe();
-            indexCfs.loadNewSSTables(); // v1.0.4 would fail here (see 
CASSANDRA-3540)
-        }
-        indexedCFS.loadNewSSTables();
+        for (ColumnFamilyStore cfs : indexedCFS.concatWithIndexes())
+            clearAndLoad(cfs);
 
         // query using index to see if sstable for secondary index opens
         IndexExpression expr = new 
IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexOperator.EQ, 
ByteBufferUtil.bytes(1L));

Reply via email to