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/03/27 18:06:19 UTC

svn commit: r759270 - in /incubator/cassandra/trunk: src/org/apache/cassandra/config/ src/org/apache/cassandra/db/ src/org/apache/cassandra/service/ src/org/apache/cassandra/test/ test/ test/org/apache/cassandra/ test/org/apache/cassandra/db/ test/org/...

Author: jbellis
Date: Fri Mar 27 17:06:18 2009
New Revision: 759270

URL: http://svn.apache.org/viewvc?rev=759270&view=rev
Log:
test support.  this requires some refactoring so that tests can be independent

Added:
    incubator/cassandra/trunk/test/org/apache/cassandra/ServerTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnComparatorFactoryTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/db/CommitLogTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/db/DBManagerTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/db/RecoveryManagerTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/db/SystemTableTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/db/TableTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/dht/RangeTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/io/DataInputBufferTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/io/SSTableTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/service/CassandraServerTest.java
    incubator/cassandra/trunk/test/org/apache/cassandra/utils/KeyGenerator.java
    incubator/cassandra/trunk/test/org/apache/cassandra/utils/ResetableIterator.java
    incubator/cassandra/trunk/test/testng.xml
Modified:
    incubator/cassandra/trunk/src/org/apache/cassandra/config/DatabaseDescriptor.java
    incubator/cassandra/trunk/src/org/apache/cassandra/db/BinaryMemtable.java
    incubator/cassandra/trunk/src/org/apache/cassandra/db/CommitLog.java
    incubator/cassandra/trunk/src/org/apache/cassandra/db/DBManager.java
    incubator/cassandra/trunk/src/org/apache/cassandra/db/RecoveryManager.java
    incubator/cassandra/trunk/src/org/apache/cassandra/db/SystemTable.java
    incubator/cassandra/trunk/src/org/apache/cassandra/db/Table.java
    incubator/cassandra/trunk/src/org/apache/cassandra/service/StorageService.java
    incubator/cassandra/trunk/src/org/apache/cassandra/test/DBTest.java

Modified: incubator/cassandra/trunk/src/org/apache/cassandra/config/DatabaseDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/org/apache/cassandra/config/DatabaseDescriptor.java?rev=759270&r1=759269&r2=759270&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/org/apache/cassandra/config/DatabaseDescriptor.java (original)
+++ incubator/cassandra/trunk/src/org/apache/cassandra/config/DatabaseDescriptor.java Fri Mar 27 17:06:18 2009
@@ -25,6 +25,8 @@
 import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.Table;
 import org.apache.cassandra.db.TypeInfo;
+import org.apache.cassandra.db.DBManager;
+import org.apache.cassandra.db.SystemTable;
 import org.apache.cassandra.db.Table.TableMetadata;
 import org.apache.cassandra.utils.FileUtils;
 import org.apache.cassandra.utils.XMLUtils;
@@ -114,304 +116,347 @@
     
     // the path qualified config file (storage-conf.xml) name
     private static String configFileName_;
-
-    public static Map<String, Map<String, CFMetaData>> init(String filePath) throws Throwable
-    {
-        /* Read the configuration file to retrieve DB related properties. */
-        String file = filePath + System.getProperty("file.separator") + "storage-conf.xml";
-        return initInternal(file);
-    }
-
-    public static Map<String, Map<String, CFMetaData>> init() throws Throwable
-    {
-        /* Read the configuration file to retrieve DB related properties. */
-        configFileName_ = System.getProperty("storage-config") + System.getProperty("file.separator") + "storage-conf.xml";
-        return initInternal(configFileName_);
-    }
     
