mirror of
https://github.com/sigp/lighthouse.git
synced 2026-06-15 17:58:23 +00:00
Fix sending partials from immediately complete columns (#9433)
The initial partial send after getBlobs only sends incomplete partial columns, causing issues as we do not propagate these columns. Return complete and incomplete columns from `get_columns_and_mark_as_local_fetched`, and convert any complete columns to partials if necessary. Send all columns retrieved this way after getBlobs Co-Authored-By: Daniel Knopik <daniel@dknopik.de>
This commit is contained in:
@@ -6,6 +6,7 @@ use beacon_chain::data_column_verification::{
|
||||
GossipDataColumnError, KzgVerifiedCustodyDataColumn, observe_gossip_data_column,
|
||||
};
|
||||
use beacon_chain::fetch_blobs::{FetchEngineBlobError, fetch_and_process_engine_blobs};
|
||||
use beacon_chain::partial_data_column_assembler::AssemblyColumn;
|
||||
use beacon_chain::test_utils::{BeaconChainHarness, EphemeralHarnessType};
|
||||
use beacon_chain::{AvailabilityProcessingStatus, BeaconChain, BeaconChainTypes, BlockError};
|
||||
use beacon_processor::{
|
||||
@@ -972,14 +973,35 @@ impl<T: BeaconChainTypes> NetworkBeaconProcessor<T> {
|
||||
// Publish partial columns without eager send
|
||||
// TODO(gloas): implement publish partial columns without eager send
|
||||
if let Some(assembler) = self.chain.data_availability_checker.partial_assembler() {
|
||||
let columns = assembler.get_partials_and_mark_as_local_fetched(block_root, &header);
|
||||
let columns = assembler.get_columns_and_mark_as_local_fetched(block_root, &header);
|
||||
// Republish both complete and incomplete columns as partials
|
||||
let columns: Vec<_> = columns
|
||||
.into_iter()
|
||||
.filter_map(|column| match column {
|
||||
AssemblyColumn::Incomplete(partial) => Some(partial.into_inner()),
|
||||
AssemblyColumn::Complete(full) => {
|
||||
let DataColumnSidecar::Fulu(fulu) = full.as_data_column() else {
|
||||
return None;
|
||||
};
|
||||
match fulu.to_partial() {
|
||||
Ok(partial) => Some(Arc::new(partial)),
|
||||
Err(err) => {
|
||||
error!(
|
||||
%block_root,
|
||||
column_index = %full.index(),
|
||||
?err,
|
||||
"Failed to convert complete column to partial for re-seeding"
|
||||
);
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
if !columns.is_empty() {
|
||||
debug!(block = %block_root, "Publishing all partials after getBlobs");
|
||||
self.send_network_message(NetworkMessage::PublishPartialColumns {
|
||||
columns: columns
|
||||
.into_iter()
|
||||
.map(|partial| partial.into_inner())
|
||||
.collect(),
|
||||
columns,
|
||||
header,
|
||||
});
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user