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

Reply via email to