apache / apache/incubator-seata-samples
[springcloud-jpa-seata] Unexpected IndexOutOfBoundsException occurred in Storage Services when rollback several times
- Dominant language
- Java
- Stars
- 2.4k
- Forks
- 2k
- PR merge metrics
- No merged PRs in 30d
Description
Hi team, exception occurred when I test with the rollback api http://127.0.0.1:8084/purchase/rollback
several times, let's say 12 times in my computer. please help to take a look? Any feedback is appreciated.
The stack info is as bellow:
`2019-05-09 10:30:13.342 DEBUG 8456 --- [nio-8081-exec-1] i.s.rm.datasource.undo.UndoLogManager : Flushing UNDO LOG: {"branchId":2011004429,"sqlUndoLogs":[{"afterImage":{"rows":[{"fields":[{"keyType":"PrimaryKey","name":"id","type":4,"value":1},{"keyType":"NULL","name":"count","type":4,"value":999}]}],"tableName":"storage_tbl"},"beforeImage":{"rows":[{"fields":[{"keyType":"PrimaryKey","name":"id","type":4,"value":1},{"keyType":"NULL","name":"count","type":4,"value":1000}]}],"tableName":"storage_tbl"},"sqlType":"UPDATE","tableName":"storage_tbl"}],"xid":"172.17.0.19:8091:2011004428"}
2019-05-09 10:30:13.473 DEBUG 8456 --- [nio-8081-exec-1] i.s.core.rpc.netty.AbstractRpcRemoting : offer message: xid=172.17.0.19:8091:2011004428,branchId=2011004429,resourceId=null,status=PhaseOne_Done,applicationData=null
2019-05-09 10:30:13.473 DEBUG 8456 --- [geSend_RMROLE_1] i.s.core.rpc.netty.AbstractRpcRemoting : write message:SeataMergeMessage xid=172.17.0.19:8091:2011004428,branchId=2011004429,resourceId=null,status=PhaseOne_Done,applicationData=null
, channel:[id: 0x28543152, L:/192.168.63.108:57140 - R:/192.168.63.195:8091],active?true,writable?true,isopen?true
2019-05-09 10:30:13.473 DEBUG 8456 --- [lector_RMROLE_1] i.s.core.rpc.netty.MessageCodecHandler : Send:SeataMergeMessage xid=172.17.0.19:8091:2011004428,branchId=2011004429,resourceId=null,status=PhaseOne_Done,applicationData=null
2019-05-09 10:30:13.475 DEBUG 8456 --- [lector_RMROLE_1] i.s.core.rpc.netty.MessageCodecHandler : Receive:MergeResultMessage io.seata.core.protocol.transaction.BranchReportResponse@2c54642d
,messageId:76
2019-05-09 10:30:13.477 DEBUG 8456 --- [nio-8081-exec-1] io.seata.core.context.RootContext : unbind 172.17.0.19:8091:2011004428
2019-05-09 10:30:13.477 DEBUG 8456 --- [nio-8081-exec-1] o.s.c.a.s.web.SeataHandlerInterceptor : unbind 172.17.0.19:8091:2011004428 from RootContext
2019-05-09 10:30:13.537 ERROR 8456 --- [lector_RMROLE_1] i.s.core.rpc.netty.MessageCodecHandler : decode error
java.lang.IndexOutOfBoundsException: readerIndex(158) + length(4) exceeds writerIndex(160): PooledUnsafeDirectByteBuf(ridx: 158, widx: 160, cap: 160)
at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1437) ~[netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.buffer.AbstractByteBuf.readInt(AbstractByteBuf.java:809) ~[netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.seata.core.protocol.transaction.AbstractBranchEndRequest.decode(AbstractBranchEndRequest.java:230) ~[seata-core-0.5.1.jar:na]
at io.seata.core.rpc.netty.MessageCodecHandler.decode(MessageCodecHandler.java:188) ~[seata-core-0.5.1.jar:na]
at io.netty.handler.codec.ByteToMessageCodec$1.decode(ByteToMessageCodec.java:42) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:502) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:441) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:103) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:677) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:612) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:529) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:491) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-all-4.1.33.Final.jar:4.1.33.Final]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_144]
2019-05-09 10:30:13.539 ERROR 8456 --- [lector_RMROLE_1] io.seata.core.rpc.netty.RmRpcClient : 0318`
Contributor guide
Research direction
Reproduce the issue by calling http://127.0.0.1:8084/purchase/rollback repeatedly, then trace the failure from MessageCodecHandler.decode into AbstractBranchEndRequest.decode. Compare the encoded message length with the reader index and verify that repeated rollbacks no longer produce the IndexOutOfBoundsException in the decoder.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, spring-boot
- Domain
- backend, distributed-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100