You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2009/07/16 21:10:06 UTC

svn commit: r794784 - in /incubator/cassandra/trunk: src/java/org/apache/cassandra/config/ src/java/org/apache/cassandra/db/ src/java/org/apache/cassandra/dht/ src/java/org/apache/cassandra/io/ src/java/org/apache/cassandra/net/io/ src/java/org/apache/...

Author: jbellis
Date: Thu Jul 16 19:10:06 2009
New Revision: 794784

URL: http://svn.apache.org/viewvc?rev=794784&view=rev
Log:
move data files into per-table subdirectories.  patch by Arin Sarkissian; reviewed by Michael Greene and jbellis

Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/dht/BootstrapMetadataVerbHandler.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTable.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/net/io/StreamContextManager.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java
    incubator/cassandra/trunk/test/unit/org/apache/cassandra/CleanupHelper.java

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=794784&r1=794783&r2=794784&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java Thu Jul 16 19:10:06 2009
@@ -406,6 +406,10 @@
                 }
             }
 
+
+            /* make sure we have a directory for each table */
+            createTableDirectories();
+
             /* Load the seeds for node contact points */
             String[] seeds = xmlUtils.getNodeValues("/Storage/Seeds/Seed");
             for( int i = 0; i < seeds.length; ++i )
@@ -425,8 +429,22 @@
         }
     }
     
+    /**
+     * Create the table directory in each data directory
+     */
+    public static void createTableDirectories() throws IOException
+    {
+        for (String dataFile : dataFileDirectories_) 
+        {
+            FileUtils.createDirectory(dataFile + File.separator + Table.SYSTEM_TABLE);
+            for (String table : tables_)
+            {
+                FileUtils.createDirectory(dataFile + File.separator + table);
+            }
+        }
+    }
 
-    /*
+    /**
      * Create the metadata tables. This table has information about
      * the table name and the column families that make up the table.
      * Each column family also has an associated ID which is an int.
@@ -483,7 +501,6 @@
     	return columnIndexSizeInKB_ * 1024;
     }
 
-   
     public static int getMemtableLifetime()
     {
       return memtableLifetime_;
@@ -670,16 +687,22 @@
         return dataFileDirectories_;
     }
 
-    public static String getDataFileLocation()
+    public static String[] getAllDataFileLocationsForTable(String table)
     {
-    	String dataFileDirectory = dataFileDirectories_[currentIndex_];
-        return dataFileDirectory;
+        String[] tableLocations = new String[dataFileDirectories_.length];
+
+        for (int i = 0; i < dataFileDirectories_.length; i++)
+        {
+            tableLocations[i] = dataFileDirectories_[i] + File.separator + table;
+        }
+
+        return tableLocations;
     }
-    
-    public static String getCompactionFileLocation()
+
+    public static String getDataFileLocationForTable(String table)
     {
-    	String dataFileDirectory = dataFileDirectories_[currentIndex_];
-    	currentIndex_ = (currentIndex_ + 1 )%dataFileDirectories_.length ;
+        String dataFileDirectory = dataFileDirectories_[currentIndex_] + File.separator + table;
+        currentIndex_ = (currentIndex_ + 1) % dataFileDirectories_.length;
         return dataFileDirectory;
     }
 
@@ -728,14 +751,16 @@
      * compacted file is greater than the max disk space available return null, we cannot
      * do compaction in this case.
      */
