]> git.ipfire.org Git - location/libloc.git/commitdiff
tree: Try harder to merge networks
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 6 Mar 2025 16:37:09 +0000 (16:37 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 6 Mar 2025 16:37:09 +0000 (16:37 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/network-tree.c

index c2627e3b30985d545e4481d0de082a491ff71728..179ba3e29f32c419fcbdbd45d2c1f457b47dd2ce 100644 (file)
@@ -451,6 +451,7 @@ static int loc_network_tree_merge(struct loc_network_tree* tree) {
                .networks = NULL,
                .merged   = 0,
        };
+       unsigned int total_merged = 0;
        int r;
 
        // Create a new list
@@ -458,12 +459,23 @@ static int loc_network_tree_merge(struct loc_network_tree* tree) {
        if (r)
                goto ERROR;
 
-       // Walk through the entire tree
-       r = loc_network_tree_walk(tree, NULL, loc_network_tree_merge_step, &ctx);
-       if (r)
-               goto ERROR;
+       // This is a fix for a very interesting problem which only occurs on non-Debian
+       // systems where the algorithm seems to miss some merges. If we run it multiple
+       // times it will however find them...
+       do {
+               // Reset merges
+               ctx.merged = 0;
+
+               // Walk through the entire tree
+               r = loc_network_tree_walk(tree, NULL, loc_network_tree_merge_step, &ctx);
+               if (r)
+                       goto ERROR;
+
+               // Count all merges
+               total_merged += ctx.merged;
+       } while (ctx.merged > 0);
 
-       DEBUG(tree->ctx, "%u network(s) have been merged\n", ctx.merged);
+       DEBUG(tree->ctx, "%u network(s) have been merged\n", total_merged);
 
 ERROR:
        if (ctx.networks)