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