dag: add a test about excessive fetches for add_heads

Summary:
Currently the "contains vertex" check can trigger excessive
fetches for add_heads (and add_heads_and_flush used by flush).

Add a test to demonstrate the problem.

Reviewed By: sfilipco

Differential Revision: D27630091

fbshipit-source-id: ce3639c2a13226ba5681b4e8696edd7acbcb57f9
This commit is contained in:
Jun Wu 2021-04-13 16:38:17 -07:00 committed by Facebook GitHub Bot
parent 8d4f17ea82
commit 1ffc1824c1

View File

@ -6,7 +6,9 @@
*/
use super::TestDag;
use crate::ops::DagAddHeads;
use crate::ops::DagAlgorithm;
use crate::ops::DagPersistent;
use crate::ops::IdConvert;
use crate::Id;
use crate::VertexName;
@ -103,3 +105,70 @@ async fn test_negative_cache() {
client.drawdag("B-C-D", &[]);
assert!(client.dag.vertex_id("C".into()).await.is_ok());
}
#[tokio::test]
async fn test_add_heads() {
let server = TestDag::draw("A-B # master: B");
let mut client = server.client().await;
let pending = TestDag::draw("A-C B-C-D-E-F-G E-H-K I-J-K");
let parents = pending.dag.dag_snapshot().unwrap();
client
.dag
.add_heads(&parents, &["G".into(), "K".into()])
.await
.unwrap();
assert_eq!(
client.output(),
[
"resolve names: [G], heads: [B]",
"resolve names: [F], heads: [B]",
"resolve names: [E], heads: [B]",
"resolve names: [D], heads: [B]",
"resolve names: [C], heads: [B]",
"resolve names: [A], heads: [B]",
"resolve names: [K], heads: [B]",
"resolve names: [J], heads: [B]",
"resolve names: [H], heads: [B]",
"resolve names: [I], heads: [B]"
]
);
client.dag.flush(&["G".into()]).await.unwrap();
assert_eq!(
client.output(),
[
"resolve names: [G], heads: [B]",
"resolve names: [F], heads: [B]",
"resolve names: [E], heads: [B]",
"resolve names: [D], heads: [B]",
"resolve names: [C], heads: [B]",
"resolve names: [K], heads: [B]",
"resolve names: [J], heads: [B]",
"resolve names: [H], heads: [B]",
"resolve names: [I], heads: [B]"
]
);
let mut client = server.client().await;
client
.dag
.add_heads_and_flush(&parents, &["K".into()], &["G".into()])
.await
.unwrap();
assert_eq!(
client.output(),
[
"resolve names: [K], heads: [B]",
"resolve names: [J], heads: [B]",
"resolve names: [H], heads: [B]",
"resolve names: [E], heads: [B]",
"resolve names: [D], heads: [B]",
"resolve names: [C], heads: [B]",
"resolve names: [A], heads: [B]",
"resolve names: [I], heads: [B]",
"resolve names: [G], heads: [B]",
"resolve names: [F], heads: [B]"
]
);
}