diff options
| author | 魏曹先生 <1992414357@qq.com> | 2025-11-17 20:30:02 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2025-11-17 20:30:02 +0800 |
| commit | 5734fa8140363a602400f16a79b7cbaf504e01c0 (patch) | |
| tree | 09127a47b29711d8bec59a4322ded88288074dbb /crates/vcs_actions/src/actions | |
| parent | f73c4c0071bb37430cbf48f7e2d06dcdedb2c8ec (diff) | |
Ensure task processing order by using Vec instead of HashSet
The change from HashSet to Vec for task collections maintains the order
of file operations, which is important for consistent processing
behavior. This affects created_task, update_task, and sync_task
variables throughout the code.
Diffstat (limited to 'crates/vcs_actions/src/actions')
| -rw-r--r-- | crates/vcs_actions/src/actions/virtual_file_actions.rs | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/crates/vcs_actions/src/actions/virtual_file_actions.rs b/crates/vcs_actions/src/actions/virtual_file_actions.rs index fa74873..967f573 100644 --- a/crates/vcs_actions/src/actions/virtual_file_actions.rs +++ b/crates/vcs_actions/src/actions/virtual_file_actions.rs @@ -4,7 +4,7 @@ use action_system::{action::ActionContext, macros::action_gen}; use cfg_file::config::ConfigFile; use serde::{Deserialize, Serialize}; use tcp_connection::{error::TcpTargetError, instance::ConnectionInstance}; -use tokio::{sync::Mutex, time::Instant}; +use tokio::sync::Mutex; use vcs_data::data::{ local::{ cached_sheet::CachedSheet, file_status::AnalyzeResult, local_sheet::LocalMappingMetadata, @@ -107,22 +107,26 @@ pub async fn track_file_action( .modified .intersection(&relative_pathes) .cloned() - .collect::<HashSet<_>>(); + .collect::<Vec<_>>(); // Filter out created files let created_task = analyzed .created .intersection(&relative_pathes) .cloned() - .collect::<HashSet<_>>(); + .collect::<Vec<_>>(); // Filter out modified files that need to be updated - let update_task: HashSet<PathBuf> = { + let update_task: Vec<PathBuf> = { let result = modified.iter().filter_map(|p| { - if let Ok(data) = local_sheet.mapping_data(p) { - let id = data.mapping_vfid(); + if let (Ok(local_data), Some(cached_data)) = + (local_sheet.mapping_data(p), cached_sheet.mapping().get(p)) + { + let id = local_data.mapping_vfid(); + let local_ver = local_data.version_when_updated(); if let Some(held_member) = member_held.file_holder(id) { - if held_member == &member_id { + // Check if holder and version match + if held_member == &member_id && local_ver == &cached_data.version { return Some(p.clone()); } } @@ -133,14 +137,12 @@ pub async fn track_file_action( }; // Filter out files that do not exist locally or have version inconsistencies and need to be synchronized - let sync_task: HashSet<PathBuf> = { - let other = relative_pathes - .difference(&created_task) - .cloned() - .collect::<HashSet<_>>() - .difference(&update_task) + let sync_task: Vec<PathBuf> = { + let other: Vec<PathBuf> = relative_pathes + .iter() + .filter(|p| !created_task.contains(p) && !update_task.contains(p)) .cloned() - .collect::<HashSet<_>>(); + .collect(); let result = other.iter().filter_map(|p| { // In cached sheet @@ -167,7 +169,7 @@ pub async fn track_file_action( }; // Package tasks - let tasks: (HashSet<PathBuf>, HashSet<PathBuf>, HashSet<PathBuf>) = + let tasks: (Vec<PathBuf>, Vec<PathBuf>, Vec<PathBuf>) = (created_task, update_task, sync_task); // Send to remote @@ -230,11 +232,7 @@ pub async fn track_file_action( if ctx.is_proc_on_remote() { // Read tasks - let (created_task, update_task, sync_task): ( - HashSet<PathBuf>, - HashSet<PathBuf>, - HashSet<PathBuf>, - ) = { + let (created_task, update_task, sync_task): (Vec<PathBuf>, Vec<PathBuf>, Vec<PathBuf>) = { let mut mut_instance = instance.lock().await; mut_instance.read_large_msgpack(1024u16).await? }; @@ -311,7 +309,7 @@ async fn proc_create_tasks_local( instance: Arc<Mutex<ConnectionInstance>>, member_id: &MemberId, sheet_name: &SheetName, - relative_paths: HashSet<PathBuf>, + relative_paths: Vec<PathBuf>, ) -> Result<CreateTaskResult, TcpTargetError> { let workspace = try_get_local_workspace(&ctx)?; let mut mut_instance = instance.lock().await; @@ -380,7 +378,7 @@ async fn proc_create_tasks_remote( instance: Arc<Mutex<ConnectionInstance>>, member_id: &MemberId, sheet_name: &SheetName, - relative_paths: HashSet<PathBuf>, + relative_paths: Vec<PathBuf>, ) -> Result<CreateTaskResult, TcpTargetError> { let vault = try_get_vault(&ctx)?; let mut mut_instance = instance.lock().await; @@ -445,7 +443,7 @@ async fn proc_update_tasks_local( instance: Arc<Mutex<ConnectionInstance>>, member_id: &MemberId, sheet_name: &SheetName, - relative_paths: HashSet<PathBuf>, + relative_paths: Vec<PathBuf>, ) -> Result<UpdateTaskResult, TcpTargetError> { Ok(UpdateTaskResult::Success(Vec::new())) } @@ -455,7 +453,7 @@ async fn proc_update_tasks_remote( instance: Arc<Mutex<ConnectionInstance>>, member_id: &MemberId, sheet_name: &SheetName, - relative_paths: HashSet<PathBuf>, + relative_paths: Vec<PathBuf>, ) -> Result<UpdateTaskResult, TcpTargetError> { Ok(UpdateTaskResult::Success(Vec::new())) } @@ -465,7 +463,7 @@ async fn proc_sync_tasks_local( instance: Arc<Mutex<ConnectionInstance>>, member_id: &MemberId, sheet_name: &SheetName, - relative_paths: HashSet<PathBuf>, + relative_paths: Vec<PathBuf>, ) -> Result<SyncTaskResult, TcpTargetError> { Ok(SyncTaskResult::Success(Vec::new())) } @@ -475,7 +473,7 @@ async fn proc_sync_tasks_remote( instance: Arc<Mutex<ConnectionInstance>>, member_id: &MemberId, sheet_name: &SheetName, - relative_paths: HashSet<PathBuf>, + relative_paths: Vec<PathBuf>, ) -> Result<SyncTaskResult, TcpTargetError> { Ok(SyncTaskResult::Success(Vec::new())) } |
