Skip to content

Commit 0912e15

Browse files
committed
ampc shortest path test case
1 parent e24a389 commit 0912e15

File tree

3 files changed

+111
-3
lines changed

3 files changed

+111
-3
lines changed

crates/core/src/entrypoint/ampc/shortest_path/coordinator.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ pub fn build(
127127
) -> Coordinator<ShortestPathJob> {
128128
let setup = ShortestPathSetup::new_for_dht_members(dht, source);
129129

130-
Coordinator::new(setup, workers.clone())
130+
Coordinator::new(setup, workers)
131131
.with_mapper(ShortestPathMapper::RelaxEdges)
132132
.with_mapper(ShortestPathMapper::UpdateChangedNodes)
133133
}

crates/core/src/entrypoint/ampc/shortest_path/mapper.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,12 @@ impl ShortestPathMapper {
153153
for node in exact_changed_nodes {
154154
for edge in worker
155155
.graph()
156-
.search(&query::ForwardlinksQuery::new(*node))
157-
.unwrap_or_default()
156+
.search(
157+
&query::ForwardlinksQuery::new(*node)
158+
.skip_self_links(false)
159+
.deduplicate(false),
160+
)
161+
.unwrap()
158162
{
159163
if edge.rel_flags.intersects(*SKIPPED_REL) {
160164
continue;

crates/core/src/entrypoint/ampc/shortest_path/mod.rs

+104
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,107 @@ impl Job for ShortestPathJob {
7171
self.shard == worker.shard()
7272
}
7373
}
74+
75+
#[cfg(test)]
76+
mod tests {
77+
use std::{collections::BTreeMap, sync::Arc};
78+
79+
use tracing_test::traced_test;
80+
use webgraph::{Edge, ShortestPaths, Webgraph};
81+
82+
use crate::{config::WebgraphGranularity, free_socket_addr};
83+
84+
use super::*;
85+
86+
#[test]
87+
#[traced_test]
88+
fn test_simple_graph() {
89+
let temp_dir = crate::gen_temp_dir().unwrap();
90+
let mut combined = Webgraph::builder(temp_dir.as_ref().join("combined"), 0u64.into())
91+
.open()
92+
.unwrap();
93+
let mut a = Webgraph::builder(temp_dir.as_ref().join("a"), 0u64.into())
94+
.open()
95+
.unwrap();
96+
let mut b = Webgraph::builder(temp_dir.as_ref().join("b"), 0u64.into())
97+
.open()
98+
.unwrap();
99+
100+
let edges = crate::webgraph::tests::test_edges();
101+
102+
for (i, (from, to)) in edges.into_iter().enumerate() {
103+
let e = Edge::new_test(from.clone(), to.clone());
104+
combined.insert(e.clone()).unwrap();
105+
106+
if i % 2 == 0 {
107+
a.insert(e).unwrap();
108+
} else {
109+
b.insert(e).unwrap();
110+
}
111+
}
112+
113+
combined.commit().unwrap();
114+
a.commit().unwrap();
115+
b.commit().unwrap();
116+
117+
let a = Arc::new(a);
118+
let b = Arc::new(b);
119+
120+
let node = webgraph::Node::from("C");
121+
122+
let expected = combined
123+
.raw_distances(node.id(), WebgraphGranularity::Page)
124+
.into_iter()
125+
.map(|(node, dist)| (node, dist as u64))
126+
.collect::<BTreeMap<_, _>>();
127+
128+
let worker = ShortestPathWorker::new(a, 1.into());
129+
130+
let worker_addr = free_socket_addr();
131+
132+
std::thread::spawn(move || {
133+
worker.run(worker_addr).unwrap();
134+
});
135+
136+
std::thread::sleep(std::time::Duration::from_secs(2)); // Wait for worker to start
137+
let a = RemoteShortestPathWorker::new(1.into(), worker_addr).unwrap();
138+
139+
let worker = ShortestPathWorker::new(b, 2.into());
140+
let worker_addr = free_socket_addr();
141+
std::thread::spawn(move || {
142+
worker.run(worker_addr).unwrap();
143+
});
144+
145+
std::thread::sleep(std::time::Duration::from_secs(2)); // Wait for worker to start
146+
147+
let b = RemoteShortestPathWorker::new(2.into(), worker_addr).unwrap();
148+
149+
let (dht_shard, dht_addr) = crate::entrypoint::ampc::dht::tests::setup();
150+
151+
let res = coordinator::build(
152+
&[(dht_shard, dht_addr)],
153+
vec![a.clone(), b.clone()],
154+
node.id(),
155+
)
156+
.run(
157+
vec![
158+
ShortestPathJob {
159+
shard: a.shard(),
160+
source: node.id(),
161+
},
162+
ShortestPathJob {
163+
shard: b.shard(),
164+
source: node.id(),
165+
},
166+
],
167+
coordinator::ShortestPathFinish {
168+
max_distance: Some(128),
169+
},
170+
)
171+
.unwrap();
172+
173+
let actual = res.distances.iter().collect::<BTreeMap<_, _>>();
174+
175+
assert_eq!(expected, actual);
176+
}
177+
}

0 commit comments

Comments
 (0)