added paginated list of nodes
This commit is contained in:
parent
dfe37b27cf
commit
c7976ec44b
@ -108,6 +108,31 @@ impl FileManager {
|
|||||||
file.read_exact(&mut node_bytes).await?;
|
file.read_exact(&mut node_bytes).await?;
|
||||||
Ok(Node::from_bytes(node_bytes))
|
Ok(Node::from_bytes(node_bytes))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns 20 nodes from the disk.
|
||||||
|
/// Specify offset (the number of nodes to skip).
|
||||||
|
async fn get_page_of_20(&self, offset: u64) -> std::io::Result<Vec<Node>> {
|
||||||
|
let mut file = self.file.lock().await;
|
||||||
|
file.seek(SeekFrom::Start(
|
||||||
|
offset
|
||||||
|
.wrapping_mul(DATA_SIZE.try_into().unwrap_or(0)),
|
||||||
|
))
|
||||||
|
.await?;
|
||||||
|
let mut nodes = Vec::new();
|
||||||
|
let mut count = 0;
|
||||||
|
loop {
|
||||||
|
let mut node_bytes = [0; DATA_SIZE];
|
||||||
|
if let Err(_) = file.read_exact(&mut node_bytes).await {
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
nodes.push(Node::from_bytes(node_bytes));
|
||||||
|
count += 1;
|
||||||
|
if count == 20 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(nodes)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -287,4 +312,64 @@ mod tests {
|
|||||||
remove_file(get_test_file_name(function_name)).await?;
|
remove_file(get_test_file_name(function_name)).await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn get_page_of_20_nodes() -> Result<()> {
|
||||||
|
let function_name = "get_page_of_20_nodes";
|
||||||
|
let manager = setup_test_file(function_name).await?;
|
||||||
|
let mut count = 0;
|
||||||
|
let mut nodes: Vec<Node> = Vec::new();
|
||||||
|
while count < 100 {
|
||||||
|
let node = get_random_node();
|
||||||
|
if count >= 23 && count < 43 {
|
||||||
|
nodes.push(node.clone());
|
||||||
|
}
|
||||||
|
manager.append_node(node).await?;
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
count = 23;
|
||||||
|
let mut r_nodes = manager.get_page_of_20(23).await?.into_iter();
|
||||||
|
for node in nodes.iter() {
|
||||||
|
let r_node = r_nodes.next().unwrap();
|
||||||
|
println!("{} {} {}", count, node.ip_as_string(), r_node.ip_as_string());
|
||||||
|
assert_eq!(node.ip_as_string(), r_node.ip_as_string());
|
||||||
|
assert_eq!(node.keypair, r_node.keypair);
|
||||||
|
count += 1;
|
||||||
|
if count == 44 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
remove_file(get_test_file_name(function_name)).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn get_last_page() -> Result<()> {
|
||||||
|
let function_name = "get_last_page";
|
||||||
|
let manager = setup_test_file(function_name).await?;
|
||||||
|
let mut count = 0;
|
||||||
|
let mut nodes: Vec<Node> = Vec::new();
|
||||||
|
while count < 97 {
|
||||||
|
let node = get_random_node();
|
||||||
|
if count >= 90 {
|
||||||
|
nodes.push(node.clone());
|
||||||
|
}
|
||||||
|
manager.append_node(node).await?;
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
count = 23;
|
||||||
|
let mut r_nodes = manager.get_page_of_20(90).await?.into_iter();
|
||||||
|
for node in nodes.iter() {
|
||||||
|
let r_node = r_nodes.next().unwrap();
|
||||||
|
println!("{} {} {}", count, node.ip_as_string(), r_node.ip_as_string());
|
||||||
|
assert_eq!(node.ip_as_string(), r_node.ip_as_string());
|
||||||
|
assert_eq!(node.keypair, r_node.keypair);
|
||||||
|
count += 1;
|
||||||
|
if count == 44 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
remove_file(get_test_file_name(function_name)).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user