fix: 修复容错 JSON 解析器的 Mutex 污染问题
- 替换 unwrap() 为适当的错误处理,避免 PoisonError 导致的 panic - 在 Mutex 被污染时返回友好的错误信息而不是崩溃 - 提高 VEO3 角色文件创建功能的稳定性
This commit is contained in:
parent
d86c1d23fb
commit
8785cc6097
|
|
@ -99,7 +99,9 @@ impl JsonParserState {
|
||||||
|
|
||||||
/// 获取或创建解析器实例
|
/// 获取或创建解析器实例
|
||||||
fn get_or_create_parser(&self, config: Option<ParserConfig>) -> Result<()> {
|
fn get_or_create_parser(&self, config: Option<ParserConfig>) -> Result<()> {
|
||||||
let mut parser_guard = self.parser.lock().unwrap();
|
let mut parser_guard = self.parser.lock().map_err(|_| {
|
||||||
|
anyhow::anyhow!("Failed to acquire parser lock")
|
||||||
|
})?;
|
||||||
|
|
||||||
// 每次都创建新的解析器实例以确保使用正确的配置
|
// 每次都创建新的解析器实例以确保使用正确的配置
|
||||||
let parser = TolerantJsonParser::new(config)?;
|
let parser = TolerantJsonParser::new(config)?;
|
||||||
|
|
@ -132,7 +134,18 @@ pub async fn parse_json_tolerant(
|
||||||
}
|
}
|
||||||
|
|
||||||
// 执行解析
|
// 执行解析
|
||||||
let mut parser_guard = state.parser.lock().unwrap();
|
let mut parser_guard = match state.parser.lock() {
|
||||||
|
Ok(guard) => guard,
|
||||||
|
Err(_) => {
|
||||||
|
error!("Failed to acquire parser lock, mutex is poisoned");
|
||||||
|
return Ok(ParseJsonResponse {
|
||||||
|
success: false,
|
||||||
|
data: None,
|
||||||
|
statistics: None,
|
||||||
|
error: Some("Parser lock is poisoned, please restart the application".to_string()),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
if let Some(ref mut parser) = *parser_guard {
|
if let Some(ref mut parser) = *parser_guard {
|
||||||
info!("Starting JSON parsing for text: {}", &request.text[..std::cmp::min(100, request.text.len())]);
|
info!("Starting JSON parsing for text: {}", &request.text[..std::cmp::min(100, request.text.len())]);
|
||||||
match parser.parse(&request.text) {
|
match parser.parse(&request.text) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue