dag/import_pull: split segments for more efficient high level segments

Summary:
See the previous diffs for context. This is intended to further defrag segments
from the new server algorithms to ensure performance of the local graph.

Reviewed By: zzl0

Differential Revision: D52763359

fbshipit-source-id: 9f6067ebe7b1bca42597ab8c47709a1dac78e151
This commit is contained in:
Jun Wu 2024-01-16 10:16:16 -08:00 committed by Facebook GitHub Bot
parent 82c77d81fe
commit 774c1123ef
2 changed files with 44 additions and 2 deletions

View File

@ -813,7 +813,7 @@ where
idmap_by_name: BTreeMap<&'a VertexName, Id>,
idmap_by_id: &'a BTreeMap<Id, VertexName>,
}
let server = ServerState {
let mut server = ServerState {
seg_by_high: clone_data
.flat_segments
.segments
@ -934,7 +934,14 @@ where
}
while let Some(server_high) = stack.pop() {
let server_seg = &server.seg_containing_id(server_high)?;
let mut server_seg = server.seg_containing_id(server_high)?;
if server_high < server_seg.high {
// Split the segment for more efficient high level segments.
let seg_high = server_seg.high;
server.split_seg(seg_high, server_high);
server_seg = server.seg_containing_id(server_high)?;
assert_eq!(server_high, server_seg.high);
}
let high_vertex = server.name_by_id(server_high);
let client_high_id = new
.map

View File

@ -298,6 +298,41 @@ async fn test_pull_remap() {
);
}
#[tokio::test]
async fn test_pull_split() {
// Check that the client can split server segments for defragmentation purpose.
// This just tests the basic feature.
let mut server = TestDag::new();
server.drawdag(
r#"
A1..A9--B1..B9--D B5-D C5-D
\ /
C1..C9
"#,
&["D"],
);
let data = server.export_pull_data("", "D").await.unwrap();
// Import only the B5 branch without importing the segment containing B5 (head: B9).
let mut client = server.client().await;
client.import_pull_data(data.clone(), "B5").await.unwrap();
assert!(!client.contains_vertex_locally("B9"));
// There is only one flat segment.
assert_eq!(
client.dump_state().await,
"<spans [A1:B5+0:13]>\nLv0: RH0-13[]\n0->A1 8->A9 13->B5"
);
// Import only the C5 branch without importing the segment containing C5 (head: C9).
let mut client = server.client().await;
client.import_pull_data(data, "C5").await.unwrap();
assert!(!client.contains_vertex_locally("C9"));
assert_eq!(
client.dump_state().await,
"<spans [A1:C5+0:13]>\nLv0: RH0-13[]\n0->A1 8->A9 9->C1 13->C5"
);
}
#[tokio::test]
async fn test_pull_overlap() {
let mut server = TestDag::new();