You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Edward Capriolo (JIRA)" <ji...@apache.org> on 2014/04/04 16:30:15 UTC
[jira] [Comment Edited] (CASSANDRA-6982) start_column in
get_page_slice has odd behaivor
[ https://issues.apache.org/jira/browse/CASSANDRA-6982?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13959995#comment-13959995 ]
Edward Capriolo edited comment on CASSANDRA-6982 at 4/4/14 2:29 PM:
--------------------------------------------------------------------
This is not as much a bug as thrift is allowing users to do something that does not work. We should reject that request.
I will explain
This works:
{code}
KeyRange kr = new KeyRange();
kr.setCount(3);
kr.setStart_key(ByteBufferUtil.bytes("aslice"));
kr.setEnd_key(ByteBufferUtil.bytes("aslice"));
List<KeySlice> t = server.get_paged_slice("Standard1", kr, ByteBufferUtil.bytes("c"), ConsistencyLevel.ONE);
{code}
When you specify a start token and a start column you get what you would expect.
This is correct but may not be intuitive.
{code}
KeyRange kr = new KeyRange();
kr.setCount(3);
kr.setStart_key(ByteBufferUtil.bytes(""));
kr.setEnd_key(ByteBufferUtil.bytes(""));
List<KeySlice> t = server.get_paged_slice("Standard1", kr, ByteBufferUtil.bytes("c"), ConsistencyLevel.ONE);
{code}
Your slice is starting before the row in question. You get back columns a,b,c not c,d,e.
The problem comes using token. With Murmur3 and Random Partitioner the relation between tokens->keys is not one to one. The pig unit tests fires up ByteOrderPartitioner, the rest of our testing is Murmer3.
Here are the things we should not allow: (not sure if I am supposed to hex encode so I tried both)
{quote}
KeyRange kr = new KeyRange();
kr.setCount(3);
kr.setStart_token(ByteBufferUtil.bytesToHex(ByteBuffer.wrap(l.token.toString().getBytes())));
kr.setEnd_token(ByteBufferUtil.bytesToHex(ByteBuffer.wrap(l.token.toString().getBytes())));
List<KeySlice> t = server.get_paged_slice("Standard1", kr, ByteBufferUtil.bytes("c"), ConsistencyLevel.ONE);
{quote}
{quote}
Murmur3Partitioner m = new Murmur3Partitioner();
LongToken l = m.getToken(ByteBufferUtil.bytes("aslice"));
KeyRange kr = new KeyRange();
kr.setCount(3);
kr.setStart_token(l.toString());
kr.setEnd_token(l.toString());
List<KeySlice> t = server.get_paged_slice("Standard1", kr, ByteBufferUtil.bytes("c"), ConsistencyLevel.ONE);
{quote}
Because the relationship of token to key is not 1 to 1. There is no way to start at a specific row. Since you can not start at a specific row the start_column is meaningless.
I *think* we should reject a KeyRange using a start_token and a start_column when the partitioner does not provide 1 to 1 tokens. We should throw an InvalidRequestException.
was (Author: appodictic):
This is not as much a bug as thrift is allowing users to do something that does not work. We should reject that request.
I will explain
This works:
{code}
KeyRange kr = new KeyRange();
kr.setCount(3);
kr.setStart_key(ByteBufferUtil.bytes("aslice"));
kr.setEnd_key(ByteBufferUtil.bytes("aslice"));
List<KeySlice> t = server.get_paged_slice("Standard1", kr, ByteBufferUtil.bytes("c"), ConsistencyLevel.ONE);
{code}
When you specify a start token and a start column you get what you would expect.
This is correct but may not be intuitive.
{code}
KeyRange kr = new KeyRange();
kr.setCount(3);
kr.setStart_key(ByteBufferUtil.bytes(""));
kr.setEnd_key(ByteBufferUtil.bytes(""));
List<KeySlice> t = server.get_paged_slice("Standard1", kr, ByteBufferUtil.bytes("c"), ConsistencyLevel.ONE);
{code}
Your slice is starting before the row in question. You get back columns a,b,c not c,d,e.
The problem comes using token. With Murmur3 and Random Partitioner the relation between tokens->keys is not one to one. The pig unit tests fires up ByteOrderPartitioner, the rest of our testing is Murmer3.
Here are the things we should not allow: (not sure if I am supposed to hex encode so I tried both)
{quote}
KeyRange kr = new KeyRange();
kr.setCount(3);
kr.setStart_token(ByteBufferUtil.bytesToHex(ByteBuffer.wrap(l.token.toString().getBytes())));
kr.setEnd_token(ByteBufferUtil.bytesToHex(ByteBuffer.wrap(l.token.toString().getBytes())));
List<KeySlice> t = server.get_paged_slice("Standard1", kr, ByteBufferUtil.bytes("c"), ConsistencyLevel.ONE);
{quote}
{quote}
Murmur3Partitioner m = new Murmur3Partitioner();
LongToken l = m.getToken(ByteBufferUtil.bytes("aslice"));
KeyRange kr = new KeyRange();
kr.setCount(3);
kr.setStart_token(l.toString());
kr.setEnd_token(l.toString());
List<KeySlice> t = server.get_paged_slice("Standard1", kr, ByteBufferUtil.bytes("c"), ConsistencyLevel.ONE);
{quote}
Because the relationship of token to key is not 1 to 1. There is no way to start at a specific row. Since you can not start at a specific row the start_column is meaningless.
I *think* we should reject a KeyRange using a start_token and a start_column. We should throw an InvalidRequestException.
> start_column in get_page_slice has odd behaivor
> -----------------------------------------------
>
> Key: CASSANDRA-6982
> URL: https://issues.apache.org/jira/browse/CASSANDRA-6982
> Project: Cassandra
> Issue Type: Bug
> Reporter: Edward Capriolo
> Assignee: Edward Capriolo
> Priority: Critical
>
> get_paged_slice is described as so:
> {code}
> /**
> returns a range of columns, wrapping to the next rows if necessary to collect max_results.
> */
> list<KeySlice> get_paged_slice(1:required string column_family,
> 2:required KeyRange range,
> 3:required binary start_column,
> 4:required ConsistencyLevel consistency_level=ConsistencyLevel.ONE)
> throws (1:InvalidRequestException ire, 2:UnavailableException ue, 3:TimedOutException te),
> {code}
> The term max_results is not defined, I take it to mean key_range.count.
> The larger issue I have found is that start_column seems to be ignored in some cases.
> testNormal() produces this error
> junit.framework.ComparisonFailure: null expected:<[c]> but was:<[a]>
> The problem seems to be KeyRanges that use tokens and not keys.
> {code}
> KeyRange kr = new KeyRange();
> kr.setCount(3);
> kr.setStart_token("");
> kr.setEnd_token("");
> {code}
> A failing test is here:
> https://github.com/edwardcapriolo/cassandra/compare/pg?expand=1
> Is this a bug? It feels like one, or is this just undefined behaviour. If it is a bug I would like to fix.
--
This message was sent by Atlassian JIRA
(v6.2#6252)