You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by gd...@apache.org on 2010/01/20 14:57:50 UTC

svn commit: r901207 [2/2] - in /incubator/cassandra/trunk: ./ interface/ interface/gen-java/org/apache/cassandra/service/ src/java/org/apache/cassandra/db/ src/java/org/apache/cassandra/service/ test/system/ test/unit/org/apache/cassandra/db/ test/unit...

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=901207&r1=901206&r2=901207&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 Wed Jan 20 13:57:49 2010
@@ -921,130 +921,12 @@
      * @param stopAt key to stop at, inclusive.  empty string = stop only when keys are exhausted.
      * @param maxResults
      * @return list of keys between startWith and stopAt
-     */
-    public RangeReply getKeyRange(final String startWith, final String stopAt, int maxResults)
-    throws IOException, ExecutionException, InterruptedException
-    {
-        final DecoratedKey startWithDK = partitioner.decorateKey(startWith);
-        final DecoratedKey stopAtDK = partitioner.decorateKey(stopAt);
-
-        // create a CollatedIterator that will return unique keys from different sources
-        // (current memtable, historical memtables, and SSTables) in the correct order.
-        List<Iterator<DecoratedKey>> iterators = new ArrayList<Iterator<DecoratedKey>>();
-
-        // we iterate through memtables with a priority queue to avoid more sorting than necessary.
-        // this predicate throws out the keys before the start of our range.
-        Predicate<DecoratedKey> p = new Predicate<DecoratedKey>()
-        {
-            public boolean apply(DecoratedKey key)
-            {
-                return startWithDK.compareTo(key) <= 0
-                       && (stopAt.isEmpty() || key.compareTo(stopAtDK) <= 0);
-            }
-        };
-
-        // current memtable keys.  have to go through the CFS api for locking.
-        iterators.add(Iterators.filter(memtableKeyIterator(), p));
-        // historical memtables
-        for (Memtable memtable : ColumnFamilyStore.getUnflushedMemtables(columnFamily_))
-        {
-            iterators.add(Iterators.filter(memtable.getKeyIterator(), p));
-        }
-
-        // sstables
-        for (SSTableReader sstable : ssTables_)
-        {
-            final SSTableScanner scanner = sstable.getScanner(KEY_RANGE_FILE_BUFFER_SIZE);
-            scanner.seekTo(startWithDK);
-            Iterator<DecoratedKey> iter = new CloseableIterator<DecoratedKey>()
-            {
-                public boolean hasNext()
-                {
-                    return scanner.hasNext();
-                }
-                public DecoratedKey next()
-                {
-                    return scanner.next().getKey();
-                }
-                public void remove()
-                {
-                    throw new UnsupportedOperationException();
-                }
-                public void close() throws IOException
-                {
-                    scanner.close();
-                }
-            };
-            assert iter instanceof Closeable; // otherwise we leak FDs
-            iterators.add(iter);
-        }
-
-        Iterator<DecoratedKey> collated = IteratorUtils.collatedIterator(DecoratedKey.comparator, iterators);
-        Iterable<DecoratedKey> reduced = new ReducingIterator<DecoratedKey, DecoratedKey>(collated) {
-            DecoratedKey current;
-
-            public void reduce(DecoratedKey current)
-            {
-                 this.current = current;
-            }
-
-            protected DecoratedKey getReduced()
-            {
-                return current;
-            }
-        };
-
-        try
-        {
-            // pull keys out of the CollatedIterator.  checking tombstone status is expensive,
-            // so we set an arbitrary limit on how many we'll do at once.
-            List<String> keys = new ArrayList<String>();
-            boolean rangeCompletedLocally = false;
-            for (DecoratedKey current : reduced)
-            {
-                if (!stopAt.isEmpty() && stopAtDK.compareTo(current) < 0)
-                {
-                    rangeCompletedLocally = true;
-                    break;
-                }
-                // make sure there is actually non-tombstone content associated w/ this key
-                // TODO record the key source(s) somehow and only check that source (e.g., memtable or sstable)
-                QueryFilter filter = new SliceQueryFilter(current.key, new QueryPath(columnFamily_), ArrayUtils.EMPTY_BYTE_ARRAY, ArrayUtils.EMPTY_BYTE_ARRAY, false, 1);
-                if (getColumnFamily(filter, Integer.MAX_VALUE) != null)
-                {
-                    keys.add(current.key);
-                }
-                if (keys.size() >= maxResults)
-                {
-                    rangeCompletedLocally = true;
-                    break;
-                }
-            }
-            return new RangeReply(keys, rangeCompletedLocally);
-        }
-        finally
-        {
-            for (Iterator iter : iterators)
-            {
-                if (iter instanceof Closeable)
-                {
-                    ((Closeable)iter).close();
-                }
-            }
-        }
-    }
-
-    /**
-     * @param startWith key to start with, inclusive.  empty string = start at beginning.
-     * @param stopAt key to stop at, inclusive.  empty string = stop only when keys are exhausted.
-     * @param maxResults
-     * @return list of keys between startWith and stopAt
 
        TODO refactor better.  this is just getKeyRange w/o the deletion check, for the benefit of
        range_slice.  still opens one randomaccessfile per key, which sucks.  something like compactioniterator
        would be better.
      */
