From 44a0a3a54df3bf7236806266e9b9be37ce13cbaf Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Sat, 9 May 2009 01:40:16 +0000 Subject: [PATCH] fix CME during range queries -- keyset call needs to go on the memtable exector. patch by jbellis; tested by Tv for CASSANDRA-153 git-svn-id: https://svn.apache.org/repos/asf/incubator/cassandra/trunk@773152 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/cassandra/db/Memtable.java | 11 +++++++++-- src/java/org/apache/cassandra/db/Table.java | 3 ++- .../apache/cassandra/service/RangeVerbHandler.java | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/cassandra/db/Memtable.java b/src/java/org/apache/cassandra/db/Memtable.java index f66e812ecb..0c50de7bcb 100644 --- a/src/java/org/apache/cassandra/db/Memtable.java +++ b/src/java/org/apache/cassandra/db/Memtable.java @@ -399,9 +399,16 @@ public class Memtable implements Comparable } } - public Iterator sortedKeyIterator() + public Iterator sortedKeyIterator() throws ExecutionException, InterruptedException { - Set keys = columnFamilies_.keySet(); + Callable> callable = new Callable>() + { + public Set call() throws Exception + { + return columnFamilies_.keySet(); + } + }; + Set keys = executor_.submit(callable).get(); if (keys.size() == 0) { // cannot create a PQ of size zero (wtf?) diff --git a/src/java/org/apache/cassandra/db/Table.java b/src/java/org/apache/cassandra/db/Table.java index 1dd79a7416..b0c5f34e69 100644 --- a/src/java/org/apache/cassandra/db/Table.java +++ b/src/java/org/apache/cassandra/db/Table.java @@ -26,6 +26,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.ExecutionException; import org.apache.commons.collections.IteratorUtils; import org.apache.commons.collections.Predicate; @@ -870,7 +871,7 @@ public class Table * @param maxResults * @return list of keys between startWith and stopAt */ - public List getKeyRange(final String startWith, final String stopAt, int maxResults) throws IOException + public List getKeyRange(final String startWith, final String stopAt, int maxResults) throws IOException, ExecutionException, InterruptedException { // (OPP key decoration is a no-op so using the "decorated" comparator against raw keys is fine) final Comparator comparator = StorageService.getPartitioner().getDecoratedKeyComparator(); diff --git a/src/java/org/apache/cassandra/service/RangeVerbHandler.java b/src/java/org/apache/cassandra/service/RangeVerbHandler.java index a5eb4e4585..c0ac3b3b42 100644 --- a/src/java/org/apache/cassandra/service/RangeVerbHandler.java +++ b/src/java/org/apache/cassandra/service/RangeVerbHandler.java @@ -22,7 +22,7 @@ public class RangeVerbHandler implements IVerbHandler Table table = Table.open(command.table); keys = table.getKeyRange(command.startWith, command.stopAt, command.maxResults); } - catch (IOException e) + catch (Exception e) { throw new RuntimeException(e); }