Created
December 27, 2012 13:29
-
-
Save anttip/4388400 to your computer and use it in GitHub Desktop.
Running into a problem with Astyanax and Cassandra. Using Astyanax auto paginated query without a column range specifier causes following queries to fail.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
15:00:29,501 INFO ~ Registering mbean: com.netflix.MonitoredResources:type=ASTYANAX,name=MyConnectionPool,ServiceType=connectionpool | |
15:00:29,514 INFO ~ AddHost: 127.0.0.1 | |
Exception in thread "main" com.netflix.astyanax.connectionpool.exceptions.BadRequestException: BadRequestException: [host=127.0.0.1(127.0.0.1):9160, latency=1(1), attempts=1]InvalidRequestException(why:String didn't validate.) | |
at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:159) | |
at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:60) | |
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1$2.execute(ThriftColumnFamilyQueryImpl.java:200) | |
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1$2.execute(ThriftColumnFamilyQueryImpl.java:192) | |
at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$1.execute(ThriftSyncConnectionFactoryImpl.java:136) | |
at com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:69) | |
at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:248) | |
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1.execute(ThriftColumnFamilyQueryImpl.java:190) | |
at TestAutoPaginate.main(TestAutoPaginate.java:63) | |
Caused by: InvalidRequestException(why:String didn't validate.) | |
at org.apache.cassandra.thrift.Cassandra$get_slice_result.read(Cassandra.java:7280) | |
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78) | |
at org.apache.cassandra.thrift.Cassandra$Client.recv_get_slice(Cassandra.java:552) | |
at org.apache.cassandra.thrift.Cassandra$Client.get_slice(Cassandra.java:536) | |
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1$2.internalExecute(ThriftColumnFamilyQueryImpl.java:205) | |
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1$2.internalExecute(ThriftColumnFamilyQueryImpl.java:192) | |
at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:55) | |
... 7 more |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.UUID; | |
import com.netflix.astyanax.AstyanaxContext; | |
import com.netflix.astyanax.Keyspace; | |
import com.netflix.astyanax.MutationBatch; | |
import com.netflix.astyanax.connectionpool.NodeDiscoveryType; | |
import com.netflix.astyanax.connectionpool.exceptions.ConnectionException; | |
import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl; | |
import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor; | |
import com.netflix.astyanax.impl.AstyanaxConfigurationImpl; | |
import com.netflix.astyanax.model.Column; | |
import com.netflix.astyanax.model.ColumnFamily; | |
import com.netflix.astyanax.model.ColumnList; | |
import com.netflix.astyanax.query.RowQuery; | |
import com.netflix.astyanax.serializers.StringSerializer; | |
import com.netflix.astyanax.serializers.TimeUUIDSerializer; | |
import com.netflix.astyanax.thrift.ThriftFamilyFactory; | |
import com.netflix.astyanax.util.TimeUUIDUtils; | |
public class TestAutoPaginate { | |
public static void main(String[] args) throws ConnectionException { | |
AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder() | |
.forCluster("Test Cluster") | |
.forKeyspace("test") | |
.withAstyanaxConfiguration(new AstyanaxConfigurationImpl().setDiscoveryType(NodeDiscoveryType.NONE)) | |
.withConnectionPoolConfiguration( | |
new ConnectionPoolConfigurationImpl("MyConnectionPool").setPort(9160).setMaxConnsPerHost(1) | |
.setSeeds("127.0.0.1:9160")) | |
.withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) | |
.buildKeyspace(ThriftFamilyFactory.getInstance()); | |
context.start(); | |
Keyspace keyspace = context.getEntity(); | |
final ColumnFamily<String, UUID> CF1 = ColumnFamily.newColumnFamily("CF1", StringSerializer.get(), | |
TimeUUIDSerializer.get()); | |
final ColumnFamily<String, String> CF2 = ColumnFamily.newColumnFamily("CF2", StringSerializer.get(), | |
StringSerializer.get()); | |
try { | |
keyspace.createColumnFamily(CF1, null); | |
keyspace.createColumnFamily(CF2, null); | |
MutationBatch m = keyspace.prepareMutationBatch(); | |
m.withRow(CF1, "test").putColumn(TimeUUIDUtils.getUniqueTimeUUIDinMillis(), "value1", null); | |
m.execute(); | |
RowQuery<String, UUID> query = keyspace.prepareQuery(CF1).getKey("test").autoPaginate(true); | |
// Adding a column range removes the problem | |
// query.withColumnRange(new RangeBuilder().build()); | |
ColumnList<UUID> columns; | |
while (!(columns = query.execute().getResult()).isEmpty()) { | |
for (Column<UUID> column : columns) { | |
column.getStringValue(); | |
} | |
} | |
// query on another column family with different column key type | |
// does not seem to work after the first query | |
keyspace.prepareQuery(CF2).getKey("anything").execute(); | |
} finally { | |
keyspace.dropColumnFamily(CF1); | |
keyspace.dropColumnFamily(CF2); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment