(
&self,
inode: Inode,
pos: Position<NodeId>,
)
| 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) |
no test coverage detected