Allan McRae <allan@archlinux.org> on Fri, 2021/05/28 20:43:
Ok, let's see a more detailed example:
* pacman sends a request to pacredir, the header contains a timestamp from synced database file in /var/lib/pacman/sync/: If-Modified-Since: Fri, 28 May 2021 04:38:25 GMT * pacredir sends HEAD requests to pacserve on hosts in local network * pacserve answers with 200, but the header contains a timestamp: Last-Modified: Fri, 28 May 2021 04:38:25 GMT * pacredir sends a 307 with redirect to the host with most recent db file - or 404 if all requested db files are older or of same age as local file
OK... so pacredir never checks for the latest database availability on a mirror if there is a newer database on one of the hosts.
Please note that pacredir does not known about mirrors at all! It tries to redirect in local network - and returns 404 if it can not. It's pacman that skips to the mirrors. That's why pacman should not consider a 404 a permanent error: The next request can result in a successful redirect.
Does this mean the "new" database on the hosts network could be long out of date, but as long as it is newer than the local machine being updated, that is what will be used?
Well, out-of-date is a term that does barely match here... pacman does known about the date of its current database files only. So yes, more recent database files are used as long as they are newer than the local ones - even if out-of-date compared with a mirror. That's why the pacredir documentation tells you to run `pacman -Sy` twice to be sure: First run fetches the newest database from local network, second run (where pacredir returns 404) fetches from mirror if a newer version is available.
The reason I am trying to figure this out is the approach in the bug report only provides cache servers for packages, and not databases. I'm trying to understand why you would cache databases.
Because database file are available on every host anyway. :) Usually it does not add any harm to transfer a database file in local network, even if you have to retransfer an newer one from mirror later. Chance are you do not have to. -- main(a){char*c=/* Schoene Gruesse */"B?IJj;MEH" "CX:;",b;for(a/* Best regards my address: */=0;b=c[a++];) putchar(b-1/(/* Chris cc -ox -xc - && ./x */b/42*2-3)*42);}