-    public static Map<String, Map<String, CFMetaData>> initInternal(String file) throws Throwable
+    static
     {
-        String os = System.getProperty("os.name");
-        XMLUtils xmlUtils = new XMLUtils(file);        
+        try
+        {
+            String file = System.getProperty("storage-config") + System.getProperty("file.separator") + "storage-conf.xml";
+            String os = System.getProperty("os.name");
+            XMLUtils xmlUtils = new XMLUtils(file);
+
+            /* Cluster Name */
+            clusterName_ = xmlUtils.getNodeValue("/Storage/ClusterName");
+
+            /* Ganglia servers contact list */
+            gangliaServers_ = xmlUtils.getNodeValues("/Storage/GangliaServers/GangliaServer");
+
+            /* ZooKeeper's address */
+            zkAddress_ = xmlUtils.getNodeValue("/Storage/ZookeeperAddress");
+
+            /* Hashing strategy */
+            hashingStrategy_ = xmlUtils.getNodeValue("/Storage/HashingStrategy");
+            /* Callout location */
+            calloutLocation_ = xmlUtils.getNodeValue("/Storage/CalloutLocation");
+
+            /* JobTracker address */
+            jobTrackerHost_ = xmlUtils.getNodeValue("/Storage/JobTrackerHost");
+
+            /* Job Jar file location */
+            jobJarFileLocation_ = xmlUtils.getNodeValue("/Storage/JobJarFileLocation");
+
+            /* Zookeeper's session timeout */
+            String zkSessionTimeout = xmlUtils.getNodeValue("/Storage/ZookeeperSessionTimeout");
+            if ( zkSessionTimeout != null )
+                zkSessionTimeout_ = Integer.parseInt(zkSessionTimeout);
+
+            /* Data replication factor */
+            String replicationFactor = xmlUtils.getNodeValue("/Storage/ReplicationFactor");
+            if ( replicationFactor != null )
+                replicationFactor_ = Integer.parseInt(replicationFactor);
+
+            /* RPC Timeout */
+            String rpcTimeoutInMillis = xmlUtils.getNodeValue("/Storage/RpcTimeoutInMillis");
+            if ( rpcTimeoutInMillis != null )
+                rpcTimeoutInMillis_ = Integer.parseInt(rpcTimeoutInMillis);
+
+            /* Thread per pool */
+            String threadsPerPool = xmlUtils.getNodeValue("/Storage/ThreadsPerPool");
+            if ( threadsPerPool != null )
+                threadsPerPool_ = Integer.parseInt(threadsPerPool);
+
+            /* TCP port on which the storage system listens */
+            String port = xmlUtils.getNodeValue("/Storage/StoragePort");
+            if ( port != null )
+                storagePort_ = Integer.parseInt(port);
+
+            /* UDP port for control messages */
+            port = xmlUtils.getNodeValue("/Storage/ControlPort");
+            if ( port != null )
+                controlPort_ = Integer.parseInt(port);
+
+            /* HTTP port for HTTP messages */
+            port = xmlUtils.getNodeValue("/Storage/HttpPort");
+            if ( port != null )
+                httpPort_ = Integer.parseInt(port);
+
+            /* Touch Key Cache Size */
+            String touchKeyCacheSize = xmlUtils.getNodeValue("/Storage/TouchKeyCacheSize");
+            if ( touchKeyCacheSize != null )
+                touchKeyCacheSize_ = Integer.parseInt(touchKeyCacheSize);
+
+            /* Number of days to keep the memtable around w/o flushing */
+            String lifetime = xmlUtils.getNodeValue("/Storage/MemtableLifetimeInDays");
+            if ( lifetime != null )
+                memtableLifetime_ = Integer.parseInt(lifetime);
+
+            /* Size of the memtable in memory in MB before it is dumped */
+            String memtableSize = xmlUtils.getNodeValue("/Storage/MemtableSizeInMB");
+            if ( memtableSize != null )
+                memtableSize_ = Integer.parseInt(memtableSize);
+            /* Number of objects in millions in the memtable before it is dumped */
+            String memtableObjectCount = xmlUtils.getNodeValue("/Storage/MemtableObjectCountInMillions");
+            if ( memtableObjectCount != null )
+                memtableObjectCount_ = Integer.parseInt(memtableObjectCount);
+
+            /* This parameter enables or disables consistency checks.
+             * If set to false the read repairs are disable for very
+             * high throughput on reads but at the cost of consistency.*/
+            String doConsistencyCheck = xmlUtils.getNodeValue("/Storage/DoConsistencyChecksBoolean");
+            if ( doConsistencyCheck != null )
+                doConsistencyCheck_ = Boolean.parseBoolean(doConsistencyCheck);
+
+
+            /* read the size at which we should do column indexes */
+            String columnIndexSizeInKB = xmlUtils.getNodeValue("/Storage/ColumnIndexSizeInKB");
+            if(columnIndexSizeInKB == null)
+            {
+                columnIndexSizeInKB_ = 64;
+            }
+            else
+            {
+                columnIndexSizeInKB_ = Integer.parseInt(columnIndexSizeInKB);
+            }
 
-        /* Cluster Name */
-        clusterName_ = xmlUtils.getNodeValue("/Storage/ClusterName");
+            /* metadata directory */
+            metadataDirectory_ = xmlUtils.getNodeValue("/Storage/MetadataDirectory");
+            if ( metadataDirectory_ != null )
+                FileUtils.createDirectory(metadataDirectory_);
+            else
+            {
+                if ( os.equals("Linux") )
+                {
+                    metadataDirectory_ = "/var/storage/system";
+                }
+            }
 
-        /* Ganglia servers contact list */
-        gangliaServers_ = xmlUtils.getNodeValues("/Storage/GangliaServers/GangliaServer");
-        
-        /* ZooKeeper's address */
-        zkAddress_ = xmlUtils.getNodeValue("/Storage/ZookeeperAddress");
-        
-        /* Hashing strategy */
-        hashingStrategy_ = xmlUtils.getNodeValue("/Storage/HashingStrategy");
-        /* Callout location */
-        calloutLocation_ = xmlUtils.getNodeValue("/Storage/CalloutLocation");
-        
-        /* JobTracker address */
-        jobTrackerHost_ = xmlUtils.getNodeValue("/Storage/JobTrackerHost");
-        
-        /* Job Jar file location */
-        jobJarFileLocation_ = xmlUtils.getNodeValue("/Storage/JobJarFileLocation");       
-        
-        /* Zookeeper's session timeout */
-        String zkSessionTimeout = xmlUtils.getNodeValue("/Storage/ZookeeperSessionTimeout");
-        if ( zkSessionTimeout != null )
-            zkSessionTimeout_ = Integer.parseInt(zkSessionTimeout);
-
-        /* Data replication factor */
-        String replicationFactor = xmlUtils.getNodeValue("/Storage/ReplicationFactor");
-        if ( replicationFactor != null )
-        	replicationFactor_ = Integer.parseInt(replicationFactor);
-
-        /* RPC Timeout */
-        String rpcTimeoutInMillis = xmlUtils.getNodeValue("/Storage/RpcTimeoutInMillis");
-        if ( rpcTimeoutInMillis != null )
-        	rpcTimeoutInMillis_ = Integer.parseInt(rpcTimeoutInMillis);
-
-        /* Thread per pool */
-        String threadsPerPool = xmlUtils.getNodeValue("/Storage/ThreadsPerPool");
-        if ( threadsPerPool != null )
-            threadsPerPool_ = Integer.parseInt(threadsPerPool);
-
-        /* TCP port on which the storage system listens */
-        String port = xmlUtils.getNodeValue("/Storage/StoragePort");
-        if ( port != null )
-            storagePort_ = Integer.parseInt(port);
-
-        /* UDP port for control messages */
-        port = xmlUtils.getNodeValue("/Storage/ControlPort");
-        if ( port != null )
-            controlPort_ = Integer.parseInt(port);
-
-        /* HTTP port for HTTP messages */
-        port = xmlUtils.getNodeValue("/Storage/HttpPort");
-        if ( port != null )
-            httpPort_ = Integer.parseInt(port);
-
-        /* Touch Key Cache Size */
-        String touchKeyCacheSize = xmlUtils.getNodeValue("/Storage/TouchKeyCacheSize");
-        if ( touchKeyCacheSize != null )
-            touchKeyCacheSize_ = Integer.parseInt(touchKeyCacheSize);
-
-        /* Number of days to keep the memtable around w/o flushing */
-        String lifetime = xmlUtils.getNodeValue("/Storage/MemtableLifetimeInDays");
-        if ( lifetime != null )
-            memtableLifetime_ = Integer.parseInt(lifetime);
-        
-        /* Size of the memtable in memory in MB before it is dumped */
-        String memtableSize = xmlUtils.getNodeValue("/Storage/MemtableSizeInMB");
-        if ( memtableSize != null )
-        	memtableSize_ = Integer.parseInt(memtableSize);
-        /* Number of objects in millions in the memtable before it is dumped */
-        String memtableObjectCount = xmlUtils.getNodeValue("/Storage/MemtableObjectCountInMillions");
-        if ( memtableObjectCount != null )
-        	memtableObjectCount_ = Integer.parseInt(memtableObjectCount);
-        
-        /* This parameter enables or disables consistency checks. 
-         * If set to false the read repairs are disable for very
-         * high throughput on reads but at the cost of consistency.*/
-        String doConsistencyCheck = xmlUtils.getNodeValue("/Storage/DoConsistencyChecksBoolean");
-        if ( doConsistencyCheck != null )
-        	doConsistencyCheck_ = Boolean.parseBoolean(doConsistencyCheck);
-        
-        
-        /* read the size at which we should do column indexes */
-        String columnIndexSizeInKB = xmlUtils.getNodeValue("/Storage/ColumnIndexSizeInKB");
-        if(columnIndexSizeInKB == null)
-        {
-        	columnIndexSizeInKB_ = 64;
-        }
-        else
-        {
-        	columnIndexSizeInKB_ = Integer.parseInt(columnIndexSizeInKB);
-        }
+            /* snapshot directory */
+            snapshotDirectory_ = xmlUtils.getNodeValue("/Storage/SnapshotDirectory");
+            if ( snapshotDirectory_ != null )
+                FileUtils.createDirectory(snapshotDirectory_);
+            else
+            {
+                    snapshotDirectory_ = metadataDirectory_ + System.getProperty("file.separator") + "snapshot";
+            }
 
-        /* metadata directory */
-        metadataDirectory_ = xmlUtils.getNodeValue("/Storage/MetadataDirectory");
-        if ( metadataDirectory_ != null )
-            FileUtils.createDirectory(metadataDirectory_);
-        else
-        {
-            if ( os.equals("Linux") )
+            /* map output directory */
+            mapOutputDirectories_ = xmlUtils.getNodeValues("/Storage/MapOutputDirectories/MapOutputDirectory");
+            if ( mapOutputDirectories_.length > 0 )
             {
-                metadataDirectory_ = "/var/storage/system";
+                for ( String mapOutputDirectory : mapOutputDirectories_ )
+                    FileUtils.createDirectory(mapOutputDirectory);
             }
-        }
 
-        /* snapshot directory */
-        snapshotDirectory_ = xmlUtils.getNodeValue("/Storage/SnapshotDirectory");
-        if ( snapshotDirectory_ != null )
-            FileUtils.createDirectory(snapshotDirectory_);
-        else
-        {
-            	snapshotDirectory_ = metadataDirectory_ + System.getProperty("file.separator") + "snapshot";
-        }
-        
-        /* map output directory */
-        mapOutputDirectories_ = xmlUtils.getNodeValues("/Storage/MapOutputDirectories/MapOutputDirectory");
-        if ( mapOutputDirectories_.length > 0 )
-        {
-            for ( String mapOutputDirectory : mapOutputDirectories_ )
-                FileUtils.createDirectory(mapOutputDirectory);
-        }
-        
-        /* data file directory */
-        dataFileDirectories_ = xmlUtils.getNodeValues("/Storage/DataFileDirectories/DataFileDirectory");
-        if ( dataFileDirectories_.length > 0 )
-        {
-        	for ( String dataFileDirectory : dataFileDirectories_ )
-        		FileUtils.createDirectory(dataFileDirectory);
-        }
-        else
-        {
-            if ( os.equals("Linux") )
+            /* data file directory */
+            dataFileDirectories_ = xmlUtils.getNodeValues("/Storage/DataFileDirectories/DataFileDirectory");
+            if ( dataFileDirectories_.length > 0 )
             {
-                dataFileDirectories_ = new String[]{"/var/storage/data"};
+                for ( String dataFileDirectory : dataFileDirectories_ )
+                    FileUtils.createDirectory(dataFileDirectory);
+            }
+            else
+            {
+                if ( os.equals("Linux") )
+                {
+                    dataFileDirectories_ = new String[]{"/var/storage/data"};
+                }
             }
-        }
 
-        /* bootstrap file directory */
-        bootstrapFileDirectory_ = xmlUtils.getNodeValue("/Storage/BootstrapFileDirectory");
-        if ( bootstrapFileDirectory_ != null )
-            FileUtils.createDirectory(bootstrapFileDirectory_);
-        else
-        {
-            if ( os.equals("Linux") )
+            /* bootstrap file directory */
+            bootstrapFileDirectory_ = xmlUtils.getNodeValue("/Storage/BootstrapFileDirectory");
+            if ( bootstrapFileDirectory_ != null )
+                FileUtils.createDirectory(bootstrapFileDirectory_);
+            else
             {
-                bootstrapFileDirectory_ = "/var/storage/bootstrap";
+                if ( os.equals("Linux") )
+                {
+                    bootstrapFileDirectory_ = "/var/storage/bootstrap";
+                }
             }
-        }
 
-        /* commit log directory */
-        logFileDirectory_ = xmlUtils.getNodeValue("/Storage/CommitLogDirectory");
-        if ( logFileDirectory_ != null )
-            FileUtils.createDirectory(logFileDirectory_);
-        else
-        {
-            if ( os.equals("Linux") )
+            /* commit log directory */
+            logFileDirectory_ = xmlUtils.getNodeValue("/Storage/CommitLogDirectory");
+            if ( logFileDirectory_ != null )
+                FileUtils.createDirectory(logFileDirectory_);
+            else
             {
-                logFileDirectory_ = "/var/storage/commitlog";
+                if ( os.equals("Linux") )
+                {
+                    logFileDirectory_ = "/var/storage/commitlog";
+                }
             }
-        }
 
-        /* threshold after which commit log should be rotated. */
-        String value = xmlUtils.getNodeValue("/Storage/CommitLogRotationThresholdInMB");
-        if ( value != null)
-            logRotationThreshold_ = Integer.parseInt(value) * 1024 * 1024;
-
-        /* fast sync option */
-        value = xmlUtils.getNodeValue("/Storage/CommitLogFastSync");
-        if ( value != null )
-            fastSync_ = Boolean.parseBoolean(value);
-
-        tableToCFMetaDataMap_ = new HashMap<String, Map<String, CFMetaData>>();
-
-        /* Rack Aware option */
-        value = xmlUtils.getNodeValue("/Storage/RackAware");
-        if ( value != null )
-            rackAware_ = Boolean.parseBoolean(value);
-
-        /* Read the table related stuff from config */
-        NodeList tables = xmlUtils.getRequestedNodeList("/Storage/Tables/Table");
-        int size = tables.getLength();
-        for ( int i = 0; i < size; ++i )
-        {
-            Node table = tables.item(i);
+            /* threshold after which commit log should be rotated. */
+            String value = xmlUtils.getNodeValue("/Storage/CommitLogRotationThresholdInMB");
+            if ( value != null)
+                logRotationThreshold_ = Integer.parseInt(value) * 1024 * 1024;
+
+            /* fast sync option */
+            value = xmlUtils.getNodeValue("/Storage/CommitLogFastSync");
+            if ( value != null )
+                fastSync_ = Boolean.parseBoolean(value);
+
+            tableToCFMetaDataMap_ = new HashMap<String, Map<String, CFMetaData>>();
+
+            /* Rack Aware option */
+            value = xmlUtils.getNodeValue("/Storage/RackAware");
+            if ( value != null )
+                rackAware_ = Boolean.parseBoolean(value);
+
+            /* Read the table related stuff from config */
+            NodeList tables = xmlUtils.getRequestedNodeList("/Storage/Tables/Table");
+            int size = tables.getLength();
+            for ( int i = 0; i < size; ++i )
+            {
+                Node table = tables.item(i);
+
+                /* parsing out the table name */
+                String tName = XMLUtils.getAttributeValue(table, "Name");
+                tables_.add(tName);
+                tableToCFMetaDataMap_.put(tName, new HashMap<String, CFMetaData>());
+
+                String xqlTable = "/Storage/Tables/Table[@Name='" + tName + "']/";
+                NodeList columnFamilies = xmlUtils.getRequestedNodeList(xqlTable + "ColumnFamily");
+
+                // get name of the rowKey for this table
+                String n_rowKey = xmlUtils.getNodeValue(xqlTable + "RowKey");
+                if (n_rowKey == null)
+                    n_rowKey = d_rowKey_;
 
-            /* parsing out the table name */
-            String tName = XMLUtils.getAttributeValue(table, "Name");
-            tables_.add(tName);
-            tableToCFMetaDataMap_.put(tName, new HashMap<String, CFMetaData>());
-
-            String xqlTable = "/Storage/Tables/Table[@Name='" + tName + "']/";
-            NodeList columnFamilies = xmlUtils.getRequestedNodeList(xqlTable + "ColumnFamily");
-
-            // get name of the rowKey for this table
-            String n_rowKey = xmlUtils.getNodeValue(xqlTable + "RowKey");
-            if (n_rowKey == null)
-                n_rowKey = d_rowKey_;
-
-            //NodeList columnFamilies = xmlUtils.getRequestedNodeList(table, "ColumnFamily");            
-            int size2 = columnFamilies.getLength();
-
-            for ( int j = 0; j < size2; ++j )
-            {
-                Node columnFamily = columnFamilies.item(j);
-                String cName = XMLUtils.getAttributeValue(columnFamily, "Name");
-                String xqlCF = xqlTable + "ColumnFamily[@Name='" + cName + "']/";
-
-                /* squirrel away the application column families */
-                applicationColumnFamilies_.add(cName);
-
-                // Parse out the column type
-                String columnType = xmlUtils.getAttributeValue(columnFamily, "ColumnType");
-                columnType = ColumnFamily.getColumnType(columnType);
-
-                // Parse out the column family sorting property for columns
-                String columnIndexProperty = XMLUtils.getAttributeValue(columnFamily, "ColumnSort");
-                String columnIndexType = ColumnFamily.getColumnSortProperty(columnIndexProperty);
-
-                // Parse out user-specified logical names for the various dimensions
-                // of a the column family from the config.
-                String n_superColumnMap = xmlUtils.getNodeValue(xqlCF + "SuperColumnMap");
-                if (n_superColumnMap == null)
-                    n_superColumnMap = d_superColumnMap_;
-                
-                String n_superColumnKey = xmlUtils.getNodeValue(xqlCF + "SuperColumnKey");
-                if (n_superColumnKey == null)
-                    n_superColumnKey = d_superColumnKey_;
-                
-                String n_columnMap = xmlUtils.getNodeValue(xqlCF + "ColumnMap");
-                if (n_columnMap == null)
-                    n_columnMap = d_columnMap_;
-                
-                String n_columnKey = xmlUtils.getNodeValue(xqlCF + "ColumnKey");
-                if (n_columnKey == null)
-                    n_columnKey = d_columnKey_;
-
-                String n_columnValue = xmlUtils.getNodeValue(xqlCF + "ColumnValue");
-                if (n_columnValue == null)
-                    n_columnValue = d_columnValue_;
-
-                String n_columnTimestamp = xmlUtils.getNodeValue(xqlCF + "ColumnTimestamp");
-                if (n_columnTimestamp == null)
-                    n_columnTimestamp = d_columnTimestamp_;
-
-                // now populate the column family meta data and
-                // insert it into the table dictionary. 
-                CFMetaData cfMetaData = new CFMetaData();
-                
-                cfMetaData.tableName = tName;
-                cfMetaData.cfName = cName;
-                
-                cfMetaData.columnType = columnType;
-                cfMetaData.indexProperty_ = columnIndexType;
-
-                cfMetaData.n_rowKey = n_rowKey;
-                cfMetaData.n_columnMap = n_columnMap;
-                cfMetaData.n_columnKey = n_columnKey;
-                cfMetaData.n_columnValue = n_columnValue;
-                cfMetaData.n_columnTimestamp = n_columnTimestamp;
-                if ("Super".equals(columnType))
+                //NodeList columnFamilies = xmlUtils.getRequestedNodeList(table, "ColumnFamily");
+                int size2 = columnFamilies.getLength();
+
+                for ( int j = 0; j < size2; ++j )
                 {
-                    cfMetaData.n_superColumnKey = n_superColumnKey;
-                    cfMetaData.n_superColumnMap = n_superColumnMap;
+                    Node columnFamily = columnFamilies.item(j);
+                    String cName = XMLUtils.getAttributeValue(columnFamily, "Name");
+                    String xqlCF = xqlTable + "ColumnFamily[@Name='" + cName + "']/";
+
+                    /* squirrel away the application column families */
+                    applicationColumnFamilies_.add(cName);
+
+                    // Parse out the column type
+                    String columnType = xmlUtils.getAttributeValue(columnFamily, "ColumnType");
+                    columnType = ColumnFamily.getColumnType(columnType);
+
+                    // Parse out the column family sorting property for columns
+                    String columnIndexProperty = XMLUtils.getAttributeValue(columnFamily, "ColumnSort");
+                    String columnIndexType = ColumnFamily.getColumnSortProperty(columnIndexProperty);
+
+                    // Parse out user-specified logical names for the various dimensions
+                    // of a the column family from the config.
+                    String n_superColumnMap = xmlUtils.getNodeValue(xqlCF + "SuperColumnMap");
+                    if (n_superColumnMap == null)
+                        n_superColumnMap = d_superColumnMap_;
+
+                    String n_superColumnKey = xmlUtils.getNodeValue(xqlCF + "SuperColumnKey");
+                    if (n_superColumnKey == null)
+                        n_superColumnKey = d_superColumnKey_;
+
+                    String n_columnMap = xmlUtils.getNodeValue(xqlCF + "ColumnMap");
+                    if (n_columnMap == null)
+                        n_columnMap = d_columnMap_;
+
+                    String n_columnKey = xmlUtils.getNodeValue(xqlCF + "ColumnKey");
+                    if (n_columnKey == null)
+                        n_columnKey = d_columnKey_;
+
+                    String n_columnValue = xmlUtils.getNodeValue(xqlCF + "ColumnValue");
+                    if (n_columnValue == null)
+                        n_columnValue = d_columnValue_;
+
+                    String n_columnTimestamp = xmlUtils.getNodeValue(xqlCF + "ColumnTimestamp");
+                    if (n_columnTimestamp == null)
+                        n_columnTimestamp = d_columnTimestamp_;
+
+                    // now populate the column family meta data and
+                    // insert it into the table dictionary.
+                    CFMetaData cfMetaData = new CFMetaData();
+
+                    cfMetaData.tableName = tName;
+                    cfMetaData.cfName = cName;
+
+                    cfMetaData.columnType = columnType;
+                    cfMetaData.indexProperty_ = columnIndexType;
+
+                    cfMetaData.n_rowKey = n_rowKey;
+                    cfMetaData.n_columnMap = n_columnMap;
+                    cfMetaData.n_columnKey = n_columnKey;
+                    cfMetaData.n_columnValue = n_columnValue;
+                    cfMetaData.n_columnTimestamp = n_columnTimestamp;
+                    if ("Super".equals(columnType))
+                    {
+                        cfMetaData.n_superColumnKey = n_superColumnKey;
+                        cfMetaData.n_superColumnMap = n_superColumnMap;
+                    }
+
+                    tableToCFMetaDataMap_.get(tName).put(cName, cfMetaData);
                 }
+            }
 
-                tableToCFMetaDataMap_.get(tName).put(cName, cfMetaData);
+            /* Load the seeds for node contact points */
+            String[] seeds = xmlUtils.getNodeValues("/Storage/Seeds/Seed");
+            for( int i = 0; i < seeds.length; ++i )
+            {
+                seeds_.add( seeds[i] );
             }
         }
-
-        /* Load the seeds for node contact points */
-        String[] seeds = xmlUtils.getNodeValues("/Storage/Seeds/Seed");
-        for( int i = 0; i < seeds.length; ++i )
-        {            
-            seeds_.add( seeds[i] );
+        catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        
+        try
+        {
+            storeMetadata();
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException(e);
         }
-        return tableToCFMetaDataMap_;
     }
     
+
+    /*
+     * 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.
+    */
+    private static void storeMetadata() throws IOException
+    {
+        AtomicInteger idGenerator = new AtomicInteger(0);
+        Set<String> tables = tableToCFMetaDataMap_.keySet();
+
+        for ( String table : tables )
+        {
+            Table.TableMetadata tmetadata = Table.TableMetadata.instance();
+            if (tmetadata.isEmpty())
+            {
+                tmetadata = Table.TableMetadata.instance();
+                /* Column families associated with this table */
+                Map<String, CFMetaData> columnFamilies = tableToCFMetaDataMap_.get(table);
+
+                for (String columnFamily : columnFamilies.keySet())
+                {
+                    tmetadata.add(columnFamily, idGenerator.getAndIncrement(), DatabaseDescriptor.getColumnType(columnFamily));
+                }
+
+                /*
+                 * Here we add all the system related column families.
+                */
+                /* Add the TableMetadata column family to this map. */
+                tmetadata.add(Table.TableMetadata.cfName_, idGenerator.getAndIncrement());
+                /* Add the LocationInfo column family to this map. */
+                tmetadata.add(SystemTable.cfName_, idGenerator.getAndIncrement());
+                /* Add the recycle column family to this map. */
+                tmetadata.add(Table.recycleBin_, idGenerator.getAndIncrement());
+                /* Add the Hints column family to this map. */
+                tmetadata.add(Table.hints_, idGenerator.getAndIncrement(), ColumnFamily.getColumnType("Super"));
+                tmetadata.apply();
+                idGenerator.set(0);
+            }
+        }
+    }
+
     public static String getHashingStrategy()
     {
         return hashingStrategy_;
@@ -735,9 +780,9 @@
             return TypeInfo.LONG;
         }
     }
-    
-    public static void main(String[] args) throws Throwable
+
+    public static Map<String, Map<String, CFMetaData>> getTableToColumnFamilyMap()
     {
-        DatabaseDescriptor.initInternal("C:\\Engagements\\Cassandra-Golden\\storage-conf.xml");
+        return tableToCFMetaDataMap_;
     }
 }

Modified: incubator/cassandra/trunk/src/org/apache/cassandra/db/BinaryMemtable.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/org/apache/cassandra/db/BinaryMemtable.java?rev=759270&r1=759269&r2=759270&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/org/apache/cassandra/db/BinaryMemtable.java (original)
+++ incubator/cassandra/trunk/src/org/apache/cassandra/db/BinaryMemtable.java Fri Mar 27 17:06:18 2009
@@ -29,8 +29,9 @@
 import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.io.SSTable;
 import org.apache.cassandra.utils.BloomFilter;
+import org.apache.cassandra.io.SSTable;
+
 import org.apache.log4j.Logger;
 import org.cliffc.high_scale_lib.NonBlockingHashMap;
 

Modified: incubator/cassandra/trunk/src/org/apache/cassandra/db/CommitLog.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/org/apache/cassandra/db/CommitLog.java?rev=759270&r1=759269&r2=759270&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/org/apache/cassandra/db/CommitLog.java (original)
+++ incubator/cassandra/trunk/src/org/apache/cassandra/db/CommitLog.java Fri Mar 27 17:06:18 2009
@@ -626,9 +626,6 @@
     public static void main(String[] args) throws Throwable
     {
         LogUtil.init();
-
-        // the return value is not used in this case
-        DatabaseDescriptor.init();
         
         File logDir = new File(DatabaseDescriptor.getLogFileLocation());
         File[] files = logDir.listFiles();

Modified: incubator/cassandra/trunk/src/org/apache/cassandra/db/DBManager.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/org/apache/cassandra/db/DBManager.java?rev=759270&r1=759269&r2=759270&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/org/apache/cassandra/db/DBManager.java (original)
+++ incubator/cassandra/trunk/src/org/apache/cassandra/db/DBManager.java Fri Mar 27 17:06:18 2009
@@ -91,10 +91,7 @@
 
     public DBManager() throws Throwable
     {
-        /* Read the configuration file */
-        Map<String, Map<String, CFMetaData>> tableToColumnFamilyMap = DatabaseDescriptor.init();
-        storeMetadata(tableToColumnFamilyMap);
-        Set<String> tables = tableToColumnFamilyMap.keySet();
+        Set<String> tables = DatabaseDescriptor.getTableToColumnFamilyMap().keySet();
         
         for (String table : tables)
         {
@@ -107,47 +104,6 @@
     }
 
     /*
-     * 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.
-    */
-    private static void storeMetadata(Map<String, Map<String, CFMetaData>> tableToColumnFamilyMap) throws Throwable
-    {
-        AtomicInteger idGenerator = new AtomicInteger(0);
-        Set<String> tables = tableToColumnFamilyMap.keySet();
-
-        for ( String table : tables )
-        {
-            Table.TableMetadata tmetadata = Table.TableMetadata.instance();
-            if ( tmetadata.isEmpty() )
-            {
-                tmetadata = Table.TableMetadata.instance();
-                /* Column families associated with this table */
-                Map<String, CFMetaData> columnFamilies = tableToColumnFamilyMap.get(table);
-
-                for (String columnFamily : columnFamilies.keySet())
-                {
-                    tmetadata.add(columnFamily, idGenerator.getAndIncrement(), DatabaseDescriptor.getColumnType(columnFamily));
-                }
-
-                /*
-                 * Here we add all the system related column families. 
-                */
-                /* Add the TableMetadata column family to this map. */
-                tmetadata.add(Table.TableMetadata.cfName_, idGenerator.getAndIncrement());
-                /* Add the LocationInfo column family to this map. */
-                tmetadata.add(SystemTable.cfName_, idGenerator.getAndIncrement());
-                /* Add the recycle column family to this map. */
-                tmetadata.add(Table.recycleBin_, idGenerator.getAndIncrement());
-                /* Add the Hints column family to this map. */
-                tmetadata.add(Table.hints_, idGenerator.getAndIncrement(), ColumnFamily.getColumnType("Super"));
-                tmetadata.apply();
-                idGenerator.set(0);
-            }
-        }
-    }
-
-    /*
      * This method reads the system table and retrieves the metadata
      * associated with this storage instance. Currently we store the
      * metadata in a Column Family called LocatioInfo which has two

Modified: incubator/cassandra/trunk/src/org/apache/cassandra/db/RecoveryManager.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/org/apache/cassandra/db/RecoveryManager.java?rev=759270&r1=759269&r2=759270&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/org/apache/cassandra/db/RecoveryManager.java (original)
+++ incubator/cassandra/trunk/src/org/apache/cassandra/db/RecoveryManager.java Fri Mar 27 17:06:18 2009
@@ -93,7 +93,6 @@
     
     public static void main(String[] args) throws Throwable
     {
-        DatabaseDescriptor.init();
         long start = System.currentTimeMillis();
         RecoveryManager rm = RecoveryManager.instance();
         rm.doRecovery();  

Modified: incubator/cassandra/trunk/src/org/apache/cassandra/db/SystemTable.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/org/apache/cassandra/db/SystemTable.java?rev=759270&r1=759269&r2=759270&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/org/apache/cassandra/db/SystemTable.java (original)
+++ incubator/cassandra/trunk/src/org/apache/cassandra/db/SystemTable.java Fri Mar 27 17:06:18 2009
@@ -45,7 +45,7 @@
     /* Name of the SystemTable */
     public static final String name_ = "System";
     /* Name of the only column family in the Table */
-    static final String cfName_ = "LocationInfo";
+    public static final String cfName_ = "LocationInfo";
     /* Name of columns in this table */
     static final String generation_ = "Generation";
     static final String token_ = "Token";

Modified: incubator/cassandra/trunk/src/org/apache/cassandra/db/Table.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/org/apache/cassandra/db/Table.java?rev=759270&r1=759269&r2=759270&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/org/apache/cassandra/db/Table.java (original)
+++ incubator/cassandra/trunk/src/org/apache/cassandra/db/Table.java Fri Mar 27 17:06:18 2009
@@ -153,7 +153,7 @@
             cfTypeMap_.put(cf, type);
         }
         
-        boolean isEmpty()
+        public boolean isEmpty()
         {
             return cfIdMap_.isEmpty();
         }
@@ -193,7 +193,7 @@
             return cfIdMap_.containsKey(cfName);
         }
         
-        void apply() throws IOException
+        public void apply() throws IOException
         {
             String table = DatabaseDescriptor.getTables().get(0);
             DataOutputBuffer bufOut = new DataOutputBuffer();
@@ -895,13 +895,4 @@
         long timeTaken = System.currentTimeMillis() - start;
         dbAnalyticsSource_.updateWriteStatistics(timeTaken);
     }
-
-    public static void main(String[] args) throws Throwable
-    {
-        StorageService service = StorageService.instance();
-        service.start();
-        Table table = Table.open("Mailbox");
-        Row row = table.get("35300190:1");
-        System.out.println( row.key() );
-    }
 }

