You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Describe the bug
ReactiveRedisSessionRepository.RedisSession#saveChangeSessionId might fail with "ERR no such key" if the session has been deleted concurrently. The issue has been fixed in the non reactive part in issue #1137. It is not fixed in ReactiveRedisSessionRepository. I assume it happens much less frequently there, as it checks if the key exists before doing the rename, but if the key is deleted in between those operations, it fails.
To Reproduce
Use ReactiveRedisSessionRepository, logout concurrently.
Logout of a session stored in
Hard to test as ReactiveRedisSessionRepository#save checks if the key exists, so the issue only happens when deletion is done concurrently.
Expected behavior
"ERR no such key" should be ignored when renaming a session.
Here is the Exception we frequently see. We use spring-data-redis 2.7.8
org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR no such key
at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:54)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.FluxLift] :
reactor.core.publisher.Flux.onErrorMap
org.springframework.data.redis.connection.lettuce.LettuceReactiveRedisConnection.execute(LettuceReactiveRedisConnection.java:224)
Error has been observed at the following site(s):
*_________Flux.onErrorMap ⇢ at org.springframework.data.redis.connection.lettuce.LettuceReactiveRedisConnection.execute(LettuceReactiveRedisConnection.java:224)
|_ ⇢ at org.springframework.data.redis.connection.lettuce.LettuceReactiveKeyCommands.rename(LettuceReactiveKeyCommands.java:174)
|_ Flux.next ⇢ at org.springframework.data.redis.connection.ReactiveKeyCommands.rename(ReactiveKeyCommands.java:381)
|_ Mono.map ⇢ at org.springframework.data.redis.connection.ReactiveKeyCommands.rename(ReactiveKeyCommands.java:381)
*__________Flux.usingWhen ⇢ at org.springframework.data.redis.core.ReactiveRedisTemplate.doInConnection(ReactiveRedisTemplate.java:242)
|_ Mono.from ⇢ at org.springframework.data.redis.core.ReactiveRedisTemplate.doCreateMono(ReactiveRedisTemplate.java:220)
|_ ⇢ at org.springframework.data.redis.core.ReactiveRedisTemplate.rename(ReactiveRedisTemplate.java:396)
*________________Mono.and ⇢ at org.springframework.session.data.redis.ReactiveRedisSessionRepository$RedisSession.saveChangeSessionId(ReactiveRedisSessionRepository.java:313)
*_______________Mono.then ⇢ at org.springframework.session.data.redis.ReactiveRedisSessionRepository$RedisSession.lambda$save$2(ReactiveRedisSessionRepository.java:267)
|_ Mono.doOnSuccess ⇢ at org.springframework.session.data.redis.ReactiveRedisSessionRepository$RedisSession.lambda$save$2(ReactiveRedisSessionRepository.java:267)
*______________Mono.defer ⇢ at org.springframework.session.data.redis.ReactiveRedisSessionRepository$RedisSession.save(ReactiveRedisSessionRepository.java:267)
|_ ⇢ at org.springframework.session.data.redis.ReactiveRedisSessionRepository$RedisSession.access$100(ReactiveRedisSessionRepository.java:167)
*____________Mono.flatMap ⇢ at org.springframework.session.data.redis.ReactiveRedisSessionRepository.save(ReactiveRedisSessionRepository.java:127)
|_ ⇢ at org.springframework.session.data.redis.ReactiveRedisSessionRepository.save(ReactiveRedisSessionRepository.java:43)
|_ ⇢ at org.springframework.session.web.server.session.SpringSessionWebSessionStore$SpringSessionWebSession.save(SpringSessionWebSessionStore.java:166)
|_ ⇢ at org.springframework.session.web.server.session.SpringSessionWebSessionStore$SpringSessionWebSession.lambda$changeSessionId$0(SpringSessionWebSessionStore.java:138)
*______________Mono.defer ⇢ at org.springframework.session.web.server.session.SpringSessionWebSessionStore$SpringSessionWebSession.changeSessionId(SpringSessionWebSessionStore.java:136)
*____________Mono.flatMap ⇢ at org.springframework.security.web.server.context.WebSessionServerSecurityContextRepository.save(WebSessionServerSecurityContextRepository.java:82)
|_ ⇢ at org.springframework.security.web.server.authentication.logout.SecurityContextServerLogoutHandler.logout(SecurityContextServerLogoutHandler.java:40)
*__________Flux.concatMap ⇢ at org.springframework.security.web.server.authentication.logout.DelegatingServerLogoutHandler.logout(DelegatingServerLogoutHandler.java:53)
|_ Flux.then ⇢ at org.springframework.security.web.server.authentication.logout.DelegatingServerLogoutHandler.logout(DelegatingServerLogoutHandler.java:54)
*_______________Mono.then ⇢ at org.springframework.security.web.server.authentication.logout.LogoutWebFilter.logout(LogoutWebFilter.java:76)
|_ Mono.subscriberContext ⇢ at org.springframework.security.web.server.authentication.logout.LogoutWebFilter.logout(LogoutWebFilter.java:77)
|_ ⇢ at org.springframework.security.web.server.authentication.logout.LogoutWebFilter.lambda$filter$2(LogoutWebFilter.java:65)
*____________Mono.flatMap ⇢ at org.springframework.security.web.server.authentication.logout.LogoutWebFilter.filter(LogoutWebFilter.java:63)
|_ checkpoint ⇢ org.springframework.security.web.server.authentication.logout.LogoutWebFilter [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
|_ ⇢ at org.springframework.security.web.server.savedrequest.ServerRequestCacheWebFilter.lambda$filter$1(ServerRequestCacheWebFilter.java:39)
*____________Mono.flatMap ⇢ at org.springframework.security.web.server.savedrequest.ServerRequestCacheWebFilter.filter(ServerRequestCacheWebFilter.java:39)
|_ checkpoint ⇢ org.springframework.security.web.server.savedrequest.ServerRequestCacheWebFilter [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
|_ ⇢ at org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter.filter(SecurityContextServerWebExchangeWebFilter.java:38)
|_ checkpoint ⇢ org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
*_______________Mono.then ⇢ at org.springframework.security.web.server.authentication.AuthenticationWebFilter.filter(AuthenticationWebFilter.java:113)
*______Mono.switchIfEmpty ⇢ at org.springframework.security.web.server.authentication.AuthenticationWebFilter.filter(AuthenticationWebFilter.java:113)
|_ Mono.flatMap ⇢ at org.springframework.security.web.server.authentication.AuthenticationWebFilter.filter(AuthenticationWebFilter.java:114)
|_ Mono.onErrorResume ⇢ at org.springframework.security.web.server.authentication.AuthenticationWebFilter.filter(AuthenticationWebFilter.java:115)
|_ checkpoint ⇢ org.springframework.security.web.server.authentication.AuthenticationWebFilter [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
*_______________Mono.then ⇢ at org.springframework.security.web.server.authentication.AuthenticationWebFilter.filter(AuthenticationWebFilter.java:113)
*______Mono.switchIfEmpty ⇢ at org.springframework.security.web.server.authentication.AuthenticationWebFilter.filter(AuthenticationWebFilter.java:113)
|_ Mono.flatMap ⇢ at org.springframework.security.web.server.authentication.AuthenticationWebFilter.filter(AuthenticationWebFilter.java:114)
|_ Mono.onErrorResume ⇢ at org.springframework.security.web.server.authentication.AuthenticationWebFilter.filter(AuthenticationWebFilter.java:115)
|_ checkpoint ⇢ org.springframework.security.oauth2.client.web.server.authentication.OAuth2LoginAuthenticationWebFilter [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
*_______________Mono.then ⇢ at org.springframework.security.oauth2.client.web.server.OAuth2AuthorizationRequestRedirectWebFilter.filter(OAuth2AuthorizationRequestRedirectWebFilter.java:132)
*______Mono.switchIfEmpty ⇢ at org.springframework.security.oauth2.client.web.server.OAuth2AuthorizationRequestRedirectWebFilter.filter(OAuth2AuthorizationRequestRedirectWebFilter.java:132)
|_ Mono.onErrorResume ⇢ at org.springframework.security.oauth2.client.web.server.OAuth2AuthorizationRequestRedirectWebFilter.filter(OAuth2AuthorizationRequestRedirectWebFilter.java:133)
|_ Mono.flatMap ⇢ at org.springframework.security.oauth2.client.web.server.OAuth2AuthorizationRequestRedirectWebFilter.filter(OAuth2AuthorizationRequestRedirectWebFilter.java:137)
|_ checkpoint ⇢ org.springframework.security.oauth2.client.web.server.OAuth2AuthorizationRequestRedirectWebFilter [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
|_ Mono.subscriberContext ⇢ at org.springframework.security.web.server.context.ReactorContextWebFilter.filter(ReactorContextWebFilter.java:47)
|_ checkpoint ⇢ org.springframework.security.web.server.context.ReactorContextWebFilter [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
|_ ⇢ at org.springframework.security.web.server.csrf.CsrfWebFilter.lambda$continueFilterChain$10(CsrfWebFilter.java:165)
*______________Mono.defer ⇢ at org.springframework.security.web.server.csrf.CsrfWebFilter.continueFilterChain(CsrfWebFilter.java:162)
*_______________Mono.then ⇢ at org.springframework.security.web.server.csrf.CsrfWebFilter.filter(CsrfWebFilter.java:124)
*______Mono.switchIfEmpty ⇢ at org.springframework.security.web.server.csrf.CsrfWebFilter.filter(CsrfWebFilter.java:124)
|_ Mono.onErrorResume ⇢ at org.springframework.security.web.server.csrf.CsrfWebFilter.filter(CsrfWebFilter.java:125)
|_ checkpoint ⇢ org.springframework.security.web.server.csrf.CsrfWebFilter [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
|_ checkpoint ⇢ org.springframework.web.cors.reactive.CorsWebFilter [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
|_ ⇢ at org.springframework.security.web.server.header.HttpHeaderWriterWebFilter.filter(HttpHeaderWriterWebFilter.java:44)
|_ checkpoint ⇢ org.springframework.security.web.server.header.HttpHeaderWriterWebFilter [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
|_ Mono.subscriberContext ⇢ at org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter.filter(ServerHttpSecurity.java:3239)
|_ checkpoint ⇢ org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
|_ ⇢ at org.springframework.web.server.handler.FilteringWebHandler.handle(FilteringWebHandler.java:59)
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
|_ ⇢ at org.springframework.security.web.server.WebFilterChainProxy.lambda$filter$4(WebFilterChainProxy.java:56)
*____________Mono.flatMap ⇢ at org.springframework.security.web.server.WebFilterChainProxy.filter(WebFilterChainProxy.java:56)
|_ checkpoint ⇢ org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain]
|_ ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:120)
*______________Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
[...]
Original Stack Trace:
at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:54)
at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:41)
at org.springframework.data.redis.connection.lettuce.LettuceReactiveRedisConnection.lambda$translateException$0(LettuceReactiveRedisConnection.java:293)
at reactor.core.publisher.Flux.lambda$onErrorMap$28(Flux.java:7070)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.lambda$onError$1(TracingReactorSubscriber.java:41)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.withActivePath(TracingReactorSubscriber.java:62)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.onError(TracingReactorSubscriber.java:41)
at reactor.core.publisher.MonoFlatMapMany$FlatMapManyInner.onError(MonoFlatMapMany.java:255)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.lambda$onError$1(TracingReactorSubscriber.java:41)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.withActivePath(TracingReactorSubscriber.java:62)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.onError(TracingReactorSubscriber.java:41)
at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerError(FluxConcatMap.java:309)
at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onError(FluxConcatMap.java:875)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.lambda$onError$1(TracingReactorSubscriber.java:41)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.withActivePath(TracingReactorSubscriber.java:62)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.onError(TracingReactorSubscriber.java:41)
at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.onError(FluxHide.java:142)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onError(FluxMapFuseable.java:142)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.lambda$onError$1(TracingReactorSubscriber.java:41)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.withActivePath(TracingReactorSubscriber.java:62)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.onError(TracingReactorSubscriber.java:41)
at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.onError(FluxHide.java:142)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onError(FluxMapFuseable.java:142)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.lambda$onError$1(TracingReactorSubscriber.java:41)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.withActivePath(TracingReactorSubscriber.java:62)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.onError(TracingReactorSubscriber.java:41)
at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.onError(FluxHide.java:142)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:192)
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:259)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.lambda$onError$1(TracingReactorSubscriber.java:41)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.withActivePath(TracingReactorSubscriber.java:62)
at com.dynatrace.agent.introspection.reactor3.TracingReactorSubscriber.onError(TracingReactorSubscriber.java:41)
at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:93)
at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:93)
at io.lettuce.core.RedisPublisher$ImmediateSubscriber.onError(RedisPublisher.java:891)
at io.lettuce.core.RedisPublisher$State.onError(RedisPublisher.java:712)
at io.lettuce.core.RedisPublisher$RedisSubscription.onError(RedisPublisher.java:357)
at io.lettuce.core.RedisPublisher$SubscriptionCommand.onError(RedisPublisher.java:797)
at io.lettuce.core.RedisPublisher$SubscriptionCommand.doOnComplete(RedisPublisher.java:757)
at io.lettuce.core.protocol.CommandWrapper.complete(CommandWrapper.java:65)
at io.lettuce.core.protocol.CommandWrapper.complete(CommandWrapper.java:63)
at io.lettuce.core.protocol.CommandHandler.complete(CommandHandler.java:747)
at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:682)
at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:599)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1382)
at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1245)
Caused by: io.lettuce.core.RedisCommandExecutionException: ERR no such key
at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:147)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.MonoLift] :
reactor.core.publisher.Mono.from
io.lettuce.core.AbstractRedisReactiveCommands.lambda$createMono$60(AbstractRedisReactiveCommands.java:575)
Error has been observed at the following site(s):
*_________Mono.from ⇢ at io.lettuce.core.AbstractRedisReactiveCommands.lambda$createMono$60(AbstractRedisReactiveCommands.java:575)
*______Mono.flatMap ⇢ at io.lettuce.core.AbstractRedisReactiveCommands.createMono(AbstractRedisReactiveCommands.java:574)
|_ ⇢ at io.lettuce.core.AbstractRedisReactiveCommands.rename(AbstractRedisReactiveCommands.java:1447)
|_ Mono.map ⇢ at org.springframework.data.redis.connection.lettuce.LettuceReactiveKeyCommands.lambda$null$17(LettuceReactiveKeyCommands.java:179)
|_ Mono.map ⇢ at org.springframework.data.redis.connection.lettuce.LettuceReactiveKeyCommands.lambda$null$17(LettuceReactiveKeyCommands.java:180)
*____Flux.concatMap ⇢ at org.springframework.data.redis.connection.lettuce.LettuceReactiveKeyCommands.lambda$rename$18(LettuceReactiveKeyCommands.java:174)
*__Mono.flatMapMany ⇢ at org.springframework.data.redis.connection.lettuce.LettuceReactiveRedisConnection.execute(LettuceReactiveRedisConnection.java:224)
Original Stack Trace:
at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:147)
at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:116)
at io.lettuce.core.RedisPublisher$SubscriptionCommand.doOnComplete(RedisPublisher.java:757)
at io.lettuce.core.protocol.CommandWrapper.complete(CommandWrapper.java:65)
at io.lettuce.core.protocol.CommandWrapper.complete(CommandWrapper.java:63)
at io.lettuce.core.protocol.CommandHandler.complete(CommandHandler.java:747)
at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:682)
at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:599)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1382)
at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1245)
at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1294)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:529)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:468)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:800)
at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:499)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:397)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
The text was updated successfully, but these errors were encountered:
Describe the bug
ReactiveRedisSessionRepository.RedisSession#saveChangeSessionId might fail with "ERR no such key" if the session has been deleted concurrently. The issue has been fixed in the non reactive part in issue #1137. It is not fixed in ReactiveRedisSessionRepository. I assume it happens much less frequently there, as it checks if the key exists before doing the rename, but if the key is deleted in between those operations, it fails.
To Reproduce
Use ReactiveRedisSessionRepository, logout concurrently.
Logout of a session stored in
Hard to test as ReactiveRedisSessionRepository#save checks if the key exists, so the issue only happens when deletion is done concurrently.
Expected behavior
"ERR no such key" should be ignored when renaming a session.
Here is the Exception we frequently see. We use spring-data-redis 2.7.8
The text was updated successfully, but these errors were encountered: