]> git.ipfire.org Git - pakfire.git/commitdiff
mirrors: Disable instead of "broken"
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 31 Jan 2025 12:19:08 +0000 (12:19 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 31 Jan 2025 12:19:08 +0000 (12:19 +0000)
This patch also implements this all with flags.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/mirror.c
src/pakfire/mirror.h
src/pakfire/mirrorlist.c

index 7e2f9263ee6a9697bae673e34fe079931d3eda24..1ff0994b53dd4afdd036633eb86a8989db4e83d5 100644 (file)
@@ -36,8 +36,9 @@ struct pakfire_mirror {
 
        unsigned int retries_left;
 
-       // Set if the mirror is considered broken
-       int is_broken;
+       enum pakfire_mirror_flags {
+               PAKFIRE_MIRROR_ENABLED = (1 << 0),
+       } flags;
 };
 
 static void pakfire_mirror_free(struct pakfire_mirror* mirror) {
@@ -63,6 +64,9 @@ int pakfire_mirror_create(struct pakfire_mirror** mirror,
        // Initialize the reference counter
        m->nrefs = 1;
 
+       // Set default flags
+       m->flags = PAKFIRE_MIRROR_ENABLED;
+
        // Store the URL
        r = pakfire_string_set(m->url, url);
        if (r)
@@ -106,16 +110,10 @@ const char* pakfire_mirror_get_url(struct pakfire_mirror* mirror) {
        return mirror->url;
 }
 
-// Broken
-
-int pakfire_mirror_is_broken(struct pakfire_mirror* mirror) {
-       return mirror->is_broken;
-}
-
-void pakfire_mirror_mark_as_broken(struct pakfire_mirror* mirror) {
-       DEBUG(mirror->ctx, "Mirror %s has been marked as broken\n", mirror->url);
+// Enabled?
 
-       mirror->is_broken = 1;
+int pakfire_mirror_is_enabled(struct pakfire_mirror* mirror) {
+       return (mirror->flags & PAKFIRE_MIRROR_ENABLED);
 }
 
 /*
@@ -133,17 +131,22 @@ int pakfire_mirror_xfer_failed(struct pakfire_mirror* self, pakfire_xfer_error_c
                        like 502 or 503, so there is no point in tryin again.
                */
                case PAKFIRE_XFER_TRANSPORT_ERROR:
-                       pakfire_mirror_mark_as_broken(self);
                        break;
 
                /*
-                       For all other errors, we will just count down.
+                       For all other errors, we will just count down
                */
                default:
-                       if (!self->retries_left--)
-                               pakfire_mirror_mark_as_broken(self);
+                       if (self->retries_left-- > 0)
+                               return 0;
                        break;
        }
 
+       // Disable the mirror
+       self->flags &= ~PAKFIRE_MIRROR_ENABLED;
+
+       // Log action
+       WARN(self->ctx, "Mirror %s has been disabled\n", self->url);
+
        return 0;
 }
index abc44318f0c1d97865a8b641b7111bda89e11a1e..754f542483d5b4b8d216e2e2f61045eb2e7f693b 100644 (file)
@@ -34,10 +34,9 @@ struct pakfire_mirror* pakfire_mirror_unref(struct pakfire_mirror* mirror);
 
 const char* pakfire_mirror_get_url(struct pakfire_mirror* mirror);
 
-// Broken?
+// Enabled?
 
-int pakfire_mirror_is_broken(struct pakfire_mirror* mirror);
-void pakfire_mirror_mark_as_broken(struct pakfire_mirror* mirror);
+int pakfire_mirror_is_enabled(struct pakfire_mirror* mirror);
 
 int pakfire_mirror_xfer_failed(struct pakfire_mirror* self, pakfire_xfer_error_code_t code);
 
index 60ffda5837bb93ea831dec1543cb5b60f0212ac4..fde171da7923c6a4e97c96c71d95948e34a4fb94 100644 (file)
@@ -236,11 +236,11 @@ int pakfire_mirrorlist_empty(struct pakfire_mirrorlist* list) {
 }
 
 /*
-       Return the first mirror that isn't broken
+       Return the first mirror that isn't disabled
 */
 struct pakfire_mirror* pakfire_mirrorlist_get_first(struct pakfire_mirrorlist* list) {
        for (unsigned int i = 0; i < list->num_mirrors; i++) {
-               if (pakfire_mirror_is_broken(list->mirrors[i]))
+               if (!pakfire_mirror_is_enabled(list->mirrors[i]))
                        continue;
 
                return pakfire_mirror_ref(list->mirrors[i]);
@@ -267,8 +267,8 @@ struct pakfire_mirror* pakfire_mirrorlist_get_next(
                        continue;
                }
 
-               // Skip any broken mirrors
-               if (pakfire_mirror_is_broken(list->mirrors[i]))
+               // Skip any disabled mirrors
+               if (!pakfire_mirror_is_enabled(list->mirrors[i]))
                        continue;
 
                // Return the mirror