MCPcopy Create free account
hub / github.com/atomicdotdev/atomic / find_block_in_inode

Method find_block_in_inode

atomic-core/src/pristine/txn/read.rs:1764–1822  ·  view source on GitHub ↗
(
        &self,
        inode: Inode,
        pos: Position<NodeId>,
    )

Source from the content-addressed store, hash-verified

1762 }
1763
1764 fn find_block_in_inode(
1765 &self,
1766 inode: Inode,
1767 pos: Position<NodeId>,
1768 ) -> Result<Option<GraphNode<NodeId>>, Self::InodeError> {
1769 let table = &self.inode_graph_table;
1770 let inode_id = inode.get();
1771 let change_id = pos.change.get();
1772 let target_pos = pos.pos.get();
1773
1774 // Fast path: probe exact start position
1775 let exact_start = encode_inode_vertex(inode_id, change_id, target_pos, 0);
1776 let exact_end = encode_inode_vertex(inode_id, change_id, target_pos, u64::MAX);
1777 let mut empty_match = None;
1778
1779 for result in table.range::<&[u8; 32]>(&exact_start..=&exact_end)? {
1780 let (key, _) = result?;
1781 let (_, v_change, v_start, v_end) = decode_inode_vertex(key.value());
1782 if v_change != change_id || v_start != target_pos {
1783 continue;
1784 }
1785 if v_start != v_end {
1786 return Ok(Some(GraphNode {
1787 change: NodeId::new(v_change),
1788 start: ChangePosition::new(v_start),
1789 end: ChangePosition::new(v_end),
1790 }));
1791 }
1792 if empty_match.is_none() {
1793 empty_match = Some(GraphNode {
1794 change: NodeId::new(v_change),
1795 start: ChangePosition::new(v_start),
1796 end: ChangePosition::new(v_end),
1797 });
1798 }
1799 }
1800
1801 if let Some(m) = empty_match {
1802 return Ok(Some(m));
1803 }
1804
1805 // Slow path: scan all vertices for this change within the inode
1806 let start_key = encode_inode_vertex(inode_id, change_id, 0, 0);
1807 let end_key = encode_inode_vertex(inode_id, change_id, u64::MAX, u64::MAX);
1808
1809 for result in table.range::<&[u8; 32]>(&start_key..=&end_key)? {
1810 let (key, _) = result?;
1811 let (_, v_change, v_start, v_end) = decode_inode_vertex(key.value());
1812 if v_change == change_id && v_start <= target_pos && target_pos < v_end {
1813 return Ok(Some(GraphNode {
1814 change: NodeId::new(v_change),
1815 start: ChangePosition::new(v_start),
1816 end: ChangePosition::new(v_end),
1817 }));
1818 }
1819 }
1820
1821 Ok(None)

Callers 5

select_linear_successorFunction · 0.45
find_startMethod · 0.45

Calls 4

encode_inode_vertexFunction · 0.85
decode_inode_vertexFunction · 0.85
is_noneMethod · 0.80
getMethod · 0.65

Tested by

no test coverage detected