-    public RangeReply getKeyRangeRaw(final DecoratedKey startWith, final DecoratedKey stopAt, int maxResults)
+    public RangeReply getKeyRange(final DecoratedKey startWith, final DecoratedKey stopAt, int maxResults)
     throws IOException, ExecutionException, InterruptedException
     {
         // create a CollatedIterator that will return unique keys from different sources
@@ -1161,7 +1043,7 @@
     public RangeSliceReply getRangeSlice(byte[] super_column, final DecoratedKey startKey, final DecoratedKey finishKey, int keyMax, SliceRange sliceRange, List<byte[]> columnNames)
     throws IOException, ExecutionException, InterruptedException
     {
-        RangeReply rr = getKeyRangeRaw(startKey, finishKey, keyMax);
+        RangeReply rr = getKeyRange(startKey, finishKey, keyMax);
         List<Row> rows = new ArrayList<Row>(rr.keys.size());
         final QueryPath queryPath =  new QueryPath(columnFamily_, super_column, null);
         final SortedSet<byte[]> columnNameSet = new TreeSet<byte[]>(getComparator());

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/CassandraServer.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/CassandraServer.java?rev=901207&r1=901206&r2=901207&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/CassandraServer.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/CassandraServer.java Wed Jan 20 13:57:49 2010
@@ -625,6 +625,7 @@
 
         checkLoginDone();
 
+        ThriftValidation.validateColumnParent(keyspace, column_parent);
         ThriftValidation.validatePredicate(keyspace, column_parent, predicate);
         if (!StorageService.getPartitioner().preservesOrder())
         {
@@ -663,38 +664,6 @@
         return keySlices;
     }
 
-    public List<String> get_key_range(String tablename, String columnFamily, String startWith, String stopAt, int maxResults, ConsistencyLevel consistency_level)
-            throws InvalidRequestException, TException, UnavailableException, TimedOutException
-    {
-        if (logger.isDebugEnabled())
-            logger.debug("get_key_range");
-
-        checkLoginDone();
-
-        ThriftValidation.validateCommand(tablename, columnFamily);
-        if (!StorageService.getPartitioner().preservesOrder())
-        {
-            throw new InvalidRequestException("range queries may only be performed against an order-preserving partitioner");
-        }
-        if (maxResults <= 0)
-        {
-            throw new InvalidRequestException("maxResults must be positive");
-        }
-
-        try
-        {
-            return StorageProxy.getKeyRange(new RangeCommand(tablename, columnFamily, startWith, stopAt, maxResults));
-        }
-        catch (TimeoutException e)
-        {
-        	throw new TimedOutException();
-        }
-        catch (IOException e)
-        {
-            throw new RuntimeException(e);
-        }
-    }
-
     @Override
     public void login(String keyspace, AuthenticationRequest auth_request) throws AuthenticationException, AuthorizationException, TException
     {

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java?rev=901207&r1=901206&r2=901207&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java Wed Jan 20 13:57:49 2010
@@ -592,53 +592,6 @@
         return results;
     }
 
-    static List<String> getKeyRange(RangeCommand command) throws IOException, UnavailableException, TimeoutException
-    {
-        long startTime = System.currentTimeMillis();
-        TokenMetadata tokenMetadata = StorageService.instance.getTokenMetadata();
-        Set<String> uniqueKeys = new HashSet<String>(command.maxResults);
-
-        InetAddress endPoint = StorageService.instance.findSuitableEndPoint(command.startWith);
-        InetAddress startEndpoint = endPoint;
-
-        do
-        {
-            Message message = command.getMessage();
-            if (logger.isDebugEnabled())
-                logger.debug("reading " + command + " from " + message.getMessageId() + "@" + endPoint);
-            IAsyncResult iar = MessagingService.instance().sendRR(message, endPoint);
-
-            // read response
-            byte[] responseBody;
-            responseBody = iar.get(DatabaseDescriptor.getRpcTimeout(), TimeUnit.MILLISECONDS);
-           
-            RangeReply rangeReply = RangeReply.read(responseBody);
-            uniqueKeys.addAll(rangeReply.keys);
-
-            if (uniqueKeys.size() >= command.maxResults || rangeReply.rangeCompletedLocally)
-            {
-                break;
-            }
-
-            // set up the next query --
-            // it's tempting to try to optimize this by starting with the last key seen for the next node,
-            // but that won't work when you have a replication factor of more than one--any node, not just
-            // the one holding the keys where the range wraps, could include both the smallest keys, and the largest,
-            // so starting with the largest in our scan of the next node means we'd never see keys from the middle.
-            do
-            {
-                endPoint = tokenMetadata.getSuccessor(endPoint);
-            } while (!FailureDetector.instance.isAlive(endPoint));
-        } while (!endPoint.equals(startEndpoint));
-
-        rangeStats.add(System.currentTimeMillis() - startTime);
-        List<String> allKeys = new ArrayList<String>(uniqueKeys);
-        Collections.sort(allKeys, keyComparator);
-        return (allKeys.size() > command.maxResults)
-               ? allKeys.subList(0, command.maxResults)
-               : allKeys;
-    }
-
     public double getReadLatency()
     {
         return readStats.mean();

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=901207&r1=901206&r2=901207&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 Wed Jan 20 13:57:49 2010
@@ -83,7 +83,6 @@
     public final static String streamInitiateDoneVerbHandler_ = "BOOTSTRAP-INITIATE-DONE-VERB-HANDLER";
     public final static String streamFinishedVerbHandler_ = "BOOTSTRAP-TERMINATE-VERB-HANDLER";
     public final static String streamRequestVerbHandler_ = "BS-METADATA-VERB-HANDLER";
-    public final static String rangeVerbHandler_ = "RANGE-VERB-HANDLER";
     public final static String rangeSliceVerbHandler_ = "RANGE-SLICE-VERB-HANDLER";
     public final static String bootstrapTokenVerbHandler_ = "SPLITS-VERB-HANDLER";
 
@@ -193,7 +192,6 @@
         MessagingService.instance().registerVerbHandlers(mutationVerbHandler_, new RowMutationVerbHandler());
         MessagingService.instance().registerVerbHandlers(readRepairVerbHandler_, new ReadRepairVerbHandler());
         MessagingService.instance().registerVerbHandlers(readVerbHandler_, new ReadVerbHandler());
-        MessagingService.instance().registerVerbHandlers(rangeVerbHandler_, new RangeVerbHandler());
         MessagingService.instance().registerVerbHandlers(rangeSliceVerbHandler_, new RangeSliceVerbHandler());
         // see BootStrapper for a summary of how the bootstrap verbs interact
         MessagingService.instance().registerVerbHandlers(bootstrapTokenVerbHandler_, new BootStrapper.BootstrapTokenVerbHandler());

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/ThriftValidation.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/ThriftValidation.java?rev=901207&r1=901206&r2=901207&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/ThriftValidation.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/ThriftValidation.java Wed Jan 20 13:57:49 2010
@@ -44,18 +44,6 @@
         }
     }
 
-    static void validateCommand(String tablename, String... columnFamilyNames) throws KeyspaceNotDefinedException, ColumnFamilyNotDefinedException
-    {
-        validateTable(tablename);
-        for (String cfName : columnFamilyNames)
-        {
-            if (DatabaseDescriptor.getColumnType(tablename, cfName) == null)
-            {
-                throw new ColumnFamilyNotDefinedException("Column Family " + cfName + " is invalid.");
-            }
-        }
-    }
-
     private static void validateTable(String tablename) throws KeyspaceNotDefinedException
     {
         if (!DatabaseDescriptor.getTables().contains(tablename))

Modified: incubator/cassandra/trunk/test/system/test_server.py
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/system/test_server.py?rev=901207&r1=901206&r2=901207&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/system/test_server.py (original)
+++ incubator/cassandra/trunk/test/system/test_server.py Wed Jan 20 13:57:49 2010
@@ -505,7 +505,7 @@
         # get doesn't specify supercolumn name
         _expect_exception(lambda: client.get('Keyspace1', 'key1', ColumnPath('Super1'), ConsistencyLevel.ONE), InvalidRequestException)
         # invalid CF
-        _expect_exception(lambda: client.get_key_range('Keyspace1', 'S', '', '', 1000, ConsistencyLevel.ONE), InvalidRequestException)
+        _expect_exception(lambda: client.get_range_slice('Keyspace1', ColumnParent('S'), SlicePredicate(column_names=['', '']), '', '', 5, ConsistencyLevel.ONE), InvalidRequestException)
         # 'x' is not a valid Long
         _expect_exception(lambda: client.insert('Keyspace1', 'key1', ColumnPath('Super1', 'sc1', 'x'), 'value', 0, ConsistencyLevel.ONE), InvalidRequestException)
         # start is not a valid Long
@@ -672,49 +672,57 @@
 
 
     def test_empty_range(self):
-        assert client.get_key_range('Keyspace1', 'Standard1', '', '', 1000, ConsistencyLevel.ONE) == []
+        assert client.get_range_slice('Keyspace1', ColumnParent('Standard1'), SlicePredicate(column_names=['c1', 'c1']), '', '', 1000, ConsistencyLevel.ONE) == []
         _insert_simple()
-        assert client.get_key_range('Keyspace1', 'Super1', '', '', 1000, ConsistencyLevel.ONE) == []
+        assert client.get_range_slice('Keyspace1', ColumnParent('Super1'), SlicePredicate(column_names=['c1', 'c1']), '', '', 1000, ConsistencyLevel.ONE) == []
 
     def test_range_with_remove(self):
         _insert_simple()
-        assert client.get_key_range('Keyspace1', 'Standard1', 'key1', '', 1000, ConsistencyLevel.ONE) == ['key1']
+        assert client.get_range_slice('Keyspace1', ColumnParent('Standard1'), SlicePredicate(column_names=['c1', 'c1']), 'key1', '', 1000, ConsistencyLevel.ONE)[0].key == 'key1'
 
         client.remove('Keyspace1', 'key1', ColumnPath('Standard1', column='c1'), 1, ConsistencyLevel.ONE)
         client.remove('Keyspace1', 'key1', ColumnPath('Standard1', column='c2'), 1, ConsistencyLevel.ONE)
-        actual = client.get_key_range('Keyspace1', 'Standard1', '', '', 1000, ConsistencyLevel.ONE)
-        assert actual == [], actual
+        actual = client.get_range_slice('Keyspace1', ColumnParent('Standard1'), SlicePredicate(column_names=['c1', 'c2']), '', '', 1000, ConsistencyLevel.ONE)
+        assert actual == [KeySlice(columns=[], key='key1')], actual
 
     def test_range_with_remove_cf(self):
         _insert_simple()
-        assert client.get_key_range('Keyspace1', 'Standard1', 'key1', '', 1000, ConsistencyLevel.ONE) == ['key1']
+        assert client.get_range_slice('Keyspace1', ColumnParent('Standard1'), SlicePredicate(column_names=['c1', 'c1']), 'key1', '', 1000, ConsistencyLevel.ONE)[0].key == 'key1'
 
         client.remove('Keyspace1', 'key1', ColumnPath('Standard1'), 1, ConsistencyLevel.ONE)
-        actual = client.get_key_range('Keyspace1', 'Standard1', '', '', 1000, ConsistencyLevel.ONE)
-        assert actual == [], actual
+        actual = client.get_range_slice('Keyspace1', ColumnParent('Standard1'), SlicePredicate(column_names=['c1', 'c1']), '', '', 1000, ConsistencyLevel.ONE)
+        assert actual == [KeySlice(columns=[], key='key1')], actual
 
     def test_range_collation(self):
         for key in ['-a', '-b', 'a', 'b'] + [str(i) for i in xrange(100)]:
             client.insert('Keyspace1', key, ColumnPath('Standard1', column=key), 'v', 0, ConsistencyLevel.ONE)
-        L = client.get_key_range('Keyspace1', 'Standard1', '', '', 1000, ConsistencyLevel.ONE)
+        slices = client.get_range_slice('Keyspace1', ColumnParent('Standard1'), SlicePredicate(column_names=['-a', '-a']), '', '', 1000, ConsistencyLevel.ONE)
         # note the collated ordering rather than ascii
-        assert L == ['0', '1', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '2', '20', '21', '22', '23', '24', '25', '26', '27','28', '29', '3', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '4', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '5', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '6', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '7', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '8', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '9', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', 'a', '-a', 'b', '-b'], L
+        L = ['0', '1', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '2', '20', '21', '22', '23', '24', '25', '26', '27','28', '29', '3', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '4', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '5', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '6', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '7', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '8', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '9', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', 'a', '-a', 'b', '-b']
+        assert len(slices) == len(L)
+        for key, ks in zip(L, slices):
+            assert key == ks.key
 
     def test_range_partial(self):
         for key in ['-a', '-b', 'a', 'b'] + [str(i) for i in xrange(100)]:
             client.insert('Keyspace1', key, ColumnPath('Standard1', column=key), 'v', 0, ConsistencyLevel.ONE)
+        
+        def check_slices_against_keys(keyList, sliceList):
+            assert len(keyList) == len(sliceList)
+            for key, ks in zip(keyList, sliceList):
+                assert key == ks.key
+        
+        slices = client.get_range_slice('Keyspace1', ColumnParent('Standard1'), SlicePredicate(column_names=['-a', '-a']), 'a', '', 1000, ConsistencyLevel.ONE)
+        check_slices_against_keys(['a', '-a', 'b', '-b'], slices)
+        
+        slices = client.get_range_slice('Keyspace1', ColumnParent('Standard1'), SlicePredicate(column_names=['-a', '-a']), '', '15', 1000, ConsistencyLevel.ONE)
+        check_slices_against_keys(['0', '1', '10', '11', '12', '13', '14', '15'], slices)
 
-        L = client.get_key_range('Keyspace1', 'Standard1', 'a', '', 1000, ConsistencyLevel.ONE)
-        assert L == ['a', '-a', 'b', '-b'], L
-
-        L = client.get_key_range('Keyspace1', 'Standard1', '', '15', 1000, ConsistencyLevel.ONE)
-        assert L == ['0', '1', '10', '11', '12', '13', '14', '15'], L
-
-        L = client.get_key_range('Keyspace1', 'Standard1', '50', '51', 1000, ConsistencyLevel.ONE)
-        assert L == ['50', '51'], L
-    
-        L = client.get_key_range('Keyspace1', 'Standard1', '1', '', 10, ConsistencyLevel.ONE)
-        assert L == ['1', '10', '11', '12', '13', '14', '15', '16', '17', '18'], L
+        slices = client.get_range_slice('Keyspace1', ColumnParent('Standard1'), SlicePredicate(column_names=['-a', '-a']), '50', '51', 1000, ConsistencyLevel.ONE)
+        check_slices_against_keys(['50', '51'], slices)
+        
+        slices = client.get_range_slice('Keyspace1', ColumnParent('Standard1'), SlicePredicate(column_names=['-a', '-a']), '1', '', 10, ConsistencyLevel.ONE)
+        check_slices_against_keys(['1', '10', '11', '12', '13', '14', '15', '16', '17', '18'], slices)
 
     def test_get_slice_range(self):
         _insert_range()

Modified: incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/CompactionsTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/CompactionsTest.java?rev=901207&r1=901206&r2=901207&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/CompactionsTest.java (original)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/CompactionsTest.java Wed Jan 20 13:57:49 2010
@@ -27,6 +27,7 @@
 import java.util.HashSet;
 import java.util.Collection;
 
+import org.apache.cassandra.service.StorageService;
 import org.junit.Test;
 
 import org.apache.cassandra.io.SSTableReader;
@@ -50,6 +51,7 @@
         // this test does enough rows to force multiple block indexes to be used
         Table table = Table.open(TABLE1);
         ColumnFamilyStore store = table.getColumnFamilyStore("Standard1");
+        DecoratedKey emptyKey = StorageService.getPartitioner().decorateKey("");
 
         final int ROWS_PER_SSTABLE = 10;
         Set<String> inserted = new HashSet<String>();
@@ -62,7 +64,7 @@
                 inserted.add(key);
             }
             store.forceBlockingFlush();
-            assertEquals(inserted.size(), table.getColumnFamilyStore("Standard1").getKeyRange("", "", 10000).keys.size());
+            assertEquals(inserted.size(), table.getColumnFamilyStore("Standard1").getKeyRange(emptyKey, emptyKey, 10000).keys.size());
         }
         while (true)
         {
@@ -74,7 +76,7 @@
         {
             CompactionManager.instance.submitMajor(store).get();
         }
-        assertEquals(inserted.size(), table.getColumnFamilyStore("Standard1").getKeyRange("", "", 10000).keys.size());
+        assertEquals(inserted.size(), table.getColumnFamilyStore("Standard1").getKeyRange(emptyKey, emptyKey, 10000).keys.size());
     }
 
     @Test
@@ -84,6 +86,7 @@
 
         Table table = Table.open(TABLE2);
         ColumnFamilyStore store = table.getColumnFamilyStore("Standard1");
+        DecoratedKey emptyKey = StorageService.getPartitioner().decorateKey("");
 
         final int ROWS_PER_SSTABLE = 10;
         Set<String> inserted = new HashSet<String>();
@@ -96,13 +99,13 @@
                 inserted.add(key);
             }
             store.forceBlockingFlush();
-            assertEquals(inserted.size(), table.getColumnFamilyStore("Standard1").getKeyRange("", "", 10000).keys.size());
+            assertEquals(inserted.size(), table.getColumnFamilyStore("Standard1").getKeyRange(emptyKey, emptyKey, 10000).keys.size());
         }
 
         // perform readonly compaction and confirm that no sstables changed
         ArrayList<SSTableReader> oldsstables = new ArrayList<SSTableReader>(store.getSSTables());
         CompactionManager.instance.submitReadonly(store, LOCAL).get();
         assertEquals(oldsstables, new ArrayList<SSTableReader>(store.getSSTables()));
-        assertEquals(inserted.size(), table.getColumnFamilyStore("Standard1").getKeyRange("", "", 10000).keys.size());
+        assertEquals(inserted.size(), table.getColumnFamilyStore("Standard1").getKeyRange(emptyKey, emptyKey, 10000).keys.size());
     }
 }

Modified: incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/OneCompactionTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/OneCompactionTest.java?rev=901207&r1=901206&r2=901207&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/OneCompactionTest.java (original)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/OneCompactionTest.java Wed Jan 20 13:57:49 2010
@@ -20,10 +20,10 @@
 
 import java.io.IOException;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
 import java.util.Set;
 import java.util.HashSet;
 
+import org.apache.cassandra.service.StorageService;
 import org.junit.Test;
 
 import static junit.framework.Assert.assertEquals;
@@ -38,6 +38,7 @@
 
         Table table = Table.open("Keyspace1");
         ColumnFamilyStore store = table.getColumnFamilyStore(columnFamilyName);
+        DecoratedKey emptyKey = StorageService.getPartitioner().decorateKey("");
 
         Set<String> inserted = new HashSet<String>();
         for (int j = 0; j < insertsPerTable; j++) {
@@ -47,11 +48,10 @@
             rm.apply();
             inserted.add(key);
             store.forceBlockingFlush();
-            assertEquals(inserted.size(), table.getColumnFamilyStore(columnFamilyName).getKeyRange("", "", 10000).keys.size());
+            assertEquals(inserted.size(), table.getColumnFamilyStore(columnFamilyName).getKeyRange(emptyKey, emptyKey, 10000).keys.size());
         }
         CompactionManager.instance.submitMajor(store).get();
         assertEquals(1, store.getSSTables().size());