Modified: incubator/cassandra/trunk/src/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/org/apache/cassandra/service/StorageService.java?rev=759270&r1=759269&r2=759270&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/org/apache/cassandra/service/StorageService.java (original)
+++ incubator/cassandra/trunk/src/org/apache/cassandra/service/StorageService.java Fri Mar 27 17:06:18 2009
@@ -171,7 +171,7 @@
     
     public static PartitionerType getPartitionerType()
     {
-        return (DatabaseDescriptor.getHashingStrategy().equalsIgnoreCase(DatabaseDescriptor.ophf_)) ? PartitionerType.OPHF : PartitionerType.RANDOM;
+        return (DatabaseDescriptor.ophf_.equalsIgnoreCase(DatabaseDescriptor.getHashingStrategy())) ? PartitionerType.OPHF : PartitionerType.RANDOM;
     }
 
     /**
@@ -444,10 +444,10 @@
     	components_.add(component);
     }
 
-    private void initPartitioner()
+    static
     {
         String hashingStrategy = DatabaseDescriptor.getHashingStrategy();
-        if ( hashingStrategy.equalsIgnoreCase(DatabaseDescriptor.ophf_) )
+        if (DatabaseDescriptor.ophf_.equalsIgnoreCase(hashingStrategy))
         {
             partitioner_ = new OrderPreservingHashPartitioner();
         }        
@@ -458,9 +458,7 @@
     }
     
     public void start() throws Throwable
-    {        
-    	/* Set up the partitioner */
-        initPartitioner();
+    {
         /* Start the DB */
         storageMetadata_ = DBManager.instance().start();  
         /* Set up TCP endpoint */

Modified: incubator/cassandra/trunk/src/org/apache/cassandra/test/DBTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/org/apache/cassandra/test/DBTest.java?rev=759270&r1=759269&r2=759270&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/org/apache/cassandra/test/DBTest.java (original)
+++ incubator/cassandra/trunk/src/org/apache/cassandra/test/DBTest.java Fri Mar 27 17:06:18 2009
@@ -182,7 +182,6 @@
         //doWrites();
         //doRead("543");
         
-        DatabaseDescriptor.init();
         DBTest.doTest();
     }
 }

Added: incubator/cassandra/trunk/test/org/apache/cassandra/ServerTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/ServerTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/ServerTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/ServerTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,22 @@
+package org.apache.cassandra;
+
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeMethod;
+
+import java.io.File;
+
+@Test(groups={"serial"})
+public class ServerTest {
+    // TODO clean up static structures too (e.g. memtables)
+    @BeforeMethod
+    public void cleanup() {
+        // for convenience, this assumes that you haven't changed the test config away from storing everything
+        // under /var/cassandra.
+        for (String dirname : new String[] {"bootstrap", "commitlog", "data", "staging", "system"}) {
+            File dir = new File("/var/cassandra", dirname);
+            for (File f : dir.listFiles()) {
+                f.delete();
+            }
+        }
+    }
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnComparatorFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnComparatorFactoryTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnComparatorFactoryTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnComparatorFactoryTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,25 @@
+package org.apache.cassandra.db;
+
+import org.testng.annotations.Test;
+
+import java.util.Comparator;
+
+public class ColumnComparatorFactoryTest {
+    public Comparator<IColumn> nameComparator;
+
+    @Test
+    public void testLT() {
+        IColumn col1 = new Column("Column-8");
+        IColumn col2 = new Column("Column-9");
+        nameComparator = ColumnComparatorFactory.getComparator(ColumnComparatorFactory.ComparatorType.NAME);
+        assert nameComparator.compare(col1, col2) < 0;
+    }
+
+    @Test
+    public void testGT() {
+        IColumn col1 = new Column("Column-9");
+        IColumn col2 = new Column("Column-10");
+        // tricky -- remember we're comparing _lexically_
+        assert nameComparator.compare(col1, col2) > 0;
+	}
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,114 @@
+package org.apache.cassandra.db;
+
+import org.apache.cassandra.ServerTest;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Random;
+
+public class ColumnFamilyStoreTest extends ServerTest {
+    @Test
+    public void testMain() throws IOException, ColumnFamilyNotDefinedException {
+        Table table = Table.open("Table1");
+        Random random = new Random();
+        byte[] bytes1 = new byte[1024];
+        byte[] bytes2 = new byte[1024];
+        random.nextBytes(bytes1);
+        random.nextBytes(bytes2);
+
+        for (int i = 800; i < 1000; ++i)
+        {
+            String key = Integer.toString(i);
+            RowMutation rm;
+            for ( int j = 0; j < 8; ++j )
+            {
+                byte[] bytes = j % 2 == 0 ? bytes1 : bytes2;
+                rm = new RowMutation("Table1", key);
+                rm.add("Standard1:" + "Column-" + j, bytes, j);
+                rm.apply();
+
+                for ( int k = 0; k < 8; ++k )
+                {
+                    bytes = (j + k) % 2 == 0 ? bytes1 : bytes2;
+                    rm = new RowMutation("Table1", key);
+                    rm.add("Super1:" + "SuperColumn-" + j + ":Column-" + k, bytes, k);
+                    rm.apply();
+                }
+            }
+        }
+
+        for ( int i = 800; i < 1000; ++i )
+        {
+            String key = Integer.toString(i);
+            // TODO actually test results
+            ColumnFamily cf = table.get(key, "Super1:SuperColumn-1");
+            assert cf != null;
+            Collection<IColumn> superColumns = cf.getAllColumns();
+            for ( IColumn superColumn : superColumns )
+            {
+                Collection<IColumn> subColumns = superColumn.getSubColumns();
+                for ( IColumn subColumn : subColumns )
+                {
+                    //System.out.println(subColumn);
+                }
+            }
+        }
+    }
+
+    @Test
+    public void testRemove() throws IOException, ColumnFamilyNotDefinedException {
+        Table table = Table.open("Table1");
+        ColumnFamilyStore store = table.getColumnFamilyStore("Standard1");
+        RowMutation rm;
+
+        // add data
+        rm = new RowMutation("Table1", "key1");
+        rm.add("Standard1:Column1", "asdf".getBytes(), 0);
+        rm.apply();
+        store.forceFlush();
+
+        // remove
+        rm = new RowMutation("Table1", "key1");
+        ColumnFamily cf = new ColumnFamily("Standard1");
+        cf.delete(1);
+        rm.add(cf.name(), cf);
+        rm.apply();
+
+        ColumnFamily retrieved = store.getColumnFamily("key1", "Standard1", new IdentityFilter());
+        assert retrieved.getColumnCount() == 0;
+    }
+
+    @Test
+    public void testRemoveSuperColumn() throws IOException, ColumnFamilyNotDefinedException {
+        Table table = Table.open("Table1");
+        ColumnFamilyStore store = table.getColumnFamilyStore("Super1");
+        RowMutation rm;
+
+        // add data
+        rm = new RowMutation("Table1", "key1");
+        rm.add("Super1:SC1:Column1", "asdf".getBytes(), 0);
+        rm.apply();
+        store.forceFlush();
+
+        // remove
+        rm = new RowMutation("Table1", "key1");
+        ColumnFamily cf = new ColumnFamily("Super1");
+        SuperColumn sc = new SuperColumn("SC1");
+        sc.markForDeleteAt(1);
+        cf.addColumn(sc);
+        rm.add(cf.name(), cf);
+        rm.apply();
+
+        List<ColumnFamily> families = store.getColumnFamilies("key1", "Super1", new IdentityFilter());
+        assert families.get(0).getAllColumns().first().getMarkedForDeleteAt() == 1; // delete marker, just added
+        assert !families.get(1).getAllColumns().first().isMarkedForDelete(); // flushed old version
+        ColumnFamily resolved = ColumnFamilyStore.resolve(families);
+        assert resolved.getAllColumns().first().getMarkedForDeleteAt() == 1;
+        Collection<IColumn> subColumns = resolved.getAllColumns().first().getSubColumns();
+        assert subColumns.size() == 1;
+        assert subColumns.iterator().next().timestamp() == 0;
+        assert ColumnFamilyStore.removeDeleted(resolved).getColumnCount() == 0;
+    }
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,67 @@
+package org.apache.cassandra.db;
+
+import org.apache.cassandra.io.DataInputBuffer;
+import org.apache.cassandra.io.DataOutputBuffer;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Random;
+import java.util.TreeMap;
+
+public class ColumnFamilyTest
+{
+    // TODO test SuperColumns
+
+    @Test
+    public void testSingleColumn() throws IOException {
+        Random random = new Random();
+        byte[] bytes = new byte[1024];
+        random.nextBytes(bytes);
+        ColumnFamily cf;
+
+        cf = new ColumnFamily("Standard1", "Standard");
+        cf.addColumn("C", bytes, 1);
+        DataOutputBuffer bufOut = new DataOutputBuffer();
+        ColumnFamily.serializer().serialize(cf, bufOut);
+
+        DataInputBuffer bufIn = new DataInputBuffer();
+        bufIn.reset(bufOut.getData(), bufOut.getLength());
+        cf = ColumnFamily.serializer().deserialize(bufIn);
+        assert cf != null;
+        assert cf.name().equals("Standard1");
+        assert cf.getAllColumns().size() == 1;
+    }
+
+    @Test
+    public void testManyColumns() throws IOException {
+        ColumnFamily cf;
+
+        TreeMap<String, byte[]> map = new TreeMap<String,byte[]>();
+        for ( int i = 100; i < 1000; ++i )
+        {
+            map.put(Integer.toString(i), ("Avinash Lakshman is a good man: " + i).getBytes());
+        }
+
+        // write
+        cf = new ColumnFamily("Standard1", "Standard");
+        DataOutputBuffer bufOut = new DataOutputBuffer();
+        for (String cName: map.navigableKeySet())
+        {
+            cf.addColumn(cName, map.get(cName), 314);
+        }
+        ColumnFamily.serializer().serialize(cf, bufOut);
+
+        // verify
+        DataInputBuffer bufIn = new DataInputBuffer();
+        bufIn.reset(bufOut.getData(), bufOut.getLength());
+        cf = ColumnFamily.serializer().deserialize(bufIn);
+        for (String cName: map.navigableKeySet())
+        {
+            assert Arrays.equals(cf.getColumn(cName).value(), map.get(cName));
+
+        }
+        assert new HashSet<String>(cf.getColumns().keySet()).equals(map.keySet());
+    }
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/db/CommitLogTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/db/CommitLogTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/db/CommitLogTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/db/CommitLogTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,45 @@
+package org.apache.cassandra.db;
+
+import org.testng.annotations.Test;
+
+import java.util.Set;
+import java.util.Map;
+import java.util.Arrays;
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.io.DataInputBuffer;
+import org.apache.cassandra.ServerTest;
+
+public class CommitLogTest extends ServerTest {
+    @Test
+    public void testMain() throws IOException {
+        // TODO this is useless, since it assumes we have a working set of commit logs to parse
+        /*
+        File logDir = new File(DatabaseDescriptor.getLogFileLocation());
+        File[] files = logDir.listFiles();
+        Arrays.sort( files, new FileUtils.FileComparator() );
+
+        byte[] bytes = new byte[CommitLogHeader.size(Integer.parseInt(args[0]))];
+        for ( File file : files )
+        {
+            CommitLog clog = new CommitLog( file );
+            clog.readCommitLogHeader(file.getAbsolutePath(), bytes);
+            DataInputBuffer bufIn = new DataInputBuffer();
+            bufIn.reset(bytes, 0, bytes.length);
+            CommitLogHeader clHeader = CommitLogHeader.serializer().deserialize(bufIn);
+
+            StringBuilder sb = new StringBuilder("");
+            for ( byte b : bytes )
+            {
+                sb.append(b);
+                sb.append(" ");
+            }
+
+            System.out.println("FILE:" + file);
+            System.out.println(clHeader.toString());
+        }
+        */
+    }
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/db/DBManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/db/DBManagerTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/db/DBManagerTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/db/DBManagerTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,12 @@
+package org.apache.cassandra.db;
+
+import org.testng.annotations.Test;
+import org.apache.cassandra.ServerTest;
+
+public class DBManagerTest extends ServerTest {
+    @Test
+    public void testMain() throws Throwable {
+        // TODO clean up old detritus
+        DBManager.instance().start();
+    }
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/db/RecoveryManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/db/RecoveryManagerTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/db/RecoveryManagerTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/db/RecoveryManagerTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,16 @@
+package org.apache.cassandra.db;
+
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+
+import org.apache.cassandra.ServerTest;
+
+public class RecoveryManagerTest extends ServerTest {
+    @Test
+    public void testDoRecovery() throws IOException {
+        // TODO nothing to recover
+        RecoveryManager rm = RecoveryManager.instance();
+        rm.doRecovery();  
+    }
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/db/SystemTableTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/db/SystemTableTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/db/SystemTableTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/db/SystemTableTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,14 @@
+package org.apache.cassandra.db;
+
+import org.apache.cassandra.ServerTest;
+import org.apache.cassandra.service.StorageService;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+
+public class SystemTableTest extends ServerTest {
+    @Test
+    public void testMain() throws IOException {
+        SystemTable.openSystemTable(SystemTable.cfName_).updateToken( StorageService.hash("503545744:0") );
+    }
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/db/TableTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/db/TableTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/db/TableTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/db/TableTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,15 @@
+package org.apache.cassandra.db;
+
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+
+import org.apache.cassandra.service.StorageService;
+
+public class TableTest {
+    @Test
+    public void testOpen() throws Throwable {
+        Table table = Table.open("Mailbox");
+        Row row = table.get("35300190:1");
+    }
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/dht/RangeTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/dht/RangeTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/dht/RangeTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/dht/RangeTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,20 @@
+package org.apache.cassandra.dht;
+
+import org.testng.annotations.Test;
+
+import java.math.BigInteger;
+
+public class RangeTest {
+    @Test
+    public void testRange() {
+        Range left = new Range(new BigInteger("0"), new BigInteger("100"));
+        assert left.contains(new BigInteger("10"));
+        assert !left.contains(new BigInteger("-1"));
+        assert !left.contains(new BigInteger("101"));
+
+        Range right = new Range(new BigInteger("100"), new BigInteger("0"));
+        assert right.contains(new BigInteger("200"));
+        assert right.contains(new BigInteger("-10"));
+        assert !right.contains(new BigInteger("1"));
+    }
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/io/DataInputBufferTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/io/DataInputBufferTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/io/DataInputBufferTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/io/DataInputBufferTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,39 @@
+package org.apache.cassandra.io;
+
+import org.testng.annotations.Test;
+
+import java.util.Random;
+import java.io.IOException;
+
+public class DataInputBufferTest {
+    @Test
+    public void testRandom() throws IOException {
+        Random random = new Random();
+        byte[] bytes = new byte[1024*1024];
+        random.nextBytes(bytes);
+
+        DataInputBuffer.FastByteArrayInputStream bis = new DataInputBuffer.FastByteArrayInputStream(bytes);
+        int read = 0;
+        int n = 0;
+        while ( true )
+        {
+            read = bis.read();
+            if ( read == -1 )
+                break;
+            assert read == ((int)bytes[n++]&0xFF);
+        }
+        assert n == bytes.length;
+    }
+
+    @Test
+    public void testSmall() throws IOException {
+        DataOutputBuffer bufOut = new DataOutputBuffer();
+        bufOut.writeUTF("Avinash");
+        bufOut.writeInt(41*1024*1024);
+        DataInputBuffer bufIn = new DataInputBuffer();
+        bufIn.reset(bufOut.getData(), bufOut.getLength());
+        assert bufIn.readUTF().equals("Avinash");
+        assert bufIn.readInt() == 41 * 1024 * 1024;
+    }
+
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/io/SSTableTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/io/SSTableTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/io/SSTableTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/io/SSTableTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,75 @@
+package org.apache.cassandra.io;
+
+import org.apache.cassandra.ServerTest;
+import org.apache.cassandra.db.FileStruct;
+import org.apache.cassandra.utils.BloomFilter;
+import org.apache.commons.collections.CollectionUtils;
+import org.testng.annotations.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+
+public class SSTableTest extends ServerTest {
+    // @Test
+    public void testSingleWrite() throws IOException {
+        File f = File.createTempFile("sstable", "");
+        SSTable ssTable;
+
+        // write test data
+        ssTable = new SSTable(f.getParent(), f.getName());
+        BloomFilter bf = new BloomFilter(1000, 8);
+        Random random = new Random();
+        byte[] bytes = new byte[1024];
+        random.nextBytes(bytes);
+
+        String key = Integer.toString(1);
+        ssTable.append(key, bytes);
+        bf.fill(key);
+        ssTable.close(bf);
+
+        // TODO append/next are not symmetrical ops anymore
+        
+        // verify
+        ssTable = new SSTable(f.getPath() + "-Data.db");
+        DataInputBuffer bufIn = ssTable.next(key, "Test:C");
+        byte[] bytes2 = new byte[1024];
+        bufIn.readFully(bytes2);
+        assert Arrays.equals(bytes2, bytes);
+    }
+
+    // @Test
+    public void testManyWrites() throws IOException {
+        File f = File.createTempFile("sstable", "");
+        SSTable ssTable;
+
+        TreeMap<String, byte[]> map = new TreeMap<String,byte[]>();
+        for ( int i = 100; i < 1000; ++i )
+        {
+            map.put(Integer.toString(i), ("Avinash Lakshman is a good man: " + i).getBytes());
+        }
+
+        // write
+        ssTable = new SSTable(f.getParent(), f.getName());
+        BloomFilter bf = new BloomFilter(1000, 8);
+        for (String key: map.navigableKeySet())
+        {
+            ssTable.append(key, map.get(key));
+        }
+        ssTable.close(bf);
+
+        // TODO append/next are not symmetrical ops anymore
+
+        // verify
+        List<String> keys = new ArrayList(map.keySet());
+        Collections.shuffle(keys);
+        ssTable = new SSTable(f.getPath() + "-Data.db");
+        for (String key: keys)
+        {
+            DataInputBuffer bufIn = ssTable.next(key, "Test:C");
+            byte[] bytes2 = new byte[map.get(key).length];
+            bufIn.readFully(bytes2);
+            assert Arrays.equals(bytes2, map.get(key));
+        }
+    }
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/service/CassandraServerTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/service/CassandraServerTest.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/service/CassandraServerTest.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/service/CassandraServerTest.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,46 @@
+package org.apache.cassandra.service;
+
+import org.apache.cassandra.ServerTest;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.IteratorUtils;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.util.*;
+
+public class CassandraServerTest extends ServerTest {
+    /*
+    @Test
+    public void test_get_column() throws Throwable {
+        CassandraServer server = new CassandraServer();
+        server.start();
+
+        try {
+            column_t c1 = new column_t("c1", "0", 0L);
+            column_t c2 = new column_t("c2", "0", 0L);
+            List<column_t> columns = new ArrayList<column_t>();
+            columns.add(c1);
+            columns.add(c2);
+            Map<String, List<column_t>> cfmap = new HashMap<String, List<column_t>>();
+            cfmap.put("Standard1", columns);
+            cfmap.put("Standard2", columns);
+
+            batch_mutation_t m = new batch_mutation_t("Table1", "key1", cfmap);
+            server.batch_insert(m, 1);
+
+            column_t column;
+            column = server.get_column("Table1", "key1", "Standard1:c2");
+            assert column.value.equals("0");
+
+            column = server.get_column("Table1", "key1", "Standard2:c2");
+            assert column.value.equals("0");
+
+            ArrayList<column_t> column_ts = server.get_slice_strong("Table1", "key1", "Standard1", -1, -1);
+            assert column_ts.size() == 2;
+        } finally {
+            server.shutdown();
+        }
+    }
+    */
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/utils/KeyGenerator.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/utils/KeyGenerator.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/utils/KeyGenerator.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/utils/KeyGenerator.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,148 @@
+package org.apache.cassandra.utils;
+
+import java.io.*;
+import java.util.Random;
+
+public class KeyGenerator {
+    private static String randomKey(Random r) {
+        StringBuffer buffer = new StringBuffer();
+        for (int j = 0; j < 16; j++) {
+            buffer.append((char)r.nextInt());
+        }
+        return buffer.toString();
+    }
+
+    static class RandomStringGenerator implements ResetableIterator<String> {
+        int i, n, seed;
+        Random random;
+
+        RandomStringGenerator(int seed, int n) {
+            i = 0;
+            this.seed = seed;
+            this.n = n;
+            reset();
+        }
+
+        public int size() {
+            return n;
+        }
+
+        public void reset() {
+            random = new Random(seed);
+        }
+
+        public boolean hasNext() {
+            return i < n;
+        }
+
+        public String next() {
+            i++;
+            return randomKey(random);
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    static class IntGenerator implements ResetableIterator<String> {
+        private int i, start, n;
+
+        IntGenerator(int n) {
+            this(0, n);
+        }
+
+        IntGenerator(int start, int n) {
+            this.start = start;
+            this.n = n;
+            reset();
+        }
+
+        public int size() {
+            return n - start;
+        }
+
+        public void reset() {
+            i = start;
+        }
+
+        public boolean hasNext() {
+            return i < n;
+        }
+
+        public String next() {
+            return Integer.toString(i++);
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    static class WordGenerator implements ResetableIterator<String> {
+        static int WORDS;
+
+        static {
+            try {
+                BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("/usr/share/dict/words")));
+                while (br.ready()) {
+                    br.readLine();
+                    WORDS++;
+                }
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        BufferedReader reader;
+        private int modulo;
+        private int skip;
+        String next;
+
+        WordGenerator(int skip, int modulo) {
+            this.skip = skip;
+            this.modulo = modulo;
+            reset();
+        }
+
+        public int size() {
+            return (1 + WORDS - skip) / modulo;
+        }
+
+        public void reset() {
+            try {
+                reader = new BufferedReader(new InputStreamReader(new FileInputStream("/usr/share/dict/words")));
+            } catch (FileNotFoundException e) {
+                throw new RuntimeException(e);
+            }
+            for (int i = 0; i < skip; i++) {
+                try {
+                    reader.readLine();
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+            next();
+        }
+
+        public boolean hasNext() {
+            return next != null;
+        }
+
+        public String next() {
+            try {
+                String s = next;
+                for (int i = 0; i < modulo; i++) {
+                    next = reader.readLine();
+                }
+                return s;
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+    }
+}

Added: incubator/cassandra/trunk/test/org/apache/cassandra/utils/ResetableIterator.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/utils/ResetableIterator.java?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/org/apache/cassandra/utils/ResetableIterator.java (added)
+++ incubator/cassandra/trunk/test/org/apache/cassandra/utils/ResetableIterator.java Fri Mar 27 17:06:18 2009
@@ -0,0 +1,9 @@
+package org.apache.cassandra.utils;
+
+import java.util.Iterator;
+
+public interface ResetableIterator<T> extends Iterator<T> {
+    public void reset();
+
+    int size();
+}

Added: incubator/cassandra/trunk/test/testng.xml
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/testng.xml?rev=759270&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/testng.xml (added)
+++ incubator/cassandra/trunk/test/testng.xml Fri Mar 27 17:06:18 2009
@@ -0,0 +1 @@
+<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >