#1006·pingora

零重量的后端崩溃导致 KetamaHashing 无法运行,并杀死了负载均衡器的后台更新任务

作者: sinhaparth5创建于 2026年9月10日更新于 2026年9月10日

触发方式 `Backend::weight` 是一个普通的、未经过验证的 `usize`(`pingora-load-balancing/src/lib.rs`)。`Backend::new_with_weight` 和 `ServiceDiscovery` 接口都不接受 0。一些发现后端使用 0 权重作为排除/禁用标记,静态配置或 DNS SRV 记录中的一个打字错误也会产生相同的结果。一旦这样的后端出现在传递给 `KetamaHashing::build_with_config` 的 `BTreeSet<Backend>` 中,`Bucket::new` 就会抛出异常。该调用发生在 `LoadBalancer::update()`(`pingora-load-balancing/src/lib.rs`) 中,由 `pingora-load-balancing/src/background.rs`(`LoadBalancer::run`) 中的后台循环驱动。没有任何东西在 `catch_unwind` 或 `spawn_blocking` 中包裹它。较新的 `LoadBalancerGroup` 重建路径已经在 `spawn_blocking` 中调用了 `build_selector` 并检查 `JoinError::is_panic()`,因此此类异常在该路径中被处理了,但不在普通的 `LoadBalancer<S>` 路径中。

内容来源: cloudflare/pingora