lettuce icon indicating copy to clipboard operation
lettuce copied to clipboard

use with gateway,but something throw io.lettuce.core.output.ValueOutput does not support set(long)

Open zafir-zhong opened this issue 1 year ago • 10 comments

I have deployed multiple gateway services with the same code. However, in some instances of the service, a failure occurs after listening to specific Redis messages. The failure disappears after restarting the service, but it reappears after repackaging.

spring-cloud-starter-gateway:3.1.9
lettuce: 6.1.10.RELEASE
spring-data-redis: 2.7.18

convertAndSenddata:

{"apps":[“D3sX4"],"status": 2}

listen:

reactiveRedisTemplate.listenToChannel(Constant.Sentinel.RULE_SYNC_KEY).flatMap(data -> {});

error log:

2024-04-23 18:06:39.741|ERROR |9573|lettuce-epollEventLoop-5-1||Operator called default onErrorDropped
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.UnsupportedOperationException: io.lettuce.core.output.ValueOutput does not support set(long)
Caused by: java.lang.UnsupportedOperationException: io.lettuce.core.output.ValueOutput does not support set(long)
        at io.lettuce.core.output.CommandOutput.set(CommandOutput.java:107) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.RedisStateMachine.safeSet(RedisStateMachine.java:778) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.RedisStateMachine.handleInteger(RedisStateMachine.java:404) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.RedisStateMachine$State$Type.handle(RedisStateMachine.java:206) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.RedisStateMachine.doDecode(RedisStateMachine.java:334) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.RedisStateMachine.decode(RedisStateMachine.java:295) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:842) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.CommandHandler.decode0(CommandHandler.java:793) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:767) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:659) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:599) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:801) ~[netty-transport-classes-epoll-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:509) ~[netty-transport-classes-epoll-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:407) ~[netty-transport-classes-epoll-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.108.Final.jar:4.1.108.Final]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_201]

arthas data (input@ValueOutput respnull and Thread@StackTraceElement)

method=io.lettuce.core.protocol.RedisStateMachine.safeSet location=AtExit
ts=2024-05-24 17:17:38; [cost=0.899899ms] result=@ArrayList[
    @ValueOutput[
        codec=@ByteBufferCodec[
            INSTANCE=@ByteBufferCodec[
                INSTANCE=@ByteBufferCodec[INSTANCE],
                $VALUES=@ByteBufferCodec[][isEmpty=false;size=1],
                name=@String[INSTANCE],
                ordinal=@Integer[0],
            ],
            $VALUES=@ByteBufferCodec[][
                @ByteBufferCodec[INSTANCE],
            ],
            name=@String[INSTANCE],
            ordinal=@Integer[0],
        ],
        output=null,
        error=@String[io.lettuce.core.output.ValueOutput does not support set(long)],
    ],
    null,
    @StackTraceElement[][
        @StackTraceElement[
            declaringClass=@String[java.lang.Thread],
            methodName=@String[getStackTrace],
            fileName=@String[Thread.java],
            lineNumber=@Integer[1559],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[sun.reflect.NativeMethodAccessorImpl],
            methodName=@String[invoke0],
            fileName=@String[NativeMethodAccessorImpl.java],
            lineNumber=@Integer[-2],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[sun.reflect.NativeMethodAccessorImpl],
            methodName=@String[invoke],
            fileName=@String[NativeMethodAccessorImpl.java],
            lineNumber=@Integer[62],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[sun.reflect.DelegatingMethodAccessorImpl],
            methodName=@String[invoke],
            fileName=@String[DelegatingMethodAccessorImpl.java],
            lineNumber=@Integer[43],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[java.lang.reflect.Method],
            methodName=@String[invoke],
            fileName=@String[Method.java],
            lineNumber=@Integer[498],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.OgnlRuntime],
            methodName=@String[invokeMethod],
            fileName=@String[OgnlRuntime.java],
            lineNumber=@Integer[899],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.OgnlRuntime],
            methodName=@String[callAppropriateMethod],
            fileName=@String[OgnlRuntime.java],
            lineNumber=@Integer[1544],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.ObjectMethodAccessor],
            methodName=@String[callMethod],
            fileName=@String[ObjectMethodAccessor.java],
            lineNumber=@Integer[68],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.OgnlRuntime],
            methodName=@String[callMethod],
            fileName=@String[OgnlRuntime.java],
            lineNumber=@Integer[1620],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.ASTMethod],
            methodName=@String[getValueBody],
            fileName=@String[ASTMethod.java],
            lineNumber=@Integer[91],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[evaluateGetValueBody],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[212],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[getValue],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[258],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.ASTChain],
            methodName=@String[getValueBody],
            fileName=@String[ASTChain.java],
            lineNumber=@Integer[141],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[evaluateGetValueBody],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[212],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[getValue],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[258],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.ASTList],
            methodName=@String[getValueBody],
            fileName=@String[ASTList.java],
            lineNumber=@Integer[60],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[evaluateGetValueBody],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[212],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[getValue],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[258],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.Ognl],
            methodName=@String[getValue],
            fileName=@String[Ognl.java],
            lineNumber=@Integer[470],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.Ognl],
            methodName=@String[getValue],
            fileName=@String[Ognl.java],
            lineNumber=@Integer[572],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.Ognl],
            methodName=@String[getValue],
            fileName=@String[Ognl.java],
            lineNumber=@Integer[542],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.command.express.OgnlExpress],
            methodName=@String[get],
            fileName=@String[OgnlExpress.java],
            lineNumber=@Integer[40],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.advisor.AdviceListenerAdapter],
            methodName=@String[getExpressionResult],
            fileName=@String[AdviceListenerAdapter.java],
            lineNumber=@Integer[123],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.command.monitor200.WatchAdviceListener],
            methodName=@String[watching],
            fileName=@String[WatchAdviceListener.java],
            lineNumber=@Integer[87],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.command.monitor200.WatchAdviceListener],
            methodName=@String[finishing],
            fileName=@String[WatchAdviceListener.java],
            lineNumber=@Integer[71],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.command.monitor200.WatchAdviceListener],
            methodName=@String[afterReturning],
            fileName=@String[WatchAdviceListener.java],
            lineNumber=@Integer[55],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.advisor.AdviceListenerAdapter],
            methodName=@String[afterReturning],
            fileName=@String[AdviceListenerAdapter.java],
            lineNumber=@Integer[57],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.advisor.SpyImpl],
            methodName=@String[atExit],
            fileName=@String[SpyImpl.java],
            lineNumber=@Integer[67],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[java.arthas.SpyAPI],
            methodName=@String[atExit],
            fileName=@String[SpyAPI.java],
            lineNumber=@Integer[64],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.RedisStateMachine],
            methodName=@String[safeSet],
            fileName=@String[RedisStateMachine.java],
            lineNumber=@Integer[782],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.RedisStateMachine],
            methodName=@String[handleInteger],
            fileName=@String[RedisStateMachine.java],
            lineNumber=@Integer[404],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.RedisStateMachine$State$Type],
            methodName=@String[handle],
            fileName=@String[RedisStateMachine.java],
            lineNumber=@Integer[206],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.RedisStateMachine],
            methodName=@String[doDecode],
            fileName=@String[RedisStateMachine.java],
            lineNumber=@Integer[334],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.RedisStateMachine],
            methodName=@String[decode],
            fileName=@String[RedisStateMachine.java],
            lineNumber=@Integer[295],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.CommandHandler],
            methodName=@String[decode],
            fileName=@String[CommandHandler.java],
            lineNumber=@Integer[842],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.CommandHandler],
            methodName=@String[decode0],
            fileName=@String[CommandHandler.java],
            lineNumber=@Integer[793],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.CommandHandler],
            methodName=@String[decode],
            fileName=@String[CommandHandler.java],
            lineNumber=@Integer[767],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.CommandHandler],
            methodName=@String[decode],
            fileName=@String[CommandHandler.java],
            lineNumber=@Integer[659],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.CommandHandler],
            methodName=@String[channelRead],
            fileName=@String[CommandHandler.java],
            lineNumber=@Integer[599],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.AbstractChannelHandlerContext],
            methodName=@String[invokeChannelRead],
            fileName=@String[AbstractChannelHandlerContext.java],
            lineNumber=@Integer[442],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.AbstractChannelHandlerContext],
            methodName=@String[invokeChannelRead],
            fileName=@String[AbstractChannelHandlerContext.java],
            lineNumber=@Integer[420],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.AbstractChannelHandlerContext],
            methodName=@String[fireChannelRead],
            fileName=@String[AbstractChannelHandlerContext.java],
            lineNumber=@Integer[412],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.DefaultChannelPipeline$HeadContext],
            methodName=@String[channelRead],
            fileName=@String[DefaultChannelPipeline.java],
            lineNumber=@Integer[1410],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.AbstractChannelHandlerContext],
            methodName=@String[invokeChannelRead],
            fileName=@String[AbstractChannelHandlerContext.java],
            lineNumber=@Integer[440],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.AbstractChannelHandlerContext],
            methodName=@String[invokeChannelRead],
            fileName=@String[AbstractChannelHandlerContext.java],
            lineNumber=@Integer[420],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.DefaultChannelPipeline],
            methodName=@String[fireChannelRead],
            fileName=@String[DefaultChannelPipeline.java],
            lineNumber=@Integer[919],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe],
            methodName=@String[epollInReady],
            fileName=@String[AbstractEpollStreamChannel.java],
            lineNumber=@Integer[801],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.epoll.EpollEventLoop],
            methodName=@String[processReady],
            fileName=@String[EpollEventLoop.java],
            lineNumber=@Integer[509],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.epoll.EpollEventLoop],
            methodName=@String[run],
            fileName=@String[EpollEventLoop.java],
            lineNumber=@Integer[407],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.util.concurrent.SingleThreadEventExecutor$4],
            methodName=@String[run],
            fileName=@String[SingleThreadEventExecutor.java],
            lineNumber=@Integer[997],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.util.internal.ThreadExecutorMap$2],
            methodName=@String[run],
            fileName=@String[ThreadExecutorMap.java],
            lineNumber=@Integer[74],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.util.concurrent.FastThreadLocalRunnable],
            methodName=@String[run],
            fileName=@String[FastThreadLocalRunnable.java],
            lineNumber=@Integer[30],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[java.lang.Thread],
            methodName=@String[run],
            fileName=@String[Thread.java],
            lineNumber=@Integer[748],
            serialVersionUID=@Long[6992337162326171013],
        ],
    ],
]

zafir-zhong avatar May 28 '24 02:05 zafir-zhong

Hey @zafir-zhong , are you sure this issue does not belong to the spring-data-redis? From the information you've provided it is hard to understand what is going wrong. Could you provide a minimal sample so we can investigate further?

tishun avatar May 28 '24 11:05 tishun

I am unable to reproduce this issue stably, but it always occurs sporadically.And, in the exception stack, only the relevant information of Lettuce can be seen. it happen when gateway listen a message {"apps":[“D3sX4"],"status": 2} from redis,and causing the service to be unable to read data from Redis

zafir-zhong avatar May 29 '24 01:05 zafir-zhong

Can you provide some suggestions on when Lettuce may throw this exception? Now all I know is that the service malfunctioned after receiving a Redis message

zafir-zhong avatar May 29 '24 01:05 zafir-zhong

Can you provide some suggestions on when Lettuce may throw this exception? Now all I know is that the service malfunctioned after receiving a Redis message

This message means that the Lettuce driver is not set up to process the message that was returned. Each command has an implementation of the CommandOutput associated to it, to help parse the response from the server. In your case this is a ValueOutput. The ValueOutput does not handle long values and thus the processing fails.

Now why we are receiving the wrong value is a question I can't answer.

What type of serialization are you using for your ReactiveRedisTemplate? Are messages of mixed type expected on this channel? What is the purpose of this code?

tishun avatar May 29 '24 09:05 tishun

I am unable to reproduce this issue stably, but it always occurs sporadically.And, in the exception stack, only the relevant information of Lettuce can be seen. it happen when gateway listen a message {"apps":[“D3sX4"],"status": 2} from redis,and causing the service to be unable to read data from Redis

Have you asked your question in the spring-data-redis ?

tishun avatar May 29 '24 09:05 tishun

Can you provide some suggestions on when Lettuce may throw this exception? Now all I know is that the service malfunctioned after receiving a Redis message

This message means that the Lettuce driver is not set up to process the message that was returned. Each command has an implementation of the CommandOutput associated to it, to help parse the response from the server. In your case this is a ValueOutput. The ValueOutput does not handle long values and thus the processing fails.

Now why we are receiving the wrong value is a question I can't answer.

What type of serialization are you using for your ReactiveRedisTemplate? Are messages of mixed type expected on this channel? What is the purpose of this code?

use jason serialization I didn't find any of my own code in the exception message, so I can't actually confirm which line of code caused it

zafir-zhong avatar May 31 '24 01:05 zafir-zhong

I am unable to reproduce this issue stably, but it always occurs sporadically.And, in the exception stack, only the relevant information of Lettuce can be seen. it happen when gateway listen a message {"apps":[“D3sX4"],"status": 2} from redis,and causing the service to be unable to read data from Redis

Have you asked your question in the spring-data-redis ?

i try it now.

zafir-zhong avatar May 31 '24 01:05 zafir-zhong

Looks like a variant of #2175

mp911de avatar May 31 '24 07:05 mp911de

Looks like a variant of #2175

Do you think it is more likely a problem of the driver or the way spring-data-redis uses it? I am trying to see a pattern myselft, but I see we also have instances of this issue manifested when the driver is used standalone.

tishun avatar May 31 '24 08:05 tishun

Impossible to say without a reproducer. The listenToChannel(…) method effectively SUBSCRIBEs to a channel with a PubSubOutput. Given the exception above that mentions ValueOutput, there's a gap that only a reproducer can describe.

mp911de avatar May 31 '24 12:05 mp911de

Hey @zafir-zhong ,

a few followup questions:

  • do you see any other issues in the log that precede this one (Out-of-Memory, NullPointerException, etc.)?
  • do you use a custom RedisCodec?
  • does the issue persist, after it happens, until you restart the application, or does the application recover by itself?

tishun avatar Jan 13 '25 07:01 tishun

Hey @zafir-zhong ,

a few followup questions:

  • do you see any other issues in the log that precede this one (Out-of-Memory, NullPointerException, etc.)?
  • do you use a custom RedisCodec?
  • does the issue persist, after it happens, until you restart the application, or does the application recover by itself?
  1. no
  2. no custom RedisCodec
  3. until you restart the application

Special Usage: had override org.springframework.core.codec.AbstractDataBufferDecoder and set maxInMemorySize= 256000 * 1024 ; had override org.springframework.data.redis.core.DefaultReactiveHashOperations and replace entries(H key) (here disabledHGetAll is false )

@Override
public Flux<Map.Entry<HK, HV>> entries(H key) {
    Assert.notNull(key, "Key must not be null!");
    if (ObjectUtil.equals("true", System.getProperty("disabledHGetAll", "false"))) {
        ScanOptions build = ScanOptions.scanOptions().match("*").build();
        return scan(key, build);
    }
    return createFlux(connection -> connection.hGetAll(rawKey(key))
            .map(this::deserializeHashEntry));
}

/*
 * (non-Javadoc)
 * @see org.springframework.data.redis.core.ReactiveHashOperations#scan(java.lang.Object, org.springframework.data.redis.core.ScanOptions)
 */
@Override
public Flux<Map.Entry<HK, HV>> scan(H key, ScanOptions options) {

    Assert.notNull(key, "Key must not be null!");
    Assert.notNull(key, "ScanOptions must not be null!");

    return createFlux(connection -> connection.hScan(rawKey(key), options) //
            .map(this::deserializeHashEntry));
}

zafir-zhong avatar Jan 13 '25 08:01 zafir-zhong

If you would like us to look at this issue, please provide the requested information. If the information is not provided within the next 30 days this issue will be closed.

github-actions[bot] avatar Feb 14 '25 00:02 github-actions[bot]