-    public static String getCompactionFileLocation(long expectedCompactedFileSize)
+    public static String getDataFileLocationForTable(String table, long expectedCompactedFileSize)
     {
       long maxFreeDisk = 0;
       int maxDiskIndex = 0;
       String dataFileDirectory = null;
-      for ( int i = 0 ; i < dataFileDirectories_.length ; i++ )
+      String[] dataDirectoryForTable = getAllDataFileLocationsForTable(table);
+
+      for ( int i = 0 ; i < dataDirectoryForTable.length ; i++ )
       {
-        File f = new File(dataFileDirectories_[i]);
+        File f = new File(dataDirectoryForTable[i]);
         if( maxFreeDisk < f.getUsableSpace())
         {
           maxFreeDisk = f.getUsableSpace();
@@ -746,8 +771,8 @@
       maxFreeDisk = (long)(0.9 * maxFreeDisk);
       if( expectedCompactedFileSize < maxFreeDisk )
       {
-        dataFileDirectory = dataFileDirectories_[maxDiskIndex];
-        currentIndex_ = (maxDiskIndex + 1 )%dataFileDirectories_.length ;
+        dataFileDirectory = dataDirectoryForTable[maxDiskIndex];
+        currentIndex_ = (maxDiskIndex + 1 )%dataDirectoryForTable.length ;
       }
       else
       {

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=794784&r1=794783&r2=794784&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Thu Jul 16 19:10:06 2009
@@ -110,18 +110,18 @@
          * index.
          */
         List<Integer> indices = new ArrayList<Integer>();
-        String[] dataFileDirectories = DatabaseDescriptor.getAllDataFileLocations();
+        String[] dataFileDirectories = DatabaseDescriptor.getAllDataFileLocationsForTable(table);
         for (String directory : dataFileDirectories)
         {
             File fileDir = new File(directory);
             File[] files = fileDir.listFiles();
+            
             for (File file : files)
             {
                 String filename = file.getName();
-                String[] tblCfName = getTableAndColumnFamilyName(filename);
+                String cfName = getColumnFamilyFromFileName(filename);
 
-                if (tblCfName[0].equals(table)
-                    && tblCfName[1].equals(columnFamily))
+                if (cfName.equals(columnFamily))
                 {
                     int index = getIndexFromFileName(filename);
                     indices.add(index);
@@ -151,7 +151,7 @@
     {
         // scan for data files corresponding to this CF
         List<File> sstableFiles = new ArrayList<File>();
-        String[] dataFileDirectories = DatabaseDescriptor.getAllDataFileLocations();
+        String[] dataFileDirectories = DatabaseDescriptor.getAllDataFileLocationsForTable(table_);
         for (String directory : dataFileDirectories)
         {
             File fileDir = new File(directory);
@@ -165,9 +165,8 @@
                     continue;
                 }
 
-                String[] tblCfName = getTableAndColumnFamilyName(filename);
-                if (tblCfName[0].equals(table_)
-                    && tblCfName[1].equals(columnFamily_)
+                String cfName = getColumnFamilyFromFileName(filename);
+                if (cfName.equals(columnFamily_)
                     && filename.contains("-Data.db"))
                 {
                     sstableFiles.add(file.getAbsoluteFile());
@@ -311,25 +310,9 @@
         return columnFamily_;
     }
 
-    private static String[] getTableAndColumnFamilyName(String filename)
-    {
-        StringTokenizer st = new StringTokenizer(filename, "-");
-        String[] values = new String[2];
-        int i = 0;
-        while (st.hasMoreElements())
-        {
-            if (i == 0)
-            {
-                values[i] = (String) st.nextElement();
-            }
-            else if (i == 1)
+    private static String getColumnFamilyFromFileName(String filename)
             {
-                values[i] = (String) st.nextElement();
-                break;
-            }
-            ++i;
-        }
-        return values;
+        return filename.split("-")[0];
     }
 
     protected static int getIndexFromFileName(String filename)
@@ -374,14 +357,15 @@
     {
         // increment twice so that we do not generate consecutive numbers
         String fname = getTempSSTableFileName();
-        return new File(DatabaseDescriptor.getDataFileLocation(), fname).getAbsolutePath();
+        return new File(DatabaseDescriptor.getDataFileLocationForTable(table_), fname).getAbsolutePath();
     }
 
     String getTempSSTableFileName()
     {
         fileIndexGenerator_.incrementAndGet();
-        return String.format("%s-%s-%s-%s-Data.db",
-                             table_, columnFamily_, SSTable.TEMPFILE_MARKER, fileIndexGenerator_.incrementAndGet());
+
+        return String.format("%s-%s-%s-Data.db",
+                             columnFamily_, SSTable.TEMPFILE_MARKER, fileIndexGenerator_.incrementAndGet());
     }
 
     /*
@@ -405,8 +389,8 @@
 
         index = lowestIndex + 1;
 
-        return String.format("%s-%s-%s-%s-Data.db",
-                             table_, columnFamily_, SSTable.TEMPFILE_MARKER, index);
+        return String.format("%s-%s-%s-Data.db",
+                             columnFamily_, SSTable.TEMPFILE_MARKER, index);
     }
 
     void switchMemtable()
@@ -924,7 +908,7 @@
         long expectedRangeFileSize = getExpectedCompactedFileSize(files);
         /* in the worst case a node will be giving out half of its data so we take a chance */
         expectedRangeFileSize = expectedRangeFileSize / 2;
-        rangeFileLocation = DatabaseDescriptor.getCompactionFileLocation(expectedRangeFileSize);
+        rangeFileLocation = DatabaseDescriptor.getDataFileLocationForTable(table_, expectedRangeFileSize);
         // If the compaction file path is null that means we have no space left for this compaction.
         if (rangeFileLocation == null)
         {
@@ -1084,12 +1068,13 @@
             }
         }
 
-        logger_.debug("Total time taken for range split   ..."
-                      + (System.currentTimeMillis() - startTime));
         if (logger_.isDebugEnabled())
+        {
+            logger_.debug("Total time taken for range split   ..." + (System.currentTimeMillis() - startTime));
           logger_.debug("Total bytes Read for range split  ..." + totalBytesRead);
         logger_.debug("Total bytes written for range split  ..."
                       + totalBytesWritten + "   Total keys read ..." + totalkeysRead);
+        }
         return result;
     }
 
@@ -1112,7 +1097,7 @@
     private int doFileCompaction(List<String> files, int minBufferSize) throws IOException
     {
         logger_.info("Compacting [" + StringUtils.join(files, ",") + "]");
-        String compactionFileLocation = DatabaseDescriptor.getCompactionFileLocation(getExpectedCompactedFileSize(files));
+        String compactionFileLocation = DatabaseDescriptor.getDataFileLocationForTable(table_, getExpectedCompactedFileSize(files));
         // If the compaction file path is null that means we have no space left for this compaction.
         // try again w/o the largest one.
         if (compactionFileLocation == null)

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java?rev=794784&r1=794783&r2=794784&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java Thu Jul 16 19:10:06 2009
@@ -188,6 +188,7 @@
                  * sampler.
                 */                
                 SSTableReader sstable = SSTableReader.open(streamContext.getTargetFile());
+                if (logger_.isDebugEnabled())
                 logger_.debug("Merging the counting bloom filter in the sampler ...");                
                 String[] peices = FBUtilities.strip(fileName, "-");
                 Table.open(peices[0]).getColumnFamilyStore(peices[1]).addToList(sstable);                
@@ -236,7 +237,7 @@
                     String[] peices = FBUtilities.strip(sourceFile.getName(), "-");
                     String newFileName = fileNames.get( peices[1] + "-" + peices[2] );
                     
-                    String file = DatabaseDescriptor.getDataFileLocation() + File.separator + newFileName + "-Data.db";
+                    String file = DatabaseDescriptor.getDataFileLocationForTable(streamContext.getTable()) + File.separator + newFileName + "-Data.db";
                     if (logger_.isDebugEnabled())
                       logger_.debug("Received Data from  : " + message.getFrom() + " " + streamContext.getTargetFile() + " " + file);
                     streamContext.setTargetFile(file);
@@ -245,6 +246,7 @@
                                              
                 StreamContextManager.registerStreamCompletionHandler(message.getFrom().getHost(), new Table.BootstrapCompletionHandler());
                 /* Send a bootstrap initiation done message to execute on default stage. */
+                if (logger_.isDebugEnabled())
                 logger_.debug("Sending a bootstrap initiate done message ...");                
                 Message doneMessage = new Message( StorageService.getLocalStorageEndPoint(), "", StorageService.bootStrapInitiateDoneVerbHandler_, new byte[0] );
                 MessagingService.getMessagingInstance().sendOneWay(doneMessage, message.getFrom());

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/dht/BootstrapMetadataVerbHandler.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/dht/BootstrapMetadataVerbHandler.java?rev=794784&r1=794783&r2=794784&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/dht/BootstrapMetadataVerbHandler.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/dht/BootstrapMetadataVerbHandler.java Thu Jul 16 19:10:06 2009
@@ -32,7 +32,6 @@
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.io.StreamContextManager;
 import org.apache.cassandra.service.StreamManager;
-import org.apache.cassandra.utils.BloomFilter;
 import org.apache.cassandra.utils.LogUtil;
 import org.apache.log4j.Logger;
 
@@ -61,6 +60,7 @@
             */
             for ( BootstrapMetadata bsmd : bsMetadata )
             {
+                if (logger_.isDebugEnabled())
                 logger_.debug(bsmd.toString());                                      
             }
             
@@ -68,6 +68,7 @@
             {
                 long startTime = System.currentTimeMillis();
                 doTransfer(bsmd.target_, bsmd.ranges_);     
+                if (logger_.isDebugEnabled())
                 logger_.debug("Time taken to boostrap " + 
                         bsmd.target_ + 
                         " is " + 
@@ -101,6 +102,7 @@
             StringBuilder sb = new StringBuilder("");                
             sb.append(range.toString());
             sb.append(" ");            
+            if (logger_.isDebugEnabled())
             logger_.debug("Beginning transfer process to " + target + " for ranges " + sb.toString());                
         }
       
@@ -124,7 +126,7 @@
             /* Get the counting bloom filter for each endpoint and the list of files that need to be streamed */
             List<String> fileList = new ArrayList<String>();
             boolean bVal = table.forceCompaction(ranges, target, fileList);                
-            doHandoff(target, fileList);
+            doHandoff(target, fileList, tName);
         }
     }
 
@@ -132,7 +134,7 @@
      * Stream the files in the bootstrap directory over to the
      * node being bootstrapped.
     */
-    private void doHandoff(EndPoint target, List<String> fileList) throws IOException
+    private void doHandoff(EndPoint target, List<String> fileList, String table) throws IOException
     {
         List<File> filesList = new ArrayList<File>();
         for(String file : fileList)
@@ -144,7 +146,7 @@
         int i = 0;
         for ( File file : files )
         {
-            streamContexts[i] = new StreamContextManager.StreamContext(file.getAbsolutePath(), file.length());
+            streamContexts[i] = new StreamContextManager.StreamContext(file.getAbsolutePath(), file.length(), table);
             if (logger_.isDebugEnabled())
               logger_.debug("Stream context metadata " + streamContexts[i]);
             ++i;
@@ -163,6 +165,7 @@
             if (logger_.isDebugEnabled())
               logger_.debug("Waiting for transfer to " + target + " to complete");
             StreamManager.instance(target).waitForStreamCompletion();
+            if (logger_.isDebugEnabled())
             logger_.debug("Done with transfer to " + target);  
         }
     }

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTable.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTable.java?rev=794784&r1=794783&r2=794784&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTable.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTable.java Thu Jul 16 19:10:06 2009
@@ -69,8 +69,7 @@
 
     static String parseTableName(String filename)
     {
-        String[] parts = new File(filename).getName().split("-"); // table, cf, index, [filetype]
-        return parts[0];
+        return new File(filename).getParentFile().getName();        
     }
 
     /**
@@ -101,4 +100,4 @@
             return key + ":" + position;
         }
     }
-}
+}
\ No newline at end of file

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/net/io/StreamContextManager.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/net/io/StreamContextManager.java?rev=794784&r1=794783&r2=794784&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/net/io/StreamContextManager.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/net/io/StreamContextManager.java Thu Jul 16 19:10:06 2009
@@ -24,14 +24,8 @@
 import java.io.IOException;
 import java.io.Serializable;
 import java.util.*;
-import java.util.concurrent.LinkedBlockingQueue;
-import javax.xml.bind.annotation.XmlElement;
 
-import org.apache.cassandra.db.Table;
-import org.apache.cassandra.dht.BootstrapInitiateMessage;
-import org.apache.cassandra.io.DataInputBuffer;
 import org.apache.cassandra.io.ICompactSerializer;
-import org.apache.cassandra.net.EndPoint;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.service.StorageService;
 import org.apache.log4j.Logger;
@@ -67,11 +61,18 @@
                 
         private String targetFile_;        
         private long expectedBytes_;                     
+        private String table_;
         
-        public StreamContext(String targetFile, long expectedBytes)
+        public StreamContext(String targetFile, long expectedBytes, String table)
         {
             targetFile_ = targetFile;
             expectedBytes_ = expectedBytes;         
+            table_ = table;
+        }
+
+        public String getTable()
+        {
+            return table_;
         }                
                 
         public String getTargetFile()
@@ -115,13 +116,15 @@
         {
             dos.writeUTF(sc.targetFile_);
             dos.writeLong(sc.expectedBytes_);            
+            dos.writeUTF(sc.table_);
         }
         
         public StreamContextManager.StreamContext deserialize(DataInputStream dis) throws IOException
         {
             String targetFile = dis.readUTF();
             long expectedBytes = dis.readLong();           
-            return new StreamContext(targetFile, expectedBytes);
+            String table = dis.readUTF();
+            return new StreamContext(targetFile, expectedBytes, table);
         }
     }
     

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=794784&r1=794783&r2=794784&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Thu Jul 16 19:10:06 2009
@@ -694,34 +694,37 @@
         }        
     }
     
-    public void forceHandoff(String directories, String host) throws IOException
+    public void forceHandoff(List<String> dataDirectories, String host) throws IOException
     {       
         List<File> filesList = new ArrayList<File>();
-        String[] sources = directories.split(":");
-        for (String source : sources)
+        List<StreamContextManager.StreamContext> streamContexts = new ArrayList<StreamContextManager.StreamContext>();
+        
+        for (String dataDir : dataDirectories)
         {
-            File directory = new File(source);
+            File directory = new File(dataDir);
             Collections.addAll(filesList, directory.listFiles());            
-        }
         
-        File[] files = filesList.toArray(new File[0]);
-        StreamContextManager.StreamContext[] streamContexts = new StreamContextManager.StreamContext[files.length];
-        int i = 0;
-        for ( File file : files )
+
+            for (File tableDir : directory.listFiles())
+            {
+                String tableName = tableDir.getName();
+
+                for (File file : tableDir.listFiles())
         {
-            streamContexts[i] = new StreamContextManager.StreamContext(file.getAbsolutePath(), file.length());
+                    streamContexts.add(new StreamContextManager.StreamContext(file.getAbsolutePath(), file.length(), tableName));
             if (logger_.isDebugEnabled())
-              logger_.debug("Stream context metadata " + streamContexts[i]);
-            ++i;
+                      logger_.debug("Stream context metadata " + streamContexts);
+                }
+            }
         }
         
-        if ( files.length > 0 )
+        if ( streamContexts.size() > 0 )
     {
             EndPoint target = new EndPoint(host, DatabaseDescriptor.getStoragePort());
             /* Set up the stream manager with the files that need to streamed */
-            StreamManager.instance(target).addFilesToStream(streamContexts);
+            StreamManager.instance(target).addFilesToStream((StreamContextManager.StreamContext[]) streamContexts.toArray());
             /* Send the bootstrap initiate message */
-            BootstrapInitiateMessage biMessage = new BootstrapInitiateMessage(streamContexts);
+            BootstrapInitiateMessage biMessage = new BootstrapInitiateMessage((StreamContextManager.StreamContext[]) streamContexts.toArray());
             Message message = BootstrapInitiateMessage.makeBootstrapInitiateMessage(biMessage);
             if (logger_.isDebugEnabled())
               logger_.debug("Sending a bootstrap initiate message to " + target + " ...");
@@ -729,6 +732,7 @@
             if (logger_.isDebugEnabled())
               logger_.debug("Waiting for transfer to " + target + " to complete");
             StreamManager.instance(target).waitForStreamCompletion();
+            if (logger_.isDebugEnabled())
             logger_.debug("Done with transfer to " + target);  
         }
     }

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java?rev=794784&r1=794783&r2=794784&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java Thu Jul 16 19:10:06 2009
@@ -65,5 +65,5 @@
      *                files need to be picked up.
      * @param target endpoint receiving data.
     */
-    public void forceHandoff(String directories, String target) throws IOException;
+    public void forceHandoff(List<String> directories, String target) throws IOException;
 }

Modified: incubator/cassandra/trunk/test/unit/org/apache/cassandra/CleanupHelper.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/CleanupHelper.java?rev=794784&r1=794783&r2=794784&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/CleanupHelper.java (original)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/CleanupHelper.java Thu Jul 16 19:10:06 2009
@@ -37,7 +37,6 @@
         String[] directoryNames = {
                 DatabaseDescriptor.getBootstrapFileLocation(),
                 DatabaseDescriptor.getLogFileLocation(),
-                DatabaseDescriptor.getDataFileLocation(),
         };
 
         for (String dirName : directoryNames)
@@ -49,9 +48,36 @@
             }
             for (File f : dir.listFiles())
             {
+                if (logger.isDebugEnabled())
                 logger.debug("deleting " + f);
-                f.delete();
+                if (!f.delete()) {
+                    logger.error("could not delete " + f);
             }
         }
     }
-}
\ No newline at end of file
+
+        // cleanup data directory which are stored as data directory/table/data files
+        for (String dirName : DatabaseDescriptor.getAllDataFileLocations())
+        {
+            File dir = new File(dirName);
+            if (!dir.exists())
+            {
+                throw new RuntimeException("No such directory: " + dir.getAbsolutePath());
+            }
+            for (File tableFile : dir.listFiles())
+            {
+                // table directory
+                if (tableFile.isDirectory()) {
+                    for (File dataFile : tableFile.listFiles()) {
+                        if (logger.isDebugEnabled())
+                            logger.debug("deleting " + dataFile);
+                        if (!dataFile.delete()) {
+                            logger.error("could not delete " + dataFile);
+                        }
+                    }
+                }
+            }
+        }
+
+    }
+}