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) {
// 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)
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);
}
/*
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;
}
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);
}
/*
- 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]);
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