-        assertEquals(table.getColumnFamilyStore(columnFamilyName).getKeyRange("", "", 10000).keys.size(), inserted.size());
     }
 
     @Test

Modified: incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java?rev=901207&r1=901206&r2=901207&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java (original)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java Wed Jan 20 13:57:49 2010
@@ -27,6 +27,7 @@
 import java.util.HashSet;
 import java.util.Collections;
 
+import org.apache.cassandra.service.StorageService;
 import org.junit.Test;
 
 import org.apache.cassandra.CleanupHelper;
@@ -38,6 +39,7 @@
     public void testWithFlush() throws IOException, ExecutionException, InterruptedException
     {
         CompactionManager.instance.disableAutoCompaction();
+        DecoratedKey emptyKey = StorageService.getPartitioner().decorateKey("");
 
         for (int i = 0; i < 100; i++)
         {
@@ -52,7 +54,7 @@
         cfs.clearUnsafe();
         RecoveryManager.doRecovery(); // this is a no-op. is testing this useful?
 
-        Set<String> foundKeys = new HashSet<String>(cfs.getKeyRange("", "", 1000).keys);
+        Set<String> foundKeys = new HashSet<String>(cfs.getKeyRange(emptyKey, emptyKey, 1000).keys);
         assert foundKeys.equals(Collections.emptySet());
     }
 

Modified: incubator/cassandra/trunk/test/unit/org/apache/cassandra/io/StreamingTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/io/StreamingTest.java?rev=901207&r1=901206&r2=901207&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/io/StreamingTest.java (original)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/io/StreamingTest.java Wed Jan 20 13:57:49 2010
@@ -19,14 +19,13 @@
 package org.apache.cassandra.io;
 
 import static junit.framework.Assert.assertEquals;
-import static org.junit.Assert.*;
 
 import java.net.InetAddress;
-import java.io.IOException;
 import java.util.*;
 
 import org.apache.cassandra.CleanupHelper;
 import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.RangeReply;
 import org.apache.cassandra.db.Table;
 import org.apache.cassandra.io.SSTableUtils;
@@ -44,6 +43,7 @@
     public void testTransferTable() throws Exception
     {
         StorageService.instance.initServer();
+        DecoratedKey emptyKey = StorageService.getPartitioner().decorateKey("");
 
         // write a temporary SSTable, but don't register it
         Set<String> content = new HashSet<String>();
@@ -57,7 +57,7 @@
 
         // confirm that the SSTable was transferred and registered
         ColumnFamilyStore cfstore = Table.open(tablename).getColumnFamilyStore(cfname);
-        RangeReply rr = cfstore.getKeyRange("", "", 2);
+        RangeReply rr = cfstore.getKeyRange(emptyKey, emptyKey, 2);
         assert rr.keys.size() == 1;
         assert rr.keys.contains("key");
     }