From: Michael Tremer Date: Sat, 13 Mar 2021 15:00:16 +0000 (+0000) Subject: repo: Do not refresh recently downloaded metadata X-Git-Tag: 0.9.28~1285^2~534 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a5e9cd4b605318414f89e277e119c3c7243fcbd4;p=pakfire.git repo: Do not refresh recently downloaded metadata Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index 75e6a7e27..d63f47cc5 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -62,6 +62,7 @@ int pakfire_string_endswith(const char* s, const char* suffix); char* pakfire_lstrip(const char* s); int pakfire_path_exists(const char* path); +time_t pakfire_path_age(const char* path); char* pakfire_hexlify(const char* digest, const size_t length); diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index 702c44e82..e8e2aa2f2 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -46,6 +46,12 @@ #include #include +// Refresh mirrorlists once a day +#define REFRESH_AGE_MIRRORLIST 24 * 3600 + +// Refresh repository metadata every 10 minutes +#define REFRESH_AGE_METADATA 600 + const uint8_t XZ_HEADER_MAGIC[] = { 0xFD, '7', 'z', 'X', 'Z', 0x00 }; const size_t XZ_HEADER_LENGTH = sizeof(XZ_HEADER_MAGIC); @@ -192,6 +198,16 @@ static int pakfire_repo_refresh_mirrorlist(PakfireRepo repo, const int force) { if (!mirrorlist_url || !*mirrorlist) return 0; + // Check if this needs to be refreshed + if (!force) { + time_t age = pakfire_path_age(mirrorlist); + + if (age > 0 && age < REFRESH_AGE_MIRRORLIST) { + DEBUG(repo->pakfire, "Skip refreshing mirrorlist which is %lds old\n", age); + return 0; + } + } + // Get the downloader struct pakfire_downloader* downloader = pakfire_repo_downloader(repo); if (!downloader) @@ -234,6 +250,16 @@ ERROR: } static int pakfire_repo_refresh_metadata(PakfireRepo repo, const int force) { + // Check if this needs to be refreshed + if (!force) { + time_t age = pakfire_path_age(repo->appdata->metadata); + + if (age > 0 && age < REFRESH_AGE_METADATA) { + DEBUG(repo->pakfire, "Skip refreshing metadata which is %lds old\n", age); + return 0; + } + } + // Get the downloader struct pakfire_downloader* downloader = pakfire_repo_downloader(repo); if (!downloader) diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index f657aa4bb..28f5dad52 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -236,6 +236,21 @@ int pakfire_path_exists(const char* path) { return !access(path, F_OK); } +time_t pakfire_path_age(const char* path) { + struct stat st; + + int r = stat(path, &st); + if (r == 0) { + // Get current timestamp + time_t now = time(NULL); + + // Return the difference since the file has been created and now + return now - st.st_ctime; + } + + return -1; +} + PAKFIRE_EXPORT int pakfire_path_isdir(const char* path) { struct stat s;