alibaba / alibaba/Sentinel

[BUG] webflux中SlotChainBuilder实例化异常后客户端被无限阻塞

Open
#3,488 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
23.1k
Forks
8.1k
PR merge metrics
No merged PRs in 30d

Description

## Issue Description

Type: *bug report*

### Describe what happened

在spring-webflux中使用sentinel
请求过程中实例化SlotChainBuilder报错后DefaultErrorWebExceptionHandler无法正常处理异常并且不会输出任何日志,客户端请求被无限阻塞.
原因是SentinelReactorSubscriber的entryWhenSubscribed()方法只处理了BlockException异常
```java
private void entryWhenSubscribed() {
ContextConfig sentinelContextConfig = this.entryConfig.getContextConfig();
if (sentinelContextConfig != null) {
ContextUtil.enter(sentinelContextConfig.getContextName(), sentinelContextConfig.getOrigin());
}

try {
AsyncEntry entry = SphU.asyncEntry(this.entryConfig.getResourceName(), this.entryConfig.getResourceType(), this.entryConfig.getEntryType(), this.entryConfig.getAcquireCount(), this.entryConfig.getArgs());
this.currentEntry = entry;
this.actual.onSubscribe(this);
} catch (BlockException ex) {
this.entryExited.set(true);
this.cancel();
this.actual.onSubscribe(this);
this.actual.onError(ex);
} finally {
if (sentinelContextConfig != null) {
ContextUtil.exit();
}

}

}
```

### Describe what you expected to happen

### How to reproduce it (as minimally and precisely as possible)

1. 使用sentinel示例项目sentinel-webflux-example
2. 配置com.alibaba.csp.sentinel.slotchain.SlotChainBuilder的自定义实现
```jajva
public class TestBuilder extends DefaultSlotChainBuilder {

@Override
public ProcessorSlotChain build() {
ProcessorSlotChain chain = super.build();
if(1==1){
// 强制抛出异常
throw new RuntimeException();
}
return chain;
}
}
```

### Tell us your environment

jdk21、spring-webflux:3.2.9

### Anything else we need to know?

entryWhenSubscribed()方法中处理包括BlockException的所有异常,问题解决

Contributor guide

Open the contributing guide

Research direction

Start with SentinelReactorSubscriber.entryWhenSubscribed() and reproduce the failure in the sentinel-webflux-example using the custom SlotChainBuilder shown in the issue. Check how the RuntimeException moves through Spring WebFlux and DefaultErrorWebExceptionHandler. Done means the client request terminates with the exception handled rather than remaining blocked, with the failure observable through logging or error propagation.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
api, backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.