pub trait FinalizationHandler:
Send
+ Sync
+ 'static {
// Required method
fn finalize_all_groups<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
glm: &'life1 mut (dyn GroupLifecycleManager + Send),
processor: &'life2 (dyn GroupDataProcessor + Send + Sync),
completed_data_tx: &'life3 Sender<SuccessfulGroupData>,
failed_data_tx: &'life4 Sender<FailedGroupDataTransmission>,
) -> Pin<Box<dyn Future<Output = FinalizeResult> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait;
}
Expand description
处理 Manager Finalize 阶段的 Trait。
当 ManagerActor
收到 Finalize
请求或所有 ZeroCopyHandle
被 Drop 时,
会调用此 Trait 的实现来处理所有当前存在于 GroupLifecycleManager
中的分组。
目的是确保所有预留都有最终状态(成功或失败),并将结果(成功合并的数据或失败信息)
发送给相应的消费者通道,同时生成一份包含无法发送的失败信息的 FinalizeResult
报告。
Required Methods§
Sourcefn finalize_all_groups<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
glm: &'life1 mut (dyn GroupLifecycleManager + Send),
processor: &'life2 (dyn GroupDataProcessor + Send + Sync),
completed_data_tx: &'life3 Sender<SuccessfulGroupData>,
failed_data_tx: &'life4 Sender<FailedGroupDataTransmission>,
) -> Pin<Box<dyn Future<Output = FinalizeResult> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
fn finalize_all_groups<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
glm: &'life1 mut (dyn GroupLifecycleManager + Send),
processor: &'life2 (dyn GroupDataProcessor + Send + Sync),
completed_data_tx: &'life3 Sender<SuccessfulGroupData>,
failed_data_tx: &'life4 Sender<FailedGroupDataTransmission>,
) -> Pin<Box<dyn Future<Output = FinalizeResult> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
处理所有剩余的分组,执行清理和报告。
该方法会迭代 GroupLifecycleManager
中的所有分组 ID,并对每个分组执行以下操作:
- 强制密封: 确保分组处于密封状态,即使其大小未达到阈值。
- 处理未完成预留: 将分组状态中
reservations
集合内仍然存在的预留 ID 视为失败, 查找它们的元数据(偏移量和大小),创建FailedReservationInfo
并添加到分组的failed_infos
列表。 - 获取分组状态: 从
GroupLifecycleManager
中take
出分组的状态 (GroupState
)。 - 尝试处理: 调用共享的
try_process_taken_group_state
函数处理获取到的GroupState
。- 如果成功处理(发送了成功数据或确定为空),则记录日志。
- 如果处理失败(例如内部包含失败信息),则判定为失败分组。
- 处理失败分组: 如果步骤 4 判定为失败,再次
take
该分组的状态(因为try_process...
失败时会放回), 提取其已提交的数据块 (committed_data
) 和失败预留信息 (failed_infos
), 构建FailedGroupData
结构体。 - 发送失败数据: 尝试通过
failed_data_tx
通道发送构建好的FailedGroupData
。 - 记录报告: 如果发送失败(例如通道已关闭或阻塞),则将
FailedGroupData
添加到最终的FinalizeResult
报告中。
§Arguments
&self
- FinalizationHandler 实例的引用 (通常无状态)。glm
- 对GroupLifecycleManager
实现的可变引用,用于获取、修改和移除分组状态。processor
- 对GroupDataProcessor
实现的引用,用于在处理成功分组时合并数据。completed_data_tx
- 对成功数据发送通道 (mpsc::Sender<SuccessfulGroupData>
) 的引用。failed_data_tx
- 对失败数据发送通道 (mpsc::Sender<FailedGroupDataTransmission>
) 的引用。
§Returns
FinalizeResult
- 包含所有处理失败且 未能 通过failed_data_tx
发送出去的失败分组信息 (FailedGroupData
) 的集合。