Custom data type is not work at C* 2.0

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Custom data type is not work at C* 2.0

Katsutoshi
Hi.

I would like to use custom data type.
Although it was work at Cassandra 1.2.9, but it is not work at Cassandra 2.0.0.
Did anything change by Cassandra 2.0.0 ?

My test procedure is as follows:

### DummyType.class

```
package my.marshal;

import java.nio.ByteBuffer;

import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.MarshalException;
import org.apache.cassandra.utils.ByteBufferUtil;

public class DummyType extends AbstractType<Void> {

    public static final DummyType instance = new DummyType();

    private DummyType(){
    }

    public Void compose(ByteBuffer bytes){
        return null;
    }

    public ByteBuffer decompose(Void value){
        return ByteBufferUtil.EMPTY_BYTE_BUFFER;
    }

    public int compare(ByteBuffer o1, ByteBuffer o2){
        return 0;
    }

    public String getString(ByteBuffer bytes){
        return "";
    }

    public ByteBuffer fromString(String source) throws MarshalException{
        if(!source.isEmpty()) throw new MarshalException(String.format("'%s' is not empty", source));
        return ByteBufferUtil.EMPTY_BYTE_BUFFER;
    }

    public void validate(ByteBuffer bytes) throws MarshalException{
    }
}
```

### At Cassandra 1.2.9

1) Create DummyType class and compiled by JDK6.
2) Drop that jar (my-marshal-1.0.0.jar) in lib directory and start the cluster.

```
$ tail -f /var/log/cassandra/cassandra.log
(snip)
 INFO 21:19:58,126 Classpath: /opt/cassandra/bin/../conf:/opt/cassandra/bin/../build/classes/main:/opt/cassandra/bin/../build/classes/thrift:/opt/cassandra/bin/../lib/antlr-3.2.jar:/opt/cassandra/bin/../lib/apache-cassandra-1.2.9.jar:/opt/cassandra/bin/../lib/apache-cassandra-clientutil-1.2.9.jar:/opt/cassandra/bin/../lib/apache-cassandra-thrift-1.2.9.jar:/opt/cassandra/bin/../lib/avro-1.4.0-fixes.jar:/opt/cassandra/bin/../lib/avro-1.4.0-sources-fixes.jar:/opt/cassandra/bin/../lib/commons-cli-1.1.jar:/opt/cassandra/bin/../lib/commons-codec-1.2.jar:/opt/cassandra/bin/../lib/commons-lang-2.6.jar:/opt/cassandra/bin/../lib/compress-lzf-0.8.4.jar:/opt/cassandra/bin/../lib/concurrentlinkedhashmap-lru-1.3.jar:/opt/cassandra/bin/../lib/guava-13.0.1.jar:/opt/cassandra/bin/../lib/high-scale-lib-1.1.2.jar:/opt/cassandra/bin/../lib/jackson-core-asl-1.9.2.jar:/opt/cassandra/bin/../lib/jackson-mapper-asl-1.9.2.jar:/opt/cassandra/bin/../lib/jamm-0.2.5.jar:/opt/cassandra/bin/../lib/jbcrypt-0.3m.jar:/opt/cassandra/bin/../lib/jline-1.0.jar:/opt/cassandra/bin/../lib/json-simple-1.1.jar:/opt/cassandra/bin/../lib/libthrift-0.7.0.jar:/opt/cassandra/bin/../lib/log4j-1.2.16.jar:/opt/cassandra/bin/../lib/lz4-1.1.0.jar:/opt/cassandra/bin/../lib/metrics-core-2.0.3.jar:/opt/cassandra/bin/../lib/my-marshal-1.0.0.jar:/opt/cassandra/bin/../lib/netty-3.5.9.Final.jar:/opt/cassandra/bin/../lib/servlet-api-2.5-20081211.jar:/opt/cassandra/bin/../lib/slf4j-api-1.7.2.jar:/opt/cassandra/bin/../lib/slf4j-log4j12-1.7.2.jar:/opt/cassandra/bin/../lib/snakeyaml-1.6.jar:/opt/cassandra/bin/../lib/snappy-java-1.0.5.jar:/opt/cassandra/bin/../lib/snaptree-0.1.jar:/opt/cassandra/bin/../lib/jamm-0.2.5.jar
(snip)
```

3) Create column family that use DummyType.

```
cqlsh:test> CREATE TABLE test_cf ( key 'my.marshal.DummyType' PRIMARY KEY);
cqlsh:test> DESCRIBE TABLE test_cf;

CREATE TABLE test_cf (
  key 'my.marshal.DummyType' PRIMARY KEY
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'SnappyCompressor'};
```

### At Cassandra 2.0.0

1) Create DummyType class and compiled by JDK7.
2) Drop that jar (my-marshal-1.0.0.jar) in lib directory and start the cluster.

```
$ tail -f /var/log/cassandra/cassandra.log
(snip)
 INFO 21:10:33,789 Classpath: /opt/cassandra/bin/../conf:/opt/cassandra/bin/../build/classes/main:/opt/cassandra/bin/../build/classes/thrift:/opt/cassandra/bin/../lib/antlr-3.2.jar:/opt/cassandra/bin/../lib/apache-cassandra-2.0.0.jar:/opt/cassandra/bin/../lib/apache-cassandra-clientutil-2.0.0.jar:/opt/cassandra/bin/../lib/apache-cassandra-thrift-2.0.0.jar:/opt/cassandra/bin/../lib/commons-cli-1.1.jar:/opt/cassandra/bin/../lib/commons-codec-1.2.jar:/opt/cassandra/bin/../lib/commons-lang-2.6.jar:/opt/cassandra/bin/../lib/compress-lzf-0.8.4.jar:/opt/cassandra/bin/../lib/concurrentlinkedhashmap-lru-1.3.jar:/opt/cassandra/bin/../lib/disruptor-3.0.1.jar:/opt/cassandra/bin/../lib/guava-13.0.1.jar:/opt/cassandra/bin/../lib/high-scale-lib-1.1.2.jar:/opt/cassandra/bin/../lib/jackson-core-asl-1.9.2.jar:/opt/cassandra/bin/../lib/jackson-mapper-asl-1.9.2.jar:/opt/cassandra/bin/../lib/jamm-0.2.5.jar:/opt/cassandra/bin/../lib/jbcrypt-0.3m.jar:/opt/cassandra/bin/../lib/jline-1.0.jar:/opt/cassandra/bin/../lib/json-simple-1.1.jar:/opt/cassandra/bin/../lib/libthrift-0.9.0.jar:/opt/cassandra/bin/../lib/log4j-1.2.16.jar:/opt/cassandra/bin/../lib/lz4-1.1.0.jar:/opt/cassandra/bin/../lib/metrics-core-2.0.3.jar:/opt/cassandra/bin/../lib/my-marshal-1.0.0.jar:/opt/cassandra/bin/../lib/netty-3.5.9.Final.jar:/opt/cassandra/bin/../lib/servlet-api-2.5-20081211.jar:/opt/cassandra/bin/../lib/slf4j-api-1.7.2.jar:/opt/cassandra/bin/../lib/slf4j-log4j12-1.7.2.jar:/opt/cassandra/bin/../lib/snakeyaml-1.11.jar:/opt/cassandra/bin/../lib/snappy-java-1.0.5.jar:/opt/cassandra/bin/../lib/snaptree-0.1.jar:/opt/cassandra/bin/../lib/thrift-server-0.3.0.jar:/opt/cassandra/bin/../lib/jamm-0.2.5.jar
(snip)
```

3) Create column family that use DummyType.

```
cqlsh:test> CREATE TABLE test_cf ( key 'my.marshal.DummyType' PRIMARY KEY);
Bad Request: Error setting type my.marshal.DummyType: Unable to find abstract-type class 'my.marshal.DummyType'
```

Thanks,

Katsutoshi
Reply | Threaded
Open this post in threaded view
|

Re: Custom data type is not work at C* 2.0

Dave Brosius
I think your class is missing a required

public TypeSerializer<Void> getSerializer() {}

method


This is what you need to derive from

https://git-wip-us.apache.org/repos/asf?p=cassandra.git;a=blob;f=src/java/org/apache/cassandra/db/marshal/AbstractType.java;h=74fe446319c199433b47d3ae60fc4d644e86b653;hb=03045ca22b11b0e5fc85c4fabd83ce6121b5709b



On 09/04/2013 09:14 AM, Katsutoshi wrote:
package my.marshal;

import java.nio.ByteBuffer;

import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.MarshalException;
import org.apache.cassandra.utils.ByteBufferUtil;

public class DummyType extends AbstractType<Void> {

    public static final DummyType instance = new DummyType();

    private DummyType(){
    }

    public Void compose(ByteBuffer bytes){
        return null;
    }

    public ByteBuffer decompose(Void value){
        return ByteBufferUtil.EMPTY_BYTE_BUFFER;
    }

    public int compare(ByteBuffer o1, ByteBuffer o2){
        return 0;
    }

    public String getString(ByteBuffer bytes){
        return "";
    }

    public ByteBuffer fromString(String source) throws MarshalException{
        if(!source.isEmpty()) throw new MarshalException(String.format("'%s' is not empty", source));
        return ByteBufferUtil.EMPTY_BYTE_BUFFER;
    }

    public void validate(ByteBuffer bytes) throws MarshalException{
    }
}

Reply | Threaded
Open this post in threaded view
|

Re: Custom data type is not work at C* 2.0

Katsutoshi
Thanks to your reply, this problem has been solved.
I was making a mistake which uses AbstractType of a version 1.2.9.


2013/9/6 Dave Brosius <[hidden email]>
I think your class is missing a required

public TypeSerializer<Void> getSerializer() {}

method


This is what you need to derive from

https://git-wip-us.apache.org/repos/asf?p=cassandra.git;a=blob;f=src/java/org/apache/cassandra/db/marshal/AbstractType.java;h=74fe446319c199433b47d3ae60fc4d644e86b653;hb=03045ca22b11b0e5fc85c4fabd83ce6121b5709b




On 09/04/2013 09:14 AM, Katsutoshi wrote:
package my.marshal;

import java.nio.ByteBuffer;

import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.MarshalException;
import org.apache.cassandra.utils.ByteBufferUtil;

public class DummyType extends AbstractType<Void> {

    public static final DummyType instance = new DummyType();

    private DummyType(){
    }

    public Void compose(ByteBuffer bytes){
        return null;
    }

    public ByteBuffer decompose(Void value){
        return ByteBufferUtil.EMPTY_BYTE_BUFFER;
    }

    public int compare(ByteBuffer o1, ByteBuffer o2){
        return 0;
    }

    public String getString(ByteBuffer bytes){
        return "";
    }

    public ByteBuffer fromString(String source) throws MarshalException{
        if(!source.isEmpty()) throw new MarshalException(String.format("'%s' is not empty", source));
        return ByteBufferUtil.EMPTY_BYTE_BUFFER;
    }

    public void validate(ByteBuffer bytes) throws MarshalException{
    }
}