It's failing to when comparing two TimeUUID values because on of them is not properly formatted. In this case it's comparing a stored value with the value passed in the get_indexed_slice() query expression.
I'm going to assume it's the value passed for the expression. When you create the IndexedSlicesQuery this is incorrect IndexedSlicesQuery<String, byte[], byte[]> indexQuery = HFactory .createIndexedSlicesQuery(keyspace, stringSerializer, bytesSerializer, bytesSerializer); Use a UUIDSerializer for the last param and then pass the UUID you want to build the expressing. Rather than the string/byte thing you are passing Hope that helps. Aaron On 15 Mar 2011, at 04:17, Johannes Hoerle wrote: > Hi all, > > in order to improve our queries, we started to use IndexedSliceQueries from > the hector project (https://github.com/zznate/hector-examples). I followed > the instructions for creating IndexedSlicesQuery with GetIndexedSlices.java. > I created the corresponding CF with in a keyspace called “Keyspace1” ( > “create keyspace Keyspace1;”) with: > "create column family Indexed1 with column_type='Standard' and > comparator='UTF8Type' and keys_cached=200000 and read_repair_chance=1.0 and > rows_cached=20000 and column_metadata=[{column_name: birthdate, > validation_class: LongType, index_name: dateIndex, index_type: > KEYS},{column_name: birthmonth, validation_class: LongType, index_name: > monthIndex, index_type: KEYS}];" > and the example GetIndexedSlices.java worked fine. > > Output of CF Indexed1: > --------------------------------------- > [default@Keyspace1] list Indexed1; > Using default limit of 100 > ------------------- > RowKey: fake_key_12 > => (column=birthdate, value=1974, timestamp=1300110485826059) > => (column=birthmonth, value=0, timestamp=1300110485826060) > => (column=fake_column_0, value=66616b655f76616c75655f305f3132, > timestamp=1300110485826056) > => (column=fake_column_1, value=66616b655f76616c75655f315f3132, > timestamp=1300110485826057) > => (column=fake_column_2, value=66616b655f76616c75655f325f3132, > timestamp=1300110485826058) > ------------------- > RowKey: fake_key_8 > => (column=birthdate, value=1974, timestamp=1300110485826039) > => (column=birthmonth, value=8, timestamp=1300110485826040) > => (column=fake_column_0, value=66616b655f76616c75655f305f38, > timestamp=1300110485826036) > => (column=fake_column_1, value=66616b655f76616c75655f315f38, > timestamp=1300110485826037) > => (column=fake_column_2, value=66616b655f76616c75655f325f38, > timestamp=1300110485826038) > ------------------- > .... > > > Now to the problem: > As we have another column format in our cluster (using TimeUUIDType as > comparator in CF definition) I adapted the application to our schema on a > cassandra-0.7.3 cluster. > We use a manually defined UUID for a mandator id index > (00000000-0000-1000-0000-000000000000) and another one for a userid index > (00000001-0000-1000-0000-000000000000). It can be created with: > "create column family ByUser with column_type='Standard' and > comparator='TimeUUIDType' and keys_cached=200000 and read_repair_chance=1.0 > and rows_cached=20000 and column_metadata=[{column_name: > 00000000-0000-1000-0000-000000000000, validation_class: BytesType, > index_name: mandatorIndex, index_type: KEYS}, {column_name: > 00000001-0000-1000-0000-000000000000, validation_class: BytesType, > index_name: useridIndex, index_type: KEYS}];" > > > which looks in the cluster using cassandra-cli like this: > > [default@Keyspace1] describe keyspace; > Keyspace: Keyspace1: > Replication Strategy: org.apache.cassandra.locator.SimpleStrategy > Replication Factor: 1 > Column Families: > ColumnFamily: ByUser > Columns sorted by: org.apache.cassandra.db.marshal.TimeUUIDType > Row cache size / save period: 20000.0/0 > Key cache size / save period: 200000.0/14400 > Memtable thresholds: 0.2953125/63/1440 > GC grace seconds: 864000 > Compaction min/max thresholds: 4/32 > Read repair chance: 0.01 > Built indexes: [ByUser.mandatorIndex, ByUser.useridIndex] > Column Metadata: > Column Name: 00000001-0000-1000-0000-000000000000 > Validation Class: org.apache.cassandra.db.marshal.BytesType > Index Name: useridIndex > Index Type: KEYS > Column Name: 00000000-0000-1000-0000-000000000000 > Validation Class: org.apache.cassandra.db.marshal.BytesType > Index Name: mandatorIndex > Index Type: KEYS > ColumnFamily: Indexed1 > Columns sorted by: org.apache.cassandra.db.marshal.UTF8Type > Row cache size / save period: 20000.0/0 > Key cache size / save period: 200000.0/14400 > Memtable thresholds: 0.2953125/63/1440 > GC grace seconds: 864000 > Compaction min/max thresholds: 4/32 > Read repair chance: 0.01 > Built indexes: [Indexed1.dateIndex, Indexed1.monthIndex] > Column Metadata: > Column Name: birthmonth (birthmonth) > Validation Class: org.apache.cassandra.db.marshal.LongType > Index Name: monthIndex > Index Type: KEYS > Column Name: birthdate (birthdate) > Validation Class: org.apache.cassandra.db.marshal.LongType > Index Name: dateIndex > Index Type: KEYS > [default@Keyspace1] list ByUser; > Using default limit of 100 > ------------------- > RowKey: testMandator!!user01 > => (column=00000000-0000-1000-0000-000000000000, > value=746573744d616e6461746f72, timestamp=1300111213321000) > => (column=00000001-0000-1000-0000-000000000000, value=757365723031, > timestamp=1300111213322000) > => (column=f064b480-495e-11e0-abc4-0024e89fa587, value=3135, > timestamp=1300111213561000) > > 1 Row Returned. > > the values of the index colums 00000000-0000-1000-0000-000000000000 and > 00000001-0000-1000-0000-000000000000 represent "testMandator" and and > "user01" as bytes > the third column is a randomly generated one with value "15" that are > inserted in GetTimeUUIDIndexedSlices app. > I attached both source codes, GetIndexedSlices and GetTimeUUIDIndexedSlices. > Currently the second index expression for the userid index in > GetTimeUUIDIndexedSlices.queryCf(...) method > > indexQuery.addEqualsExpression(asByteArray(MANDATOR_UUID), new > StringSerializer().toBytes(mandator)); > //indexQuery.addEqualsExpression(asByteArray(USERID_INDEX_UUID), new > StringSerializer().toBytes(dummyUserId)); > > is commented out, so the GetTimeUUIDIndexedSlices will run. Using one > IndexQuery works perfectly fine but as soon as I add a second eq, gt, gte or > lt expression I get an IndexOutOfBoundsException (see below). > > This issue can be easily reproduced by > - downloading the zznate example (https://github.com/zznate/hector-examples), > - mavenizing it to an eclipse project with "mvn clean eclipse:eclipse", > - importing it in eclipse and > - letting it run against a locally running cassandra instance (v0.7.3) which > has the default settings (no changes in the .yaml) > > I hope that someone can help me with this issue ... after a couple of days > it's driving me bonkers. > > Thx in advance, > Johannes > > > Exception: > ERROR 14:47:56,842 Error in ThreadPoolExecutor > java.lang.RuntimeException: java.lang.IndexOutOfBoundsException: 6 > at > org.apache.cassandra.service.IndexScanVerbHandler.doVerb(IndexScanVer > bHandler.java:51) > at > org.apache.cassandra.net.MessageDeliveryTask.run(MessageDeliveryTask. > java:72) > at > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec > utor.java:886) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor > .java:908) > at java.lang.Thread.run(Thread.java:619) > Caused by: java.lang.IndexOutOfBoundsException: 6 > at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:121) > at > org.apache.cassandra.db.marshal.TimeUUIDType.compareTimestampBytes(Ti > meUUIDType.java:56) > at > org.apache.cassandra.db.marshal.TimeUUIDType.compare(TimeUUIDType.jav > a:45) > at > org.apache.cassandra.db.marshal.TimeUUIDType.compare(TimeUUIDType.jav > a:29) > at > org.apache.cassandra.db.ColumnFamilyStore.satisfies(ColumnFamilyStore > .java:1608) > at > org.apache.cassandra.db.ColumnFamilyStore.scan(ColumnFamilyStore.java > :1552) > at > org.apache.cassandra.service.IndexScanVerbHandler.doVerb(IndexScanVer > bHandler.java:42) > ... 4 more > ERROR 14:47:56,852 Fatal exception in thread Thread[ReadStage:14,5,main] > java.lang.RuntimeException: java.lang.IndexOutOfBoundsException: 6 > at > org.apache.cassandra.service.IndexScanVerbHandler.doVerb(IndexScanVer > bHandler.java:51) > at > org.apache.cassandra.net.MessageDeliveryTask.run(MessageDeliveryTask. > java:72) > at > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec > utor.java:886) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor > .java:908) > <GetIndexedSlices.java><GetTimeUUIDIndexedSlices.java>