pibd: check if segment not exists at request when selecting next required

This commit is contained in:
ardocrat
2026-04-23 00:52:16 +03:00
parent 29f822f298
commit 03ddb5f118
+17 -16
View File
@@ -583,6 +583,16 @@ impl Desegmenter {
}
}
// Explicitly add segment identifier to request if not exists.
let mut maybe_add_to_request = |seg_id: SegmentTypeIdentifier| {
if return_vec.iter().any(|i| i == &seg_id) {
if return_vec.len() >= max_elements {
return_vec.pop();
}
return_vec.push(seg_id);
}
};
// Ensure we explicitly ask for the next output segment.
if let Some(next_output_idx) = self.next_required_output_segment_index() {
let seg_id = SegmentIdentifier {
@@ -590,10 +600,8 @@ impl Desegmenter {
idx: next_output_idx,
};
if !self.has_output_segment_with_id(seg_id) {
if return_vec.len() >= max_elements {
return_vec.pop();
}
return_vec.push(SegmentTypeIdentifier::new(SegmentType::Output, seg_id));
let next_output_seg_id = SegmentTypeIdentifier::new(SegmentType::Output, seg_id);
maybe_add_to_request(next_output_seg_id);
}
}
@@ -604,10 +612,8 @@ impl Desegmenter {
idx: next_rp_idx,
};
if !self.has_rangeproof_segment_with_id(seg_id) {
if return_vec.len() >= max_elements {
return_vec.pop();
}
return_vec.push(SegmentTypeIdentifier::new(SegmentType::RangeProof, seg_id));
let next_proof_seg_id = SegmentTypeIdentifier::new(SegmentType::RangeProof, seg_id);
maybe_add_to_request(next_proof_seg_id);
}
}
@@ -619,14 +625,9 @@ impl Desegmenter {
height: self.default_kernel_segment_height,
idx: next_kernel_idx,
};
let next_kernel_seg_id = SegmentTypeIdentifier::new(SegmentType::Kernel, seg_id);
if !self.has_kernel_segment_with_id(seg_id)
&& !return_vec.iter().any(|x| x == &next_kernel_seg_id)
{
if return_vec.len() >= max_elements {
return_vec.pop();
}
return_vec.push(next_kernel_seg_id);
if !self.has_kernel_segment_with_id(seg_id) {
let next_kernel_seg_id = SegmentTypeIdentifier::new(SegmentType::Kernel, seg_id);
maybe_add_to_request(next_kernel_seg_id);
}
}
if return_vec.is_empty() && self.bitmap_cache.is_some() {