On Tue, May 30, 2023 at 02:38:23PM +0200, Claudio Jeker wrote:
> 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.
> > + */
Forgot to mention, for this here I would suggest we pass in a time_t
crlmtime to proc_parser_mft() and set the crlmtime there right before we
crl_insert() the crl. I find that a bit better than returning a pointer to
struct crl (since we're not supposed to crl_free() that one).
> > + 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
>
--
:wq Claudio