On Wed, May 24, 2023 at 04:18:30PM +0000, Job Snijders wrote:
> Dear all,
>
> Claudio made some suggestions to pass the desired modification times
> around in a different way, below is an updated patch proposal.
> I also added some instrumentation to also adjust GBRs and TAKs.
>
> RIPE & APNIC informally indicated some interest in this hack.
>
This looks good. Some feedback below.
> Index: parser.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/parser.c,v
> retrieving revision 1.94
> diff -u -p -r1.94 parser.c
> --- parser.c 11 May 2023 20:13:30 -0000 1.94
> +++ parser.c 24 May 2023 16:11:15 -0000
> @@ -615,8 +621,11 @@ parse_entity(struct entityq *q, struct m
> struct mft *mft;
> struct roa *roa;
> struct aspa *aspa;
> + struct gbr *gbr;
> + struct tak *tak;
> struct ibuf *b;
> unsigned char *f;
> + time_t mtime = 0;
Please initialize mtime to 0 inside of the
while ((entp = TAILQ_FIRST(q)) != NULL) {
loop. e.g right were f and file are set to 0.
> size_t flen;
> char *file, *crlfile;
> int c;
...
> @@ -693,6 +709,11 @@ parse_entity(struct entityq *q, struct m
> io_simple_buffer(b2, &entp->talid,
> sizeof(entp->talid));
> io_str_buffer(b2, crlfile);
> + /*
> + * FIXME: MFT CMS signing-time is used as mtime
> + * instead of CRL lastUpdate.
> + */
> + io_simple_buffer(b2, &mtime, sizeof(mtime));
> free(crlfile);
>
> io_close_buffer(msgq, b2);
> @@ -727,13 +758,18 @@ parse_entity(struct entityq *q, struct m
> case RTYPE_TAK:
> file = parse_load_file(entp, &f, &flen);
> io_str_buffer(b, file);
> - proc_parser_tak(file, f, flen, entp->mftaki);
> + tak = proc_parser_tak(file, f, flen, entp->mftaki);
> + if (tak != NULL)
> + mtime = tak->signtime;
> + io_simple_buffer(b, &mtime, sizeof(mtime));
> + tak_free(tak);
> break;
Thanks for plugging this memory leak here.
> @@ -1540,6 +1542,26 @@ repo_move_valid(struct filepath_tree *tr
>
> if (repo_mkpath(AT_FDCWD, fn) == -1)
> continue;
> +
> + /*
> + * Adjust file last modification time in order to minimize
> + * RSYNC synchronization load after transport failover.
> + * While serializing RRDP datastructures to disk, set the last
> + * modified timestamp to the CMS signing-time or the X.509
> + * notBefore timestamp.
> + */
> + if (fp->mtime != 0 &&
> + strncmp(fp->file, ".rrdp/", rrdpsz) == 0) {
> + struct timespec ts[2];
> +
> + ts[0].tv_nsec = UTIME_OMIT;
> + ts[1].tv_sec = fp->mtime;
> + ts[1].tv_nsec = 0;
> + if (utimensat(AT_FDCWD, fp->file, ts, 0) == -1) {
> + warn("utimensat %s", fp->file);
> + continue;
> + }
> + }
I would move this code up into the else branch of
if (strncmp(fp->file, ".rsync/", rsyncsz) == 0) {
} else {
base = strchr(fp->file + rrdpsz, '/');
assert(base != NULL);
fn = base + 1;
/* HERE */
}
Then it is enough to just check fp->mtime != 0.
>
> if (rename(fp->file, fn) == -1) {
> warn("rename %s", fp->file);
>
--
:wq Claudio