Skip to content

Commit

Permalink
fix: size 1 anchor trees (#565)
Browse files Browse the repository at this point in the history
* add test for tree of size 1

* update the moch resume token

* Explain the high water number.
  • Loading branch information
AaronGoldman authored Oct 22, 2024
1 parent 33e2f26 commit af3c6f0
Show file tree
Hide file tree
Showing 11 changed files with 517 additions and 457 deletions.
20 changes: 11 additions & 9 deletions anchor-service/src/anchor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,15 +191,17 @@ impl TimeEventBatch {
) -> Result<Vec<MerkleNode>> {
let mut blocks = Vec::new();
let mut current_node_cid = *root;
for part in path.split('/') {
let merkle_node = merkle_nodes
.get(&current_node_cid)
.ok_or_else(|| anyhow!("missing merkle node for CID: {}", current_node_cid))?;
blocks.push(merkle_node.clone());
current_node_cid = match part {
"0" => merkle_node[0].context("missing left node")?,
"1" => merkle_node[1].context("missing right node")?,
_ => return Err(anyhow!("invalid path part in time event path: {}", part)),
if !path.is_empty() {
for part in path.split('/') {
let merkle_node = merkle_nodes
.get(&current_node_cid)
.ok_or_else(|| anyhow!("missing merkle node for CID: {}", current_node_cid))?;
blocks.push(merkle_node.clone());
current_node_cid = match part {
"0" => merkle_node[0].context("missing left node")?,
"1" => merkle_node[1].context("missing right node")?,
_ => return Err(anyhow!("invalid path part in time event path: {}", part)),
}
}
}
if current_node_cid != *prev {
Expand Down
35 changes: 34 additions & 1 deletion anchor-service/src/anchor_batch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ mod tests {
let event_service = Arc::new(MockAnchorEventService::new(10));
let pool = SqlitePool::connect_in_memory().await.unwrap();
let node_id = NodeId::random().0;
let anchor_interval = Duration::from_millis(1);
let anchor_interval = Duration::from_millis(5);
let anchor_batch_size = 1000000;
let mut anchor_service = AnchorService::new(
tx_manager,
Expand All @@ -271,4 +271,37 @@ mod tests {
.assert_debug_eq(&event_service.events.lock().unwrap());
shutdown_signal_tx.send(()).unwrap();
}

#[tokio::test]
async fn test_anchor_service_run_1() {
let tx_manager = Arc::new(MockCas);
let event_service = Arc::new(MockAnchorEventService::new(1));
let pool = SqlitePool::connect_in_memory().await.unwrap();
let node_id = NodeId::random().0;
let anchor_interval = Duration::from_millis(5);
let anchor_batch_size = 1000000;
let mut anchor_service = AnchorService::new(
tx_manager,
event_service.clone(),
pool,
node_id,
anchor_interval,
anchor_batch_size,
);
let (shutdown_signal_tx, mut shutdown_signal) = broadcast::channel::<()>(1);
// let mut shutdown_signal = shutdown_signal_rx.resubscribe();
Some(tokio::spawn(async move {
anchor_service
.run(async move {
let _ = shutdown_signal.recv().await;
})
.await
}));
while event_service.events.lock().unwrap().is_empty() {
sleep(Duration::from_millis(1)).await;
}
expect_file!["./test-data/test_anchor_service_run_1.txt"]
.assert_debug_eq(&event_service.events.lock().unwrap());
shutdown_signal_tx.send(()).unwrap();
}
}
5 changes: 4 additions & 1 deletion anchor-service/src/cas_mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,10 @@ impl Store for MockAnchorEventService {
highwater: i64,
limit: i64,
) -> Result<Vec<AnchorRequest>> {
let ints = ((highwater as u64)..self.anchor_req_count).take(limit as usize);
// The high water mark is the last row in the table.
// The call to events_since_high_water_mark generate the next event (n+1)
// to the anchor_req_count which is the last event in the mock data.
let ints = ((highwater as u64 + 1)..=self.anchor_req_count).take(limit as usize);
Ok(ints.map(|n| AnchorRequest {
id: self.int64_cid(n),
prev: self.int64_cid(n),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,63 +1,49 @@
TimeEventBatch {
merkle_nodes: {
"Cid(bafyreia3zg3jllqrgenxjw2awx35b6tcfjyr5hs2sgiijc4ezpzwb7hc44)": [
"Some(Cid(baeabeifpkvyplimbbn5ppdfpjpdquzqpbx2r4qv27eou3znsgkg6b2b57q))",
"Cid(bafyreig6dyvf5wyz5doxvfhidgiggcpeybzq7ukth3iy672duv4k6fefwi)": [
"Some(Cid(baeabeignezrbkttno2zlfojoodamvq6m6u2ptn2oww4jqgpmkciihuakka))",
],
"Cid(bafyreieh2fjfxz637klqhv6a5uknbqqzqgggungp7w2w7z5bf4ifg63bni)": [
"Some(Cid(baeabeignasshkrey4bw3lij4l43r6hye75wsi4hsjku33cdfids5zz37oa))",
],
"Cid(bafyreihwy3ozotzlem47ajw5cn44fvgipbdj27oq74mdvkljzhvosmvqom)": [
"Some(Cid(baeabeigvncfffvk2alwev2s6yhvn777bzhqo42sn3prdo74ygjwufx6jou))",
"Some(Cid(baeabeieaaxyc2q72a3t5awc7wzgjmhkx4mmle6qulscxxtj2npnucp7x7q))",
],
"Cid(bafyreidkerqbbfm25ynrkhod2f3267w7rhq4npp2tqewge5fzizekb6mdy)": [
"Some(Cid(bafyreia3zg3jllqrgenxjw2awx35b6tcfjyr5hs2sgiijc4ezpzwb7hc44))",
"Some(Cid(bafyreieh2fjfxz637klqhv6a5uknbqqzqgggungp7w2w7z5bf4ifg63bni))",
"Cid(bafyreigg72kh2xbkwmhbr3fnc3y3fmcp4qg6llenqv66f4xd2en2uboroi)": [
"Some(Cid(bafyreig6dyvf5wyz5doxvfhidgiggcpeybzq7ukth3iy672duv4k6fefwi))",
"Some(Cid(bafyreihwy3ozotzlem47ajw5cn44fvgipbdj27oq74mdvkljzhvosmvqom))",
],
"Cid(bafyreigysgwnbgxwsgfnbh3e2utelie6rtcen2pt5mvheggkydt5vcrysq)": [
"Some(Cid(baeabeieaaxyc2q72a3t5awc7wzgjmhkx4mmle6qulscxxtj2npnucp7x7q))",
"Cid(bafyreigxjwy55z4jt2fccma3s62dkuph73dlowiwpirssirkbfacl37are)": [
"Some(Cid(baeabeic55zg5md7y2c5jsah6shuq4dopmxyfodkcyqy7oj6qgag5odoege))",
],
"Cid(bafyreieoar4ue5rvrwhkxg6vjiew2b3izjjdtru74wjcehit47sajw7d4e)": [
"Some(Cid(baeabeiauvrlxzwzo63mymb4libkmzgetvgquufw3wdmpg64jcz6b6gvm34))",
],
"Cid(bafyreiewcxh2zzv3f3255yrcf5r2xbvaahz5r7pmq52t7xyx2eiv6oj6jy)": [
"Some(Cid(baeabeifd5og3rh6fci6m7vevqucz6kjlyqfbydkvboda6jhyj35uoyh36i))",
"Some(Cid(baeabeicmbydrqmwve5uuvxvfpnin26zbmtbki7acsqg46jx2a7ce23jcfi))",
],
"Cid(bafyreie3bhv3notvwbeznujlrdyby2rmibgb25qs65aitgkz36prkcrmoq)": [
"Some(Cid(bafyreigysgwnbgxwsgfnbh3e2utelie6rtcen2pt5mvheggkydt5vcrysq))",
"Some(Cid(bafyreieoar4ue5rvrwhkxg6vjiew2b3izjjdtru74wjcehit47sajw7d4e))",
"Cid(bafyreidry34e4kbezhlp6vx7nyojqz753hvp5f7ts264s2shnj7jocbbji)": [
"Some(Cid(bafyreigxjwy55z4jt2fccma3s62dkuph73dlowiwpirssirkbfacl37are))",
"Some(Cid(bafyreiewcxh2zzv3f3255yrcf5r2xbvaahz5r7pmq52t7xyx2eiv6oj6jy))",
],
"Cid(bafyreigwmwwsxgzx2innz6a6zhwoxst55bgj433thtoutrg55gg2dreomq)": [
"Some(Cid(bafyreidkerqbbfm25ynrkhod2f3267w7rhq4npp2tqewge5fzizekb6mdy))",
"Some(Cid(bafyreie3bhv3notvwbeznujlrdyby2rmibgb25qs65aitgkz36prkcrmoq))",
"Cid(bafyreifaqmp2a2ofaasulyvnmnjmy6k5wff5s3uvcvo2k2qatutaceg3cq)": [
"Some(Cid(bafyreigg72kh2xbkwmhbr3fnc3y3fmcp4qg6llenqv66f4xd2en2uboroi))",
"Some(Cid(bafyreidry34e4kbezhlp6vx7nyojqz753hvp5f7ts264s2shnj7jocbbji))",
],
"Cid(bafyreibjujhtxyrn7jtbpel26bghzqwuljjssqnap6rk6d2rzvrfgtu4um)": [
"Some(Cid(baeabeicmbydrqmwve5uuvxvfpnin26zbmtbki7acsqg46jx2a7ce23jcfi))",
"Cid(bafyreieivpptmlx45bf5rq4rugf6pdwoyc5vj6qmk5spvuzghvkvbrgkt4)": [
"Some(Cid(baeabeiczeritkfvfte2dl3ckeqdbamckzj6uvty7fxs442asvdcdmegg4y))",
"Some(Cid(baeabeienqx4em4samkfjjam3e27oe3r2tmuaim2mmnec32wozdlevnhb44))",
],
"Cid(bafyreicyvumkq5pvsvkgfxory4kzuzrlzopy2kfusnppbkcsben2yawx3m)": [
"Some(Cid(bafyreigwmwwsxgzx2innz6a6zhwoxst55bgj433thtoutrg55gg2dreomq))",
"Some(Cid(bafyreibjujhtxyrn7jtbpel26bghzqwuljjssqnap6rk6d2rzvrfgtu4um))",
"Cid(bafyreihzjsheramtx2cdy53k4ssvwdkypd74wbbqjvtvktsucn5kot426q)": [
"Some(Cid(bafyreifaqmp2a2ofaasulyvnmnjmy6k5wff5s3uvcvo2k2qatutaceg3cq))",
"Some(Cid(bafyreieivpptmlx45bf5rq4rugf6pdwoyc5vj6qmk5spvuzghvkvbrgkt4))",
],
},
proof: Proof {
chain_id: "mock chain id",
root: "Cid(bafyreicyvumkq5pvsvkgfxory4kzuzrlzopy2kfusnppbkcsben2yawx3m)",
tx_hash: "Cid(bafyreicyvumkq5pvsvkgfxory4kzuzrlzopy2kfusnppbkcsben2yawx3m)",
root: "Cid(bafyreihzjsheramtx2cdy53k4ssvwdkypd74wbbqjvtvktsucn5kot426q)",
tx_hash: "Cid(bafyreihzjsheramtx2cdy53k4ssvwdkypd74wbbqjvtvktsucn5kot426q)",
tx_type: "mock tx type",
},
raw_time_events: [
(
AnchorRequest {
id: "Cid(baeabeifpkvyplimbbn5ppdfpjpdquzqpbx2r4qv27eou3znsgkg6b2b57q)",
prev: "Cid(baeabeifpkvyplimbbn5ppdfpjpdquzqpbx2r4qv27eou3znsgkg6b2b57q)",
event_id: "CE010500BA25076D730241E745CC7C072FF729EA683B751701711220F4EF7EC208944D257025408BB647949E6B72930520BC80F34D8BFBAFD2643D86",
resume_token: 0,
},
RawTimeEvent {
id: "Cid(baeabeifpkvyplimbbn5ppdfpjpdquzqpbx2r4qv27eou3znsgkg6b2b57q)",
prev: "Cid(baeabeifpkvyplimbbn5ppdfpjpdquzqpbx2r4qv27eou3znsgkg6b2b57q)",
proof: "Cid(bafyreigpf6hccbdtetdxox34jlx3pyjsdxswzbalstl36jajoythozqfky)",
path: "0/0/0/0",
},
),
(
AnchorRequest {
id: "Cid(baeabeignezrbkttno2zlfojoodamvq6m6u2ptn2oww4jqgpmkciihuakka)",
Expand All @@ -68,8 +54,8 @@ TimeEventBatch {
RawTimeEvent {
id: "Cid(baeabeignezrbkttno2zlfojoodamvq6m6u2ptn2oww4jqgpmkciihuakka)",
prev: "Cid(baeabeignezrbkttno2zlfojoodamvq6m6u2ptn2oww4jqgpmkciihuakka)",
proof: "Cid(bafyreigpf6hccbdtetdxox34jlx3pyjsdxswzbalstl36jajoythozqfky)",
path: "0/0/0/1",
proof: "Cid(bafyreiexhuss4uvrigt6uewjirr3ldurc2zuep2k5e5zo4wnrwbhgd2iwi)",
path: "0/0/0/0",
},
),
(
Expand All @@ -82,8 +68,8 @@ TimeEventBatch {
RawTimeEvent {
id: "Cid(baeabeignasshkrey4bw3lij4l43r6hye75wsi4hsjku33cdfids5zz37oa)",
prev: "Cid(baeabeignasshkrey4bw3lij4l43r6hye75wsi4hsjku33cdfids5zz37oa)",
proof: "Cid(bafyreigpf6hccbdtetdxox34jlx3pyjsdxswzbalstl36jajoythozqfky)",
path: "0/0/1/0",
proof: "Cid(bafyreiexhuss4uvrigt6uewjirr3ldurc2zuep2k5e5zo4wnrwbhgd2iwi)",
path: "0/0/0/1",
},
),
(
Expand All @@ -96,8 +82,8 @@ TimeEventBatch {
RawTimeEvent {
id: "Cid(baeabeigvncfffvk2alwev2s6yhvn777bzhqo42sn3prdo74ygjwufx6jou)",
prev: "Cid(baeabeigvncfffvk2alwev2s6yhvn777bzhqo42sn3prdo74ygjwufx6jou)",
proof: "Cid(bafyreigpf6hccbdtetdxox34jlx3pyjsdxswzbalstl36jajoythozqfky)",
path: "0/0/1/1",
proof: "Cid(bafyreiexhuss4uvrigt6uewjirr3ldurc2zuep2k5e5zo4wnrwbhgd2iwi)",
path: "0/0/1/0",
},
),
(
Expand All @@ -110,8 +96,8 @@ TimeEventBatch {
RawTimeEvent {
id: "Cid(baeabeieaaxyc2q72a3t5awc7wzgjmhkx4mmle6qulscxxtj2npnucp7x7q)",
prev: "Cid(baeabeieaaxyc2q72a3t5awc7wzgjmhkx4mmle6qulscxxtj2npnucp7x7q)",
proof: "Cid(bafyreigpf6hccbdtetdxox34jlx3pyjsdxswzbalstl36jajoythozqfky)",
path: "0/1/0/0",
proof: "Cid(bafyreiexhuss4uvrigt6uewjirr3ldurc2zuep2k5e5zo4wnrwbhgd2iwi)",
path: "0/0/1/1",
},
),
(
Expand All @@ -124,8 +110,8 @@ TimeEventBatch {
RawTimeEvent {
id: "Cid(baeabeic55zg5md7y2c5jsah6shuq4dopmxyfodkcyqy7oj6qgag5odoege)",
prev: "Cid(baeabeic55zg5md7y2c5jsah6shuq4dopmxyfodkcyqy7oj6qgag5odoege)",
proof: "Cid(bafyreigpf6hccbdtetdxox34jlx3pyjsdxswzbalstl36jajoythozqfky)",
path: "0/1/0/1",
proof: "Cid(bafyreiexhuss4uvrigt6uewjirr3ldurc2zuep2k5e5zo4wnrwbhgd2iwi)",
path: "0/1/0/0",
},
),
(
Expand All @@ -138,8 +124,8 @@ TimeEventBatch {
RawTimeEvent {
id: "Cid(baeabeiauvrlxzwzo63mymb4libkmzgetvgquufw3wdmpg64jcz6b6gvm34)",
prev: "Cid(baeabeiauvrlxzwzo63mymb4libkmzgetvgquufw3wdmpg64jcz6b6gvm34)",
proof: "Cid(bafyreigpf6hccbdtetdxox34jlx3pyjsdxswzbalstl36jajoythozqfky)",
path: "0/1/1/0",
proof: "Cid(bafyreiexhuss4uvrigt6uewjirr3ldurc2zuep2k5e5zo4wnrwbhgd2iwi)",
path: "0/1/0/1",
},
),
(
Expand All @@ -152,8 +138,8 @@ TimeEventBatch {
RawTimeEvent {
id: "Cid(baeabeifd5og3rh6fci6m7vevqucz6kjlyqfbydkvboda6jhyj35uoyh36i)",
prev: "Cid(baeabeifd5og3rh6fci6m7vevqucz6kjlyqfbydkvboda6jhyj35uoyh36i)",
proof: "Cid(bafyreigpf6hccbdtetdxox34jlx3pyjsdxswzbalstl36jajoythozqfky)",
path: "0/1/1/1",
proof: "Cid(bafyreiexhuss4uvrigt6uewjirr3ldurc2zuep2k5e5zo4wnrwbhgd2iwi)",
path: "0/1/1/0",
},
),
(
Expand All @@ -166,8 +152,8 @@ TimeEventBatch {
RawTimeEvent {
id: "Cid(baeabeicmbydrqmwve5uuvxvfpnin26zbmtbki7acsqg46jx2a7ce23jcfi)",
prev: "Cid(baeabeicmbydrqmwve5uuvxvfpnin26zbmtbki7acsqg46jx2a7ce23jcfi)",
proof: "Cid(bafyreigpf6hccbdtetdxox34jlx3pyjsdxswzbalstl36jajoythozqfky)",
path: "1/0",
proof: "Cid(bafyreiexhuss4uvrigt6uewjirr3ldurc2zuep2k5e5zo4wnrwbhgd2iwi)",
path: "0/1/1/1",
},
),
(
Expand All @@ -180,7 +166,21 @@ TimeEventBatch {
RawTimeEvent {
id: "Cid(baeabeiczeritkfvfte2dl3ckeqdbamckzj6uvty7fxs442asvdcdmegg4y)",
prev: "Cid(baeabeiczeritkfvfte2dl3ckeqdbamckzj6uvty7fxs442asvdcdmegg4y)",
proof: "Cid(bafyreigpf6hccbdtetdxox34jlx3pyjsdxswzbalstl36jajoythozqfky)",
proof: "Cid(bafyreiexhuss4uvrigt6uewjirr3ldurc2zuep2k5e5zo4wnrwbhgd2iwi)",
path: "1/0",
},
),
(
AnchorRequest {
id: "Cid(baeabeienqx4em4samkfjjam3e27oe3r2tmuaim2mmnec32wozdlevnhb44)",
prev: "Cid(baeabeienqx4em4samkfjjam3e27oe3r2tmuaim2mmnec32wozdlevnhb44)",
event_id: "CE010500BA25076D730241E745CC7C072FF729EA683B751701711220F4EF7EC208944D257025408BB647949E6B72930520BC80F34D8BFBAFD2643D86",
resume_token: 10,
},
RawTimeEvent {
id: "Cid(baeabeienqx4em4samkfjjam3e27oe3r2tmuaim2mmnec32wozdlevnhb44)",
prev: "Cid(baeabeienqx4em4samkfjjam3e27oe3r2tmuaim2mmnec32wozdlevnhb44)",
proof: "Cid(bafyreiexhuss4uvrigt6uewjirr3ldurc2zuep2k5e5zo4wnrwbhgd2iwi)",
path: "1/1",
},
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,22 @@ TimeEventBatch {
merkle_nodes: {},
proof: Proof {
chain_id: "mock chain id",
root: "Cid(baeabeifpkvyplimbbn5ppdfpjpdquzqpbx2r4qv27eou3znsgkg6b2b57q)",
tx_hash: "Cid(baeabeifpkvyplimbbn5ppdfpjpdquzqpbx2r4qv27eou3znsgkg6b2b57q)",
root: "Cid(baeabeignezrbkttno2zlfojoodamvq6m6u2ptn2oww4jqgpmkciihuakka)",
tx_hash: "Cid(baeabeignezrbkttno2zlfojoodamvq6m6u2ptn2oww4jqgpmkciihuakka)",
tx_type: "mock tx type",
},
raw_time_events: [
(
AnchorRequest {
id: "Cid(baeabeifpkvyplimbbn5ppdfpjpdquzqpbx2r4qv27eou3znsgkg6b2b57q)",
prev: "Cid(baeabeifpkvyplimbbn5ppdfpjpdquzqpbx2r4qv27eou3znsgkg6b2b57q)",
id: "Cid(baeabeignezrbkttno2zlfojoodamvq6m6u2ptn2oww4jqgpmkciihuakka)",
prev: "Cid(baeabeignezrbkttno2zlfojoodamvq6m6u2ptn2oww4jqgpmkciihuakka)",
event_id: "CE010500BA25076D730241E745CC7C072FF729EA683B751701711220F4EF7EC208944D257025408BB647949E6B72930520BC80F34D8BFBAFD2643D86",
resume_token: 0,
resume_token: 1,
},
RawTimeEvent {
id: "Cid(baeabeifpkvyplimbbn5ppdfpjpdquzqpbx2r4qv27eou3znsgkg6b2b57q)",
prev: "Cid(baeabeifpkvyplimbbn5ppdfpjpdquzqpbx2r4qv27eou3znsgkg6b2b57q)",
proof: "Cid(bafyreic73ihcidvfhqdqeys677ml2hco3y6k4kaycrgeobcnhzg63a65cu)",
id: "Cid(baeabeignezrbkttno2zlfojoodamvq6m6u2ptn2oww4jqgpmkciihuakka)",
prev: "Cid(baeabeignezrbkttno2zlfojoodamvq6m6u2ptn2oww4jqgpmkciihuakka)",
proof: "Cid(bafyreia4co3rs6lp44ovc2eqv4alolr2urjumiuqc4ntcbq3ugmwbfmkya)",
path: "",
},
),
Expand Down
Loading

0 comments on commit af3c6f0

Please sign in to comment.