From a81f8f096dfbdc8d179f0f6b9c6da7662f2fefd5 Mon Sep 17 00:00:00 2001 From: parazyd Date: Thu, 7 Sep 2023 11:14:07 +0200 Subject: [PATCH] event-graph: Find and fill the unreferenced tips on EventGraph::new() --- src/event_graph2/mod.rs | 36 +++++++++++++++++++++++++----------- src/event_graph2/tests.rs | 4 +++- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/event_graph2/mod.rs b/src/event_graph2/mod.rs index 95b4a17a1..6af8a0905 100644 --- a/src/event_graph2/mod.rs +++ b/src/event_graph2/mod.rs @@ -66,8 +66,6 @@ pub struct EventGraph { dag: sled::Tree, /// The set of unreferenced DAG tips unreferenced_tips: RwLock>, - /// The last event ID inserted into the DAG - last_event: RwLock, /// A `HashSet` containg event IDs and their 1-level parents. /// These come from the events we've sent out using `EventPut`. /// They are used with `EventReq` to decide if we should reply @@ -90,16 +88,9 @@ impl EventGraph { ) -> Result { let dag = sled_db.open_tree(dag_tree_name)?; let unreferenced_tips = RwLock::new(HashSet::new()); - let last_event = RwLock::new(NULL_ID); let broadcasted_ids = RwLock::new(HashSet::new()); - let self_ = Arc::new(Self { - p2p, - dag: dag.clone(), - unreferenced_tips, - last_event, - broadcasted_ids, - }); + let self_ = Arc::new(Self { p2p, dag: dag.clone(), unreferenced_tips, broadcasted_ids }); // Create the current genesis event based on the `days_rotation` let current_genesis = Self::generate_genesis(days_rotation); @@ -112,6 +103,9 @@ impl EventGraph { self_.dag_insert(¤t_genesis).await?; } + // Find the unreferenced tips in the current DAG state. + *self_.unreferenced_tips.write().await = self_.find_unreferenced_tips().await; + Ok(self_) } @@ -186,11 +180,31 @@ impl EventGraph { drop(bcast_ids); self.dag.insert(event_id.as_bytes(), s_event).unwrap(); - *self.last_event.write().await = event_id; Ok(event_id) } + /// Find the unreferenced tips in the current DAG state. + async fn find_unreferenced_tips(&self) -> HashSet { + // First get all the event IDs + let mut tips = HashSet::new(); + for iter_elem in self.dag.iter() { + let (id, _) = iter_elem.unwrap(); + let id = blake3::Hash::from_bytes((&id as &[u8]).try_into().unwrap()); + tips.insert(id); + } + + for iter_elem in self.dag.iter() { + let (_, event) = iter_elem.unwrap(); + let event: Event = deserialize_async(&event).await.unwrap(); + for parent in event.parents.iter() { + tips.remove(parent); + } + } + + tips + } + /// Get the current set of unreferenced tips in the DAG. async fn get_unreferenced_tips(&self) -> [blake3::Hash; N_EVENT_PARENTS] { let unreferenced_tips = self.unreferenced_tips.read().await; diff --git a/src/event_graph2/tests.rs b/src/event_graph2/tests.rs index cdefe0980..5a920b1f4 100644 --- a/src/event_graph2/tests.rs +++ b/src/event_graph2/tests.rs @@ -112,8 +112,10 @@ async fn eventgraph_propagation_real(ex: Arc>) { EventGraph::new(p2p.clone(), &sled_db, "dag", 1, ex.clone()).await.unwrap(); let event_graph_ = event_graph.clone(); + // Take the last sled item since there's only 1 if genesis_event_id == NULL_ID { - genesis_event_id = *event_graph.last_event.read().await; + let (id, _) = event_graph.dag.last().unwrap().unwrap(); + genesis_event_id = blake3::Hash::from_bytes((&id as &[u8]).try_into().unwrap()); } // Register the P2P protocols