When you run the get_slice which columns are returned ? 

Aaron

On 19 Apr 2011, at 04:12, Abraham Sanderson wrote:

> Ok, I made the changes and tried again.  Here is the before modifying my 
> method using a simple get, confirmed the same output in the cli:
> 
> DEBUG [pool-1-thread-2] 2011-04-18 09:37:23,910 CassandraServer.java (line 
> 279) get
> DEBUG [pool-1-thread-2] 2011-04-18 09:37:23,911 StorageProxy.java (line 322) 
> Command/ConsistencyLevel is SliceByNamesReadCommand(table='DocStore', 
> key=64316337663662392d313432352d346661622d623037342d353537346335346361653038, 
> columnParent='QueryPath(columnFamilyName='Tran
> slationsByTarget', superColumnName='java.nio.HeapByteBuffer[pos=95 lim=211 
> cap=244]', columnName='null')', 
> columns=[7c2f5d5b-b370-42e1-a6a2-77fc721440fe,])/ALL
> DEBUG [pool-1-thread-2] 2011-04-18 09:37:23,911 ReadCallback.java (line 84) 
> Blockfor/repair is 1/true; setting up requests to localhost/127.0.0.1
> DEBUG [pool-1-thread-2] 2011-04-18 09:37:23,911 StorageProxy.java (line 345) 
> reading data locally
> DEBUG [ReadStage:4] 2011-04-18 09:37:23,911 StorageProxy.java (line 450) 
> LocalReadRunnable reading SliceByNamesReadCommand(table='DocStore', 
> key=64316337663662392d313432352d346661622d623037342d353537346335346361653038, 
> columnParent='QueryPath(columnFamilyName='Translatio
> nsByTarget', superColumnName='java.nio.HeapByteBuffer[pos=95 lim=211 
> cap=244]', columnName='null')', 
> columns=[7c2f5d5b-b370-42e1-a6a2-77fc721440fe,])
> DEBUG [pool-1-thread-2] 2011-04-18 09:37:23,912 StorageProxy.java (line 395) 
> Read: 1 ms.
> ERROR [pool-1-thread-2] 2011-04-18 09:37:23,912 Cassandra.java (line 2665) 
> Internal error processing get
> java.lang.AssertionError
>         at 
> org.apache.cassandra.thrift.CassandraServer.get(CassandraServer.java:300)
>         at 
> org.apache.cassandra.thrift.Cassandra$Processor$get.process(Cassandra.java:2655)
>         at 
> org.apache.cassandra.thrift.Cassandra$Processor.process(Cassandra.java:2555)
>         at 
> org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:206)
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
>         at java.lang.Thread.run(Thread.java:636)
> 
> And here is the after...it succeeds here but still gives me multiple 
> subcolumns in the response.  Same behavior, it seems, I'm just sidestepping 
> the original AssertionError:
> 
> DEBUG [pool-1-thread-6] 2011-04-18 09:50:26,617 CassandraServer.java (line 
> 232) get_slice
> DEBUG [pool-1-thread-6] 2011-04-18 09:50:26,617 StorageProxy.java (line 322) 
> Command/ConsistencyLevel is SliceByNamesReadCommand(table='DocStore', 
> key=64316337663662392d313432352d346661622d623037342d353537346335346361653038, 
> columnParent='QueryPath(columnFamilyName='TranslationsByTarget', 
> superColumnName='java.nio.HeapByteBuffer[pos=101 lim=217 cap=259]', 
> columnName='null')', columns=[7c2f5d5b-b370-42e1-a6a2-77fc721440fe,])/ALL
> DEBUG [pool-1-thread-6] 2011-04-18 09:50:26,617 ReadCallback.java (line 84) 
> Blockfor/repair is 1/true; setting up requests to localhost/127.0.0.1
> DEBUG [pool-1-thread-6] 2011-04-18 09:50:26,617 StorageProxy.java (line 345) 
> reading data locally
> DEBUG [ReadStage:3] 2011-04-18 09:50:26,618 StorageProxy.java (line 450) 
> LocalReadRunnable reading SliceByNamesReadCommand(table='DocStore', 
> key=64316337663662392d313432352d346661622d623037342d353537346335346361653038, 
> columnParent='QueryPath(columnFamilyName='TranslationsByTarget', 
> superColumnName='java.nio.HeapByteBuffer[pos=101 lim=217 cap=259]', 
> columnName='null')', columns=[7c2f5d5b-b370-42e1-a6a2-77fc721440fe,])
> DEBUG [pool-1-thread-6] 2011-04-18 09:50:26,618 StorageProxy.java (line 395) 
> Read: 0 ms.
> 
> My comparators are relatively simple.  Basically I have a schema that 
> required heterogenous columns, but I needed to be able to deserialize them in 
> unique ways.  So there is always a type byte that precedes the bytes of the 
> data.  The supercolumn in this case is a general data type, which happens to 
> represent a serializable object:
> 
>   public void validate(ByteBuffer bytes)
>     throws MarshalException
>   {
>     if(bytes.remaining() == 0)
>       return;
> 
>     validateDataType(bytes.get(bytes.position()));
>     return;
>   }
> 
>   public int compare(ByteBuffer bytes1, ByteBuffer bytes2)
>   {
>     if (bytes1.remaining() == 0)
>       return bytes2.remaining() == 0 ? 0 : -1;
>     else if (bytes2.remaining() == 0)
>       return 1;
>     else
>     {
>       // compare type bytes                                                   
>                                                                               
>                                                                               
>                                      
>       byte T1 = bytes1.get(bytes1.position());
>       byte T2 = bytes2.get(bytes2.position());
>       if (T1 != T2)
>         return (T1 - T2);
> 
>       // compare values                                                       
>                                                                               
>                                                                               
>                                      
>       return ByteBufferUtil.compareUnsigned(bytes1, bytes2);
>     }
>   }
> 
> The subcolumn is similar...just a UUID with a type byte prefix:
> 
>   public void validate(ByteBuffer bytes)
>     throws MarshalException
>   {
>     if(bytes.remaining() == 0)
>       return;
> 
>     validateDataType(bytes.get(bytes.position()));
>     if((bytes.remaining() - 1) == 0)
>       return;
>     else if((bytes.remaining() - 1) != 16)
>       throw new MarshalException("UUID value must be exactly 16 bytes");
>   }
> 
>   public int compare(ByteBuffer bytes1, ByteBuffer bytes2)
>   {
>     if (bytes1.remaining() == 0)
>       return bytes2.remaining() == 0 ? 0 : -1;
>     else if (bytes2.remaining() == 0)
>       return 1;
>     else
>     {
>       // compare type bytes                                                   
>                                                                               
>                                                                               
>                                      
>       byte T1 = bytes1.get(bytes1.position());
>       byte T2 = bytes2.get(bytes2.position());
>       if (T1 != T2)
>         return (T1 - T2);
> 
>       // compare values                                                       
>                                                                               
>                                                                               
>                                      
>       UUID U1 = getUUID(bytes1, bytes1.position()+1);
>       UUID U2 = getUUID(bytes2, bytes2.position()+1);
>       return U1.compareTo(U2);
>     }
>   }
> 
>   static UUID getUUID(ByteBuffer bytes, int pos)
>   {
>     long msBits = bytes.getLong(pos);
>     long lsBits = bytes.getLong(pos+8);
>     return new UUID(msBits, lsBits);
>   }
> 
> All of my buffer reads are done by index, the position shouldn't be changing 
> at all.
> 
> Abe Sanderson
> 
> On Sat, Apr 16, 2011 at 5:38 PM, aaron morton <aa...@thelastpickle.com> wrote:
> Can you run the same request as a get_slice naming the column in the 
> SlicePredicate and see what comes back ?
> 
> Can you reproduce the fault with logging set at DEBUG and send the logs ?
> 
> Also, whats the compare function like for your custom type ?
> 
> Cheers
> Aaron
> 
> 
> On 16 Apr 2011, at 07:34, Abraham Sanderson wrote:
> 
> > I'm having some issues with a few of my ColumnFamilies after a cassandra 
> > upgrade/import from 0.6.1 to 0.7.4.  I followed the instructions to upgrade 
> > and everything seem to work OK...until I got into the application and 
> > noticed some wierd behavior.  I was getting the following stacktrace in 
> > cassandra occassionally when I did get operations for a single subcolumn 
> > for some of the Super type CFs:
> >
> > ERROR 12:56:05,669 Internal error processing get
> > java.lang.AssertionError
> >         at org.apache.cassandra.thrift.
> > CassandraServer.get(CassandraServer.java:300)
> >         at 
> > org.apache.cassandra.thrift.Cassandra$Processor$get.process(Cassandra.java:2655)
> >         at 
> > org.apache.cassandra.thrift.Cassandra$Processor.process(Cassandra.java:2555)
> >         at 
> > org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:206)
> >         at 
> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
> >         at 
> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
> >         at java.lang.Thread.run(Thread.java:636)
> >
> > The assertion that is failing is the check that only one column is 
> > retrieved by the get.  I did some debugging with the cli and a remote  
> > debugger and found a few interesting patterns.  First, the problem does not 
> > seem consistently duplicatable.  If one supercolumn is affected though, it 
> > will happen more frequently for subcolumns that when sorted appear at the 
> > beginning of the range.  For columns near the end of the range, it seems to 
> > be more intermittent, and almost never occurs when I step through the code 
> > line by line.  The only factor I can think of that might cause issues is 
> > that I am using custom data types for all supercolumns and columns.  I 
> > originally thought I might be reading past the end of the ByteBuffer, but I 
> > have quadrupled checked that this is not the case.
> >
> > Abe Sanderson
> 
> 

Reply via email to