exp backoff and theads handling

This commit is contained in:
TIBERGHIEN corentin
2026-01-20 01:10:09 +01:00
parent 08518892f2
commit dacedd1ceb
9 changed files with 469 additions and 331 deletions

View File

@@ -6,28 +6,20 @@ const DIRECTORY: u8 = 1;
const BIG: u8 = 2;
const BIGDIRECTORY: u8 = 3;
fn parse_received_datum(recevied_datum: Vec<u8>, datum_length: usize, mut tree: MerkleTree) {
if datum_length > recevied_datum.len() {
return;
}
if datum_length < 32 + 64 {
return;
}
pub fn parse_received_datum(
recevied_datum: Vec<u8>,
datum_length: usize,
) -> Option<([u8; 32], MerkleNode)> {
let hash_name: [u8; 32] = recevied_datum[..32].try_into().expect("error");
let sigstart = datum_length - 64;
let value = &recevied_datum[32..sigstart];
let value_slice = value.to_vec();
let signature: [u8; 32] = recevied_datum[sigstart..datum_length]
.try_into()
.expect("Taille incorrecte");
let datum_type = value_slice[0];
match datum_type {
CHUNK => {
tree.data.insert(
hash_name,
MerkleNode::Chunk(crate::ChunkNode { data: value_slice }),
);
}
CHUNK => Some((
hash_name,
MerkleNode::Chunk(crate::ChunkNode { data: value_slice }),
)),
DIRECTORY => {
let nb_entries = value_slice[1];
let mut dir_entries = Vec::new();
@@ -46,23 +38,28 @@ fn parse_received_datum(recevied_datum: Vec<u8>, datum_length: usize, mut tree:
let current = DirectoryNode::new(dir_entries);
match current {
Ok(current_node) => {
tree.data
.insert(hash_name, MerkleNode::Directory(current_node));
}
Ok(current_node) => Some((hash_name, MerkleNode::Directory(current_node))),
Err(e) => {
println!("{}", e);
None
}
}
}
BIG => {
let chlidren: Vec<NodeHash> = Vec::new();
Some((
hash_name,
MerkleNode::Big(crate::BigNode {
children_hashes: chlidren,
}),
))
/*let chlidren: Vec<NodeHash> = Vec::new();
tree.data.insert(
hash_name,
MerkleNode::Big(crate::BigNode {
children_hashes: chlidren,
}),
);
);*/
}
BIGDIRECTORY => {
let nb_entries = value_slice[1];
@@ -82,15 +79,13 @@ fn parse_received_datum(recevied_datum: Vec<u8>, datum_length: usize, mut tree:
let current = BigDirectoryNode::new(dir_entries);
match current {
Ok(current_node) => {
tree.data
.insert(hash_name, MerkleNode::BigDirectory(current_node));
}
Ok(current_node) => Some((hash_name, MerkleNode::BigDirectory(current_node))),
Err(e) => {
println!("{}", e);
None
}
}
}
_ => {}
_ => None,
}
}