Java Client and clobber update

Cosmin Marginean cosminaru at gmail.com
Wed Jan 14 16:42:12 EST 2015


Hi Brian,

Thank you for your prompt reply, I thought that might be the case (and I agree, the way generics ended up being implemented is sadistic)

I went with B) already but I wanted to make sure this is recorded.

I filed this here for reference: https://github.com/basho/riak-java-client/issues/493

Cheers
Cos


On Wednesday, 14 January 2015 at 21:32, Brian Roach wrote:

> 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 (mailto: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 (http://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 (mailto:riak-users at lists.basho.com)
> > http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
> >  
>  
>  
>  
>  


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.basho.com/pipermail/riak-users_lists.basho.com/attachments/20150114/6c2a01a6/attachment-0002.html>


More information about the riak-users mailing list