SyncIOBridge caused tokio panic

This commit is contained in:
euzu
2025-11-21 01:35:04 +01:00
parent 24880101df
commit 98dc80dd75
16 changed files with 173 additions and 192 deletions
+31 -27
View File
@@ -1,12 +1,10 @@
use std::collections::{HashMap, HashSet};
use std::fs::File;
use std::io::{BufReader, Write};
use std::path::Path;
use crate::utils::file_reader;
use serde::Serialize;
use serde_json::Value;
use shared::utils::json_iter_array;
use crate::utils::file_reader;
use tokio_util::io::SyncIoBridge;
use std::collections::{HashMap, HashSet};
use std::fs::File;
use std::io::Write;
use std::path::Path;
pub fn json_filter_file<S: ::std::hash::BuildHasher>(file_path: &Path, filter: &HashMap<&str, HashSet<String, S>, S>) -> Vec<serde_json::Value> {
let mut filtered: Vec<serde_json::Value> = Vec::with_capacity(1024);
@@ -19,33 +17,39 @@ pub fn json_filter_file<S: ::std::hash::BuildHasher>(file_path: &Path, filter: &
};
let reader = file_reader(file);
for entry in json_iter_array::<serde_json::Value, BufReader<File>>(reader).flatten() {
if let Some(item) = entry.as_object() {
if filter.iter().all(|(&key, filter_set)| {
item.get(key).is_some_and(|field_value| match field_value {
Value::String(s) => filter_set.contains(s.as_str()),
Value::Number(n) => filter_set.contains(n.as_str()),
_ => false,
})
}) {
filtered.push(entry);
match serde_json::from_reader(reader) {
Ok(value) => {
if let Value::Array(list) = value {
for entry in list {
if let Some(item) = entry.as_object() {
if filter.iter().all(|(&key, filter_set)| {
item.get(key).is_some_and(|field_value| match field_value {
Value::String(s) => filter_set.contains(s.as_str()),
Value::Number(n) => filter_set.contains(n.as_str()),
_ => false,
})
}) {
filtered.push(entry);
}
}
}
}
}
Err(_err) => {}
}
filtered
}
pub async fn json_write_documents_to_file<T>(file: &std::path::Path, value: &T) -> std::io::Result<()>
pub fn json_write_documents_to_file<T>(
path: &std::path::Path,
value: &T,
) -> std::io::Result<()>
where
T: ?Sized + Serialize,
T: Serialize,
{
let file = tokio::fs::File::create(file).await?;
let sync_writer = SyncIoBridge::new(file);
let mut buf_writer = std::io::BufWriter::new(sync_writer);
let file = std::fs::File::create(path)?;
let mut buf_writer = std::io::BufWriter::new(file);
serde_json::to_writer(&mut buf_writer, value)?;
buf_writer.flush()?;
Ok(())
}
buf_writer.flush()
}
+1 -1
View File
@@ -331,7 +331,7 @@ async fn get_remote_content(client: Arc<reqwest::Client>, input: &InputSource, h
let (mut stream, response_url) = get_remote_content_as_stream(client.clone(), url, input.method, Some(&headers)).await.map_err(|e| str_to_io_error(&format!("Failed to read content: {e}")))?;
let mut content = String::new();
stream.read_to_string(&mut content).await.map_err(|e| str_to_io_error(&format!("Failed to read content: {e}")))?;
debug_if_enabled!("Request took:{} {}", format_elapsed_time(start_time.elapsed().as_secs()), sanitize_sensitive_info(url.as_str()));
debug_if_enabled!("Request took: {} {}", format_elapsed_time(start_time.elapsed().as_secs()), sanitize_sensitive_info(url.as_str()));
Ok((content, response_url))
}