Skip to content

Commit db69f68

Browse files
authored
Merge pull request #34 from blacksky-algorithms/mst-diffs
Fix bug in diff walker; Create simple_tree_diffs unit test for determ…
2 parents a392417 + c78364e commit db69f68

File tree

3 files changed

+95
-23
lines changed

3 files changed

+95
-23
lines changed

rsky-pds/src/repo/data_diff.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::repo::mst::diff::mst_diff;
44
use crate::repo::mst::{NodeEntry, MST};
55
use anyhow::Result;
66
use lexicon_cid::Cid;
7-
use std::collections::BTreeMap;
7+
use std::collections::HashMap;
88

99
#[derive(Debug, Clone, PartialEq)]
1010
pub struct DataAdd {
@@ -27,9 +27,9 @@ pub struct DataDelete {
2727

2828
#[derive(Debug, Clone, PartialEq)]
2929
pub struct DataDiff {
30-
pub adds: BTreeMap<String, DataAdd>,
31-
pub updates: BTreeMap<String, DataUpdate>,
32-
pub deletes: BTreeMap<String, DataDelete>,
30+
pub adds: HashMap<String, DataAdd>,
31+
pub updates: HashMap<String, DataUpdate>,
32+
pub deletes: HashMap<String, DataDelete>,
3333

3434
pub new_mst_blocks: BlockMap,
3535
pub new_leaf_cids: CidSet,
@@ -39,9 +39,9 @@ pub struct DataDiff {
3939
impl DataDiff {
4040
pub fn new() -> Self {
4141
DataDiff {
42-
adds: BTreeMap::new(),
43-
updates: BTreeMap::new(),
44-
deletes: BTreeMap::new(),
42+
adds: HashMap::new(),
43+
updates: HashMap::new(),
44+
deletes: HashMap::new(),
4545
new_mst_blocks: BlockMap::new(),
4646
new_leaf_cids: CidSet::new(None),
4747
removed_cids: CidSet::new(None),

rsky-pds/src/repo/mst/mod.rs

Lines changed: 84 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,7 +1387,7 @@ mod tests {
13871387
use anyhow::Result;
13881388
use rand::seq::SliceRandom;
13891389
use rand::thread_rng;
1390-
use std::collections::BTreeMap;
1390+
use std::collections::HashMap;
13911391

13921392
fn string_to_vec_u8(input: &str) -> Vec<u8> {
13931393
input.as_bytes().to_vec()
@@ -1555,27 +1555,24 @@ mod tests {
15551555
Ok(())
15561556
}
15571557

1558-
/*
1559-
@TODO: Get this working. Currently inconsistent and canonical test is failing as well
1560-
1558+
// @TODO: Increase record sizes
15611559
#[test]
15621560
fn diffs() -> Result<()> {
15631561
let mut storage =
15641562
SqlRepoReader::new(None, "did:example:123456789abcdefghi".to_string(), None);
1565-
let mapping = generate_bulk_data_keys(10, Some(&mut storage))?;
1563+
let mapping = generate_bulk_data_keys(4, Some(&mut storage))?;
15661564
let mut mst = MST::create(storage.clone(), None, None)?;
1567-
let mut to_diff = mst.clone();
1568-
15691565
let entries = mapping
15701566
.iter()
15711567
.map(|e| (e.0.clone(), e.1.clone()))
15721568
.collect::<Vec<(String, Cid)>>();
15731569

15741570
for entry in &entries {
15751571
mst = mst.add(&entry.0, entry.1, None)?;
1576-
to_diff = to_diff.add(&entry.0, entry.1, None)?;
15771572
}
15781573

1574+
let mut to_diff = mst.clone();
1575+
15791576
let to_add = generate_bulk_data_keys(2, Some(&mut storage))?
15801577
.into_iter()
15811578
.map(|e| (e.0, e.1))
@@ -1591,9 +1588,9 @@ mod tests {
15911588
let to_edit = entries[2..3].to_vec();
15921589
let to_del = entries[3..4].to_vec();
15931590

1594-
let mut expected_adds: BTreeMap<String, DataAdd> = BTreeMap::new();
1595-
let mut expected_updates: BTreeMap<String, DataUpdate> = BTreeMap::new();
1596-
let mut expected_dels: BTreeMap<String, DataDelete> = BTreeMap::new();
1591+
let mut expected_adds: HashMap<String, DataAdd> = HashMap::new();
1592+
let mut expected_updates: HashMap<String, DataUpdate> = HashMap::new();
1593+
let mut expected_dels: HashMap<String, DataDelete> = HashMap::new();
15971594

15981595
for entry in &to_add {
15991596
to_diff = to_diff.add(&entry.0, entry.1, None)?;
@@ -1638,6 +1635,81 @@ mod tests {
16381635
assert_eq!(diff.updates, expected_updates);
16391636
assert_eq!(diff.deletes, expected_dels);
16401637

1638+
// ensure we correctly report all added CIDs
1639+
for mut entry in to_diff.walk() {
1640+
let cid: Cid = match entry {
1641+
NodeEntry::MST(ref mut entry) => entry.get_pointer()?,
1642+
NodeEntry::Leaf(ref entry) => entry.value.clone(),
1643+
};
1644+
let found = mst.storage.blocks.has(cid)
1645+
|| diff.new_mst_blocks.has(cid)
1646+
|| diff.new_leaf_cids.has(cid);
1647+
assert!(found)
1648+
}
1649+
1650+
Ok(())
1651+
}
1652+
1653+
/// computes "simple" tree root CID
1654+
#[test]
1655+
fn simple_tree_diffs() -> Result<()> {
1656+
let cid1 = Cid::try_from("bafyreie5cvv4h45feadgeuwhbcutmh6t2ceseocckahdoe6uat64zmz454")?;
1657+
let storage = SqlRepoReader::new(None, "did:example:123456789abcdefghi".to_string(), None);
1658+
let mut mst = MST::create(storage, None, None)?;
1659+
1660+
let mut mst = mst.add(&"com.example.record/3jqfcqzm3fp2j".to_string(), cid1, None)?; // level 0
1661+
let mut mst = mst.add(&"com.example.record/3jqfcqzm3fr2j".to_string(), cid1, None)?; // level 0
1662+
let mut mst = mst.add(&"com.example.record/3jqfcqzm3fs2j".to_string(), cid1, None)?; // level 1
1663+
let mut to_diff = mst.clone();
1664+
let mut expected_adds: HashMap<String, DataAdd> = HashMap::new();
1665+
let mut expected_updates: HashMap<String, DataUpdate> = HashMap::new();
1666+
let mut expected_dels: HashMap<String, DataDelete> = HashMap::new();
1667+
1668+
to_diff = to_diff.add(&"com.example.record/3jqfcqzm3ft2j".to_string(), cid1, None)?; // level 0
1669+
expected_adds.insert(
1670+
"com.example.record/3jqfcqzm3ft2j".to_string(),
1671+
DataAdd {
1672+
key: "com.example.record/3jqfcqzm3ft2j".to_string(),
1673+
cid: cid1,
1674+
},
1675+
);
1676+
to_diff = to_diff.add(&"com.example.record/3jqfcqzm4fc2j".to_string(), cid1, None)?; // level 0
1677+
expected_adds.insert(
1678+
"com.example.record/3jqfcqzm4fc2j".to_string(),
1679+
DataAdd {
1680+
key: "com.example.record/3jqfcqzm4fc2j".to_string(),
1681+
cid: cid1,
1682+
},
1683+
);
1684+
let updated = random_cid(&mut None)?;
1685+
to_diff = to_diff.update(&"com.example.record/3jqfcqzm3fs2j", updated)?;
1686+
expected_updates.insert(
1687+
"com.example.record/3jqfcqzm3fs2j".to_string(),
1688+
DataUpdate {
1689+
key: "com.example.record/3jqfcqzm3fs2j".to_string(),
1690+
prev: cid1,
1691+
cid: updated,
1692+
},
1693+
);
1694+
1695+
to_diff = to_diff.delete(&"com.example.record/3jqfcqzm3fr2j".to_string())?;
1696+
expected_dels.insert(
1697+
"com.example.record/3jqfcqzm3fr2j".to_string(),
1698+
DataDelete {
1699+
key: "com.example.record/3jqfcqzm3fr2j".to_string(),
1700+
cid: cid1,
1701+
},
1702+
);
1703+
1704+
let diff = DataDiff::of(&mut to_diff, Some(&mut mst))?;
1705+
assert_eq!(diff.add_list().len(), 2);
1706+
assert_eq!(diff.update_list().len(), 1);
1707+
assert_eq!(diff.delete_list().len(), 1);
1708+
1709+
assert_eq!(diff.adds, expected_adds);
1710+
assert_eq!(diff.updates, expected_updates);
1711+
assert_eq!(diff.deletes, expected_dels);
1712+
16411713
// ensure we correctly report all added CIDs
16421714
let mut blockstore = mst.storage.clone();
16431715
for mut entry in to_diff.walk() {
@@ -1651,7 +1723,7 @@ mod tests {
16511723
}
16521724

16531725
Ok(())
1654-
} */
1726+
}
16551727

16561728
#[test]
16571729
fn test_leading_zeros() -> Result<()> {

rsky-pds/src/repo/mst/walker.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,17 @@ impl MstWalker {
8686

8787
/// step into a subtree, throws if currently pointed at a leaf
8888
pub fn step_into(&mut self) -> Result<()> {
89+
let clone_of_current_status = self.status.clone();
8990
match self.status {
9091
WalkerStatus::WalkerStatusDone(_) => return Ok(()),
9192
WalkerStatus::WalkerStatusProgress(ref mut p) => {
9293
if let Some(_) = p.walking {
9394
if let NodeEntry::MST(ref mut curr) = p.curr {
9495
let next = curr.at_index(0)?;
9596
if let Some(next) = next {
96-
p.walking = Some(curr.clone());
97-
self.stack
98-
.push(WalkerStatus::WalkerStatusProgress(p.clone()));
99-
p.curr = next.clone();
97+
self.stack.push(clone_of_current_status);
98+
p.walking = Some(curr.clone()); // Changes walking to be parent tree
99+
p.curr = next.clone(); // Changes current to be this node
100100
p.index = 0;
101101
} else {
102102
bail!("Tried to step into a node with 0 entries which is invalid");

0 commit comments

Comments
 (0)