From 63fdf1398a1932119d6505988e8b3521bf1cb9fe Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 10 Jun 2022 18:16:53 +0200 Subject: [PATCH 1/4] WIP: Start adding more logs --- crates/collab/src/rpc.rs | 8 ++++++++ crates/collab/src/rpc/store.rs | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 40ce95bce61fb7181fae8f4cd644234281b6cacf..b8e16a86501c56aa37f975afb643099b111250ad 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -605,6 +605,7 @@ impl Server { guest_user_id = state.user_id_for_connection(request.sender_id)?; }; + tracing::info!(project_id, %host_user_id, %host_connection_id, "join project"); let has_contact = self .app_state .db @@ -760,6 +761,12 @@ impl Server { { let mut store = self.store_mut().await; project = store.leave_project(sender_id, project_id)?; + tracing::info!( + project_id, + host_user_id = %project.host_user_id, + host_connection_id = %project.host_connection_id, + "leave project" + ); if project.remove_collaborator { broadcast(sender_id, project.connection_ids, |conn_id| { @@ -833,6 +840,7 @@ impl Server { &request.payload.updated_entries, request.payload.scan_id, )?; + // TODO: log `extension_counts` from `Worktree`. broadcast(request.sender_id, connection_ids, |connection_id| { self.peer diff --git a/crates/collab/src/rpc/store.rs b/crates/collab/src/rpc/store.rs index cad293876eff57582ad7a88fcd74790f4c804a8b..1d88264d72b5383207e10619b2de724cd7c8d53e 100644 --- a/crates/collab/src/rpc/store.rs +++ b/crates/collab/src/rpc/store.rs @@ -3,7 +3,13 @@ use anyhow::{anyhow, Result}; use collections::{hash_map::Entry, BTreeMap, HashMap, HashSet}; use rpc::{proto, ConnectionId, Receipt}; use serde::Serialize; -use std::{collections::hash_map, mem, path::PathBuf}; +use std::{ + collections::hash_map, + ffi::{OsStr, OsString}, + mem, + path::{Path, PathBuf}, + str, +}; use tracing::instrument; #[derive(Default, Serialize)] @@ -43,6 +49,8 @@ pub struct Worktree { #[serde(skip)] pub entries: HashMap, #[serde(skip)] + pub extension_counts: HashMap, + #[serde(skip)] pub diagnostic_summaries: BTreeMap, pub scan_id: u64, } @@ -575,9 +583,22 @@ impl Store { let metadata_changed = worktree_root_name != worktree.root_name; worktree.root_name = worktree_root_name.to_string(); for entry_id in removed_entries { - worktree.entries.remove(&entry_id); + if let Some(entry) = worktree.entries.remove(&entry_id) { + if let Some(extension) = extension_for_entry(&entry) { + if let Some(count) = worktree.extension_counts.get_mut(extension) { + *count = count.saturating_sub(1); + } + } + } } for entry in updated_entries { + if let Some(extension) = extension_for_entry(&entry) { + if let Some(count) = worktree.extension_counts.get_mut(extension) { + *count += 1; + } else { + worktree.extension_counts.insert(extension.into(), 1); + } + } worktree.entries.insert(entry.id, entry.clone()); } worktree.scan_id = scan_id; @@ -732,3 +753,10 @@ impl Channel { self.connection_ids.iter().copied().collect() } } + +fn extension_for_entry(entry: &proto::Entry) -> Option<&OsStr> { + str::from_utf8(&entry.path) + .ok() + .map(Path::new) + .and_then(|p| p.extension()) +} From 3b8388dcdd8f2e4eff17e112987ce05cf34973b0 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Mon, 13 Jun 2022 08:57:21 +0200 Subject: [PATCH 2/4] Log extension counts when worktree is updated --- crates/collab/src/rpc.rs | 32 ++++++++++++++++++++++---------- crates/collab/src/rpc/store.rs | 6 +++--- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index b8e16a86501c56aa37f975afb643099b111250ad..86fe8c8512f330d01e8c073d7f9d01a77ea82dfa 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -831,16 +831,28 @@ impl Server { request: TypedEnvelope, response: Response, ) -> Result<()> { - let (connection_ids, metadata_changed) = self.store_mut().await.update_worktree( - request.sender_id, - request.payload.project_id, - request.payload.worktree_id, - &request.payload.root_name, - &request.payload.removed_entries, - &request.payload.updated_entries, - request.payload.scan_id, - )?; - // TODO: log `extension_counts` from `Worktree`. + let (connection_ids, metadata_changed) = { + let mut store = self.store_mut().await; + let (connection_ids, metadata_changed, extension_counts) = store.update_worktree( + request.sender_id, + request.payload.project_id, + request.payload.worktree_id, + &request.payload.root_name, + &request.payload.removed_entries, + &request.payload.updated_entries, + request.payload.scan_id, + )?; + for (extension, count) in extension_counts { + tracing::info!( + project_id = request.payload.project_id, + worktree_id = request.payload.worktree_id, + ?extension, + %count, + "worktree updated" + ); + } + (connection_ids, metadata_changed) + }; broadcast(request.sender_id, connection_ids, |connection_id| { self.peer diff --git a/crates/collab/src/rpc/store.rs b/crates/collab/src/rpc/store.rs index 1d88264d72b5383207e10619b2de724cd7c8d53e..e206bcee74be51f794e60123d15eba365ca2bee2 100644 --- a/crates/collab/src/rpc/store.rs +++ b/crates/collab/src/rpc/store.rs @@ -577,8 +577,9 @@ impl Store { removed_entries: &[u64], updated_entries: &[proto::Entry], scan_id: u64, - ) -> Result<(Vec, bool)> { + ) -> Result<(Vec, bool, &HashMap)> { let project = self.write_project(project_id, connection_id)?; + let connection_ids = project.connection_ids(); let mut worktree = project.worktrees.entry(worktree_id).or_default(); let metadata_changed = worktree_root_name != worktree.root_name; worktree.root_name = worktree_root_name.to_string(); @@ -602,8 +603,7 @@ impl Store { worktree.entries.insert(entry.id, entry.clone()); } worktree.scan_id = scan_id; - let connection_ids = project.connection_ids(); - Ok((connection_ids, metadata_changed)) + Ok((connection_ids, metadata_changed, &worktree.extension_counts)) } pub fn project_connection_ids( From dcdc6311df0e05e046f261e900a594a5fc76b438 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Mon, 13 Jun 2022 09:06:58 +0200 Subject: [PATCH 3/4] Don't retain message payloads in span, just log the payload instead --- crates/collab/src/rpc.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 86fe8c8512f330d01e8c073d7f9d01a77ea82dfa..969cd05f9fd8d256d27cee5ece037590665a48c5 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -207,9 +207,14 @@ impl Server { let envelope = envelope.into_any().downcast::>().unwrap(); let span = info_span!( "handle message", - payload_type = envelope.payload_type_name(), - payload = format!("{:?}", envelope.payload).as_str(), + payload_type = envelope.payload_type_name() ); + span.in_scope(|| { + tracing::info!( + payload = format!("{:?}", envelope.payload).as_str(), + "message payload" + ); + }); let future = (handler)(server, *envelope); async move { if let Err(error) = future.await { From 502625c570716935c0555f553ac8fd152ab08895 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Mon, 13 Jun 2022 09:16:16 +0200 Subject: [PATCH 4/4] Exclude ignored files from the logged extension count --- crates/collab/src/rpc/store.rs | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/crates/collab/src/rpc/store.rs b/crates/collab/src/rpc/store.rs index e206bcee74be51f794e60123d15eba365ca2bee2..857f3515170b7f2041e06499b25276680d80302c 100644 --- a/crates/collab/src/rpc/store.rs +++ b/crates/collab/src/rpc/store.rs @@ -583,25 +583,41 @@ impl Store { let mut worktree = project.worktrees.entry(worktree_id).or_default(); let metadata_changed = worktree_root_name != worktree.root_name; worktree.root_name = worktree_root_name.to_string(); + for entry_id in removed_entries { if let Some(entry) = worktree.entries.remove(&entry_id) { - if let Some(extension) = extension_for_entry(&entry) { - if let Some(count) = worktree.extension_counts.get_mut(extension) { - *count = count.saturating_sub(1); + if !entry.is_ignored { + if let Some(extension) = extension_for_entry(&entry) { + if let Some(count) = worktree.extension_counts.get_mut(extension) { + *count = count.saturating_sub(1); + } } } } } + for entry in updated_entries { - if let Some(extension) = extension_for_entry(&entry) { - if let Some(count) = worktree.extension_counts.get_mut(extension) { - *count += 1; - } else { - worktree.extension_counts.insert(extension.into(), 1); + if let Some(old_entry) = worktree.entries.insert(entry.id, entry.clone()) { + if !old_entry.is_ignored { + if let Some(extension) = extension_for_entry(&old_entry) { + if let Some(count) = worktree.extension_counts.get_mut(extension) { + *count = count.saturating_sub(1); + } + } + } + } + + if !entry.is_ignored { + if let Some(extension) = extension_for_entry(&entry) { + if let Some(count) = worktree.extension_counts.get_mut(extension) { + *count += 1; + } else { + worktree.extension_counts.insert(extension.into(), 1); + } } } - worktree.entries.insert(entry.id, entry.clone()); } + worktree.scan_id = scan_id; Ok((connection_ids, metadata_changed, &worktree.extension_counts)) }