Java Client and clobber update

Brian Roach roach at basho.com
Wed Jan 14 16:32:29 EST 2015


Cosmin -

It would appear that the crazy generics involved are indeed broken
when it comes to UpdateValue the "ClobberUpdate" - it's not pulling
out the type correctly. I'll have to try and figure out why that is.
Type erasure will make you weep ;)

Two ways to deal with it at the moment:

A) Pass in a TypeReference explicitly:

TypeReference<SomeEntity> tRef = new TypeReference<SomeEntity>(){};
...
.withUpdate(UpdateValue.Update.clobberUpdate(entity), tRef)
...

B) Create your own class that subclasses UpdateValue.Update that does
the same thing as a "clobber update" :

public static class UpdateEntity extends UpdateValue.Update<SomeEntity>
{
    private final SomeEntity entity;

    public UpdateEntity(SomeEntity e)
    {
        this.entity = e;
    }

    @Override
    public SomeEntity apply(SomeEntity original)
    {
        return entity;
    }

}

...
.withUpdate(new UpdateEntity(entity))
...



I've tested both of these solutions and they both work.

Thanks and sorry for the problem,
- Roach

On Wed, Jan 14, 2015 at 1:39 PM, Cosmin Marginean <cosminaru at gmail.com> wrote:
> I’m doing a fairly “by the book” clobber update (store and fetch below work
> fine) on an entity using the Java client. I’m seeing an error that happens
> at type-inference time within the Riak Java client. I’m pasting below the
> exact test that I’m using to generate this, as well as the stacktrace.
> Please let me know if I’m missing something or if it’s a known bug.
>
> Thank you
> Cosmin
>
> @Test
> public void testRiakUpdate() throws Exception {
>     RiakNode node = new
> RiakNode.Builder().withRemoteAddress("192.168.168.2").withRemotePort(8087).build();
>     RiakCluster cluster = new RiakCluster.Builder(node).build();
>     cluster.start();
>     RiakClient client = new RiakClient(cluster);
>
>     SomeEntity entity = new SomeEntity();
>     entity.setName("John Doe");
>     entity.setDescription("Some Description");
>     Location location = new Location(new Namespace("bucket"), "entity-key");
>
>     // Store
>     StoreValue storeOp = new
> StoreValue.Builder(entity).withLocation(location).build();
>     client.execute(storeOp);
>
>     // Fetch
>     FetchValue fetchOp = new FetchValue.Builder(location).build();
>     entity = client.execute(fetchOp).getValue(SomeEntity.class);
>
>     // Update
>     entity.setName("New name");
>     UpdateValue updateOp = new UpdateValue.Builder(location)
>             .withFetchOption(FetchValue.Option.DELETED_VCLOCK, true)
>             .withUpdate(UpdateValue.Update.clobberUpdate(entity))
>             .build();
>     client.execute(updateOp).getValue(SomeEntity.class);
> }
>
> private static class SomeEntity {
>     private String name;
>     private String description;
>
>     public String getName() {
>         return name;
>     }
>
>     public void setName(String name) {
>         this.name = name;
>     }
>
>     public String getDescription() {
>         return description;
>     }
>
>     public void setDescription(String description) {
>         this.description = description;
>     }
> }
>
>
>
>
> java.lang.ClassCastException:
> sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to
> java.lang.Class
> 	at
> com.basho.riak.client.api.commands.kv.UpdateValue$1.handle(UpdateValue.java:149)
> ~[riak-client-2.0.0.jar:na]
> 	at
> com.basho.riak.client.api.commands.ListenableFuture.notifyListeners(ListenableFuture.java:78)
> ~[riak-client-2.0.0.jar:na]
> 	at
> com.basho.riak.client.api.commands.CoreFutureAdapter.handle(CoreFutureAdapter.java:120)
> ~[riak-client-2.0.0.jar:na]
> 	at
> com.basho.riak.client.core.FutureOperation.fireListeners(FutureOperation.java:131)
> ~[riak-client-2.0.0.jar:na]
> 	at
> com.basho.riak.client.core.FutureOperation.setResponse(FutureOperation.java:170)
> ~[riak-client-2.0.0.jar:na]
> 	at com.basho.riak.client.core.RiakNode.onSuccess(RiakNode.java:823)
> ~[riak-client-2.0.0.jar:na]
> 	at
> com.basho.riak.client.core.netty.RiakResponseHandler.channelRead(RiakResponseHandler.java:58)
> ~[riak-client-2.0.0.jar:na]
> 	at
> io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:340)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:326)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:155)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:108)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:340)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:326)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:116)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:494)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:461)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:378)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:350)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_05]
> 20:34:13.390 [nioEventLoopGroup-2-1] DEBUG
> c.b.riak.client.core.FutureOperation - IllegalStateException; required:
> [CREATED, WRITTEN, RETRY] current: COMPLETE
> 20:34:13.391 [nioEventLoopGroup-2-1] WARN
> i.n.channel.DefaultChannelPipeline - An exception was thrown by a user
> handler's exceptionCaught() method while handling the following exception:
> java.lang.ClassCastException:
> sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to
> java.lang.Class
> 	at
> com.basho.riak.client.api.commands.kv.UpdateValue$1.handle(UpdateValue.java:149)
> ~[riak-client-2.0.0.jar:na]
> 	at
> com.basho.riak.client.api.commands.ListenableFuture.notifyListeners(ListenableFuture.java:78)
> ~[riak-client-2.0.0.jar:na]
> 	at
> com.basho.riak.client.api.commands.CoreFutureAdapter.handle(CoreFutureAdapter.java:120)
> ~[riak-client-2.0.0.jar:na]
> 	at
> com.basho.riak.client.core.FutureOperation.fireListeners(FutureOperation.java:131)
> ~[riak-client-2.0.0.jar:na]
> 	at
> com.basho.riak.client.core.FutureOperation.setResponse(FutureOperation.java:170)
> ~[riak-client-2.0.0.jar:na]
> 	at com.basho.riak.client.core.RiakNode.onSuccess(RiakNode.java:823)
> ~[riak-client-2.0.0.jar:na]
> 	at
> com.basho.riak.client.core.netty.RiakResponseHandler.channelRead(RiakResponseHandler.java:58)
> ~[riak-client-2.0.0.jar:na]
> 	at
> io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:340)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:326)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:155)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:108)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:340)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:326)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:116)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:494)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:461)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:378)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:350)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at
> io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
> [netty-all-4.0.17.Final.jar:4.0.17.Final]
> 	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_05]
>
>
>
> _______________________________________________
> riak-users mailing list
> riak-users at lists.basho.com
> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
>




More information about the riak-users mailing list