[ https://issues.apache.org/jira/browse/GEODE-2435?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15877040#comment-15877040 ]
Galen O'Sullivan commented on GEODE-2435: ----------------------------------------- In addition, we throw errors if regions contain data that is spread across servers, which is a problem: {code} (error) ERR This transcation cannot be initiated, make sure the command is executed against a replicate region or your data is collocated. If you are using persistent regions, make sure transactions are enabled {code} > Redis adapter MULTI behavior is different from Redis > ---------------------------------------------------- > > Key: GEODE-2435 > URL: https://issues.apache.org/jira/browse/GEODE-2435 > Project: Geode > Issue Type: Bug > Components: redis > Reporter: Galen O'Sullivan > > {{WATCH}} isn't implemented properly, but this is about returning an error > instead of nil when we have a {{MULTI}} fail: > {code} > $ redis-cli -p 11212 > 127.0.0.1:11212> set a b > OK > 127.0.0.1:11212> watch a > (error) ERR Keys cannot be watched or unwatched because GemFire watches all > keys by default for transactions > 127.0.0.1:11212> lpush la boo > (integer) 1 > (2.09s) > 127.0.0.1:11212> multi > OK > 127.0.0.1:11212> lpush la z > QUEUED > 127.0.0.1:11212> lpush la x > QUEUED > {code} > At this point, we {{lpush la foo}} in a different client, then: > {code} > 127.0.0.1:11212> exec > 1) (error) ERR The server had an internal error please try again > 2) (error) ERR The server had an internal error please try again > 127.0.0.1:11212> > {code} > whereas a Redis instance will simply return nil instead of an error. > Looking in the logs, I see this: > {code} > [error 2017/02/06 13:21:39.493 PST server2 <GeodeRedisServer-WorkerThread-2> > tid=0x2a] GeodeRedisServer-Unexpected error handler for [id: 0x3ddf9f21, > /127.0.0.1:58862 => /127.0.0.1:11212] > java.lang.UnsupportedOperationException: Operations on persist-backup regions > are not allowed because this thread has an active transaction > at > org.apache.geode.internal.cache.TXRegionState.<init>(TXRegionState.java:60) > at > org.apache.geode.internal.cache.TXBucketRegionState.<init>(TXBucketRegionState.java:29) > at org.apache.geode.internal.cache.TXState.writeRegion(TXState.java:252) > at > org.apache.geode.internal.cache.TXState.txWriteRegion(TXState.java:1110) > at > org.apache.geode.internal.cache.TXState.txReadEntry(TXState.java:1365) > at > org.apache.geode.internal.cache.TXState.txReadEntry(TXState.java:1344) > at > org.apache.geode.internal.cache.TXState.getDeserializedValue(TXState.java:1414) > at > org.apache.geode.internal.cache.TXStateProxyImpl.getDeserializedValue(TXStateProxyImpl.java:352) > at > org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1394) > at > org.apache.geode.internal.cache.PartitionedRegionDataStore.getLocally(PartitionedRegionDataStore.java:2047) > at > org.apache.geode.internal.cache.PartitionedRegion.getFromBucket(PartitionedRegion.java:4022) > at > org.apache.geode.internal.cache.PartitionedRegion.findObjectInSystem(PartitionedRegion.java:3399) > at org.apache.geode.internal.cache.TXState.findObject(TXState.java:1540) > at > org.apache.geode.internal.cache.TXStateProxyImpl.findObject(TXStateProxyImpl.java:614) > at > org.apache.geode.internal.cache.PartitionedRegion.get(PartitionedRegion.java:3160) > at > org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1330) > at > org.apache.geode.internal.cache.AbstractRegion.get(AbstractRegion.java:282) > at > org.apache.geode.redis.internal.executor.list.ListExecutor.pushElements(ListExecutor.java:70) > at > org.apache.geode.redis.internal.executor.list.PushExecutor.executeCommand(PushExecutor.java:47) > at > org.apache.geode.redis.internal.ExecutionHandlerContext.executeWithTransaction(ExecutionHandlerContext.java:244) > at > org.apache.geode.redis.internal.ExecutionHandlerContext.executeCommand(ExecutionHandlerContext.java:191) > at > org.apache.geode.redis.internal.ExecutionHandlerContext.channelRead(ExecutionHandlerContext.java:137) > at > io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:368) > at > io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:353) > at > io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:173) > at > io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:368) > at > io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:353) > at > io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:780) > at > io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:100) > at > io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:497) > at > io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:465) > at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:359) > at > io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) > at java.lang.Thread.run(Thread.java:745) > {code} -- This message was sent by Atlassian JIRA (v6.3.15#6346)