Fix boot rule link

This commit is contained in:
Joey Yakimowich-Payne 2026-01-30 14:01:15 -07:00
commit f1a5e2b2e2

View file

@ -345,6 +345,7 @@ struct Client::Impl {
uint32_t policy_sync_seq = 0;
bool policy_sync_pending = false;
std::vector<std::unique_ptr<LinkProxy>> auto_link_proxies;
std::vector<std::pair<uint32_t, uint32_t>> auto_link_claimed_pairs;
std::vector<std::unique_ptr<LinkProxy>> saved_link_proxies;
pw_proxy* metadata_proxy = nullptr;
@ -557,6 +558,8 @@ void Client::Impl::CoreDone(void* data, uint32_t, int seq) {
if (impl->policy_sync_pending &&
seq >= static_cast<int>(impl->policy_sync_seq)) {
impl->policy_sync_pending = false;
fprintf(stderr, "[WP] CoreDone policy sync seq=%d, pending_auto=%zu saved=%zu\n",
seq, impl->pending_auto_links.size(), impl->saved_links.size());
impl->ProcessPendingAutoLinks();
impl->ProcessSavedLinks();
}
@ -598,6 +601,7 @@ void Client::Impl::ClearCache() {
ports.clear();
links.clear();
pending_auto_links.clear();
auto_link_claimed_pairs.clear();
policy_sync_pending = false;
}
@ -946,6 +950,8 @@ void Client::Impl::ProcessPendingAutoLinks() {
}
}
if (target_node_id == 0) {
fprintf(stderr, "[WP] AutoLink: target '%s' not found for src node %u\n",
it->target_node_name.c_str(), it->source_node_id);
++it;
continue;
}
@ -968,6 +974,9 @@ void Client::Impl::ProcessPendingAutoLinks() {
}
if (src_ports.empty() || tgt_ports.empty()) {
fprintf(stderr, "[WP] AutoLink: src_ports=%zu tgt_ports=%zu for src=%u target=%u('%s')\n",
src_ports.size(), tgt_ports.size(), it->source_node_id,
target_node_id, it->target_node_name.c_str());
++it;
continue;
}
@ -988,8 +997,14 @@ void Client::Impl::ProcessPendingAutoLinks() {
break;
}
}
auto_link_claimed_pairs.emplace_back(src_ports[i].id, tgt_ports[i].id);
if (!exists) {
links_to_create.push_back({src_ports[i].id, tgt_ports[i].id});
fprintf(stderr, "[WP] AutoLink: will create %u->%u\n",
src_ports[i].id, tgt_ports[i].id);
} else {
fprintf(stderr, "[WP] AutoLink: already exists %u->%u (claimed)\n",
src_ports[i].id, tgt_ports[i].id);
}
}
@ -1060,6 +1075,9 @@ void Client::Impl::ProcessSavedLinks() {
if (covered_by_rule) break;
}
if (covered_by_rule) {
fprintf(stderr, "[WP] SavedLink: covered_by_rule, skipping %s:%s -> %s:%s\n",
it->out_node.c_str(), it->out_port.c_str(),
it->in_node.c_str(), it->in_port.c_str());
it = saved_links.erase(it);
continue;
}
@ -1091,6 +1109,9 @@ void Client::Impl::ProcessSavedLinks() {
}
}
if (exists) {
fprintf(stderr, "[WP] SavedLink: already exists %s:%s -> %s:%s\n",
it->out_node.c_str(), it->out_port.c_str(),
it->in_node.c_str(), it->in_port.c_str());
it = saved_links.erase(it);
continue;
}
@ -1101,6 +1122,7 @@ void Client::Impl::ProcessSavedLinks() {
}
}
fprintf(stderr, "[WP] SavedLink: %zu links to create\n", to_create.size());
if (to_create.empty()) return;
std::unordered_map<uint32_t, std::vector<uint32_t>> saved_port_map;
@ -1132,6 +1154,14 @@ void Client::Impl::ProcessSavedLinks() {
proxy->input_port == in_port) { is_ours = true; break; }
}
}
if (!is_ours) {
uint32_t out_port = link_entry.second.output_port.value;
for (const auto& pair : auto_link_claimed_pairs) {
if (pair.first == out_port && pair.second == in_port) {
is_ours = true; break;
}
}
}
if (!is_ours) {
uint32_t out_port = link_entry.second.output_port.value;
for (const auto& proxy : saved_link_proxies) {
@ -1140,7 +1170,12 @@ void Client::Impl::ProcessSavedLinks() {
}
}
if (!is_ours) {
fprintf(stderr, "[WP] Competing: link %u (%u->%u) has no owner, will destroy\n",
link_id, link_entry.second.output_port.value, in_port);
competing_link_ids.push_back(link_id);
} else {
fprintf(stderr, "[WP] Competing: link %u (%u->%u) is ours, keeping\n",
link_id, link_entry.second.output_port.value, in_port);
}
}
}
@ -2084,6 +2119,7 @@ Status Client::RemoveRouteRule(RuleId id) {
++pending_it;
}
}
impl_->auto_link_claimed_pairs.clear();
}
impl_->AutoSave();
@ -2373,6 +2409,9 @@ Status Client::LoadConfig(std::string_view path) {
in_node.empty() || in_port.empty()) {
continue;
}
fprintf(stderr, "[WP] Config: loaded saved link %s:%s -> %s:%s\n",
out_node.c_str(), out_port.c_str(),
in_node.c_str(), in_port.c_str());
impl_->saved_links.push_back({out_node, out_port, in_node, in_port});
} catch (...) {
continue;