DHT:一个住家的水桶维护使另一个住家的邻里维护挨饿
作者: dangowrt创建于 2026年9月1日更新于 2026年9月4日
标签bugscope:3rdpartydependencies
问题是什么?
third-party/dht 固定在 38c9f261 上,其 dht_periodic 门控邻居维护对 两个 地址族在一个 soon 标志上进行 任意 族的 bucket_maintenance 设置:
soon |= bucket_maintenance(AF_INET);
soon |= bucket_maintenance(AF_INET6);
if(!soon) {
if(mybucket_grow_time >= now.tv_sec - 150)
soon |= neighbourhood_maintenance(AF_INET);
if(mybucket6_grow_time >= now.tv_sec - 150)
soon |= neighbourhood_maintenance(AF_INET6);
}两者执行不同的任务: 存储桶维护重新确认已在表中存在的节点,邻居维护则是 扩展 它。因此,一个节点从未响应的族阻止了另一个族找到任何人。一个族永远被卡在了那里,而不是逐渐。buckets6 使用 calloc 分配,因此 b->time 从 0 开始,并且当 max_count == 128 时,根存储桶在第一次 dht_periodic 中已经过时了(to = MAX(600 / (128/8), 30) == 37)。b->time 仅在 confirm == 2 的情况下在 new_node() 中进步 - 这是对我们自己的查询的回复。如果该族中的任何节点都不响应,bucket_maintenance 在每次循环中都返回 1,永远如此,而另一个族再也不会执行邻居维护了。
内容来源: transmission/transmission