At the moment work items are enqueued in the order the CA intended them to appear on a Manifest. However, I don't see any benefit to letting third parties decide the order in which things are processed. Instead, let's randomize: ordering has no meaning anyway, and the number of concurrent repository synchronization operations is limited & timeboxed.
As they say, a fox is not taken twice in the same snare. :-) OK? Index: mft.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/mft.c,v retrieving revision 1.96 diff -u -p -r1.96 mft.c --- mft.c 29 Jun 2023 10:28:25 -0000 1.96 +++ mft.c 2 Sep 2023 22:35:10 -0000 @@ -233,6 +233,7 @@ mft_parse_filehash(struct parse *p, cons int rc = 0; struct mftfile *fent; enum rtype type; + size_t new_idx = 0; if (!valid_mft_filename(fh->file->data, fh->file->length)) { warnx("%s: RFC 6486 section 4.2.2: bad filename", p->fn); @@ -256,8 +257,15 @@ mft_parse_filehash(struct parse *p, cons p->found_crl = 1; } - /* Insert the filename and hash value. */ - fent = &p->res->files[p->res->filesz++]; + if (filemode) + fent = &p->res->files[p->res->filesz++]; + else { + /* Fisher-Yates shuffle */ + new_idx = arc4random_uniform(p->res->filesz + 1); + p->res->files[p->res->filesz++] = p->res->files[new_idx]; + fent = &p->res->files[new_idx]; + } + fent->type = type; fent->file = fn; fn = NULL;