On 2025/05/19 10:30, Florian Obser wrote: > On 2025-03-12 12:00 GMT, Stuart Henderson <s...@spacehopper.org> wrote: > > Sorry I don't have a diff for this. > > > > I just had a renewal on letsencrypt staging fail; status went from > > PENDING->READY->PROCESSING when acme-client netproc was expecting only > > INVALID/VALID/PENDING/READY. > > > > From https://www.rfc-editor.org/rfc/rfc8555#page-48 > > > > o "processing": The certificate is being issued. Send a POST-as-GET > > request after the time given in the Retry-After header field of > > the response, if any. > > Excellent, no normative language around Retry-After, so I can totally > ignore that! > > Good call on limiting the retries. I've also added it to ORDER_PENDING > and reset the counter if we make some forward progress. > > I'm wondering if the retry limit should be a global thing, no matter > what the state is. I'll leave that as an exercise for future > generations... > > I could fairly easily trigger the processing state against the staging > environment, happens about 1 in 5 times. > > OK?
Thanks, this seems good enough for now. OK > diff --git netproc.c netproc.c > index f67f8abc0b3..916086f6e0d 100644 > --- netproc.c > +++ netproc.c > @@ -673,7 +673,7 @@ netproc(int kfd, int afd, int Cfd, int cfd, int dfd, int > rfd, > int revocate, struct authority_c *authority, > const char *const *alts, size_t altsz) > { > - int rc = 0; > + int rc = 0, retries = 0; > size_t i; > char *cert = NULL, *thumb = NULL, *error = NULL; > struct conn c; > @@ -863,6 +863,9 @@ netproc(int kfd, int afd, int Cfd, int cfd, int dfd, int > rfd, > if (!docert(&c, order.finalize, cert)) > goto out; > break; > + case ORDER_PROCESSING: > + /* we'll just retry */ > + break; > default: > warnx("unhandled status: %d", order.status); > goto out; > @@ -871,8 +874,19 @@ netproc(int kfd, int afd, int Cfd, int cfd, int dfd, int > rfd, > goto out; > > dodbg("order.status %d", order.status); > - if (order.status == ORDER_PENDING) > + switch (order.status) { > + case ORDER_PENDING: > + case ORDER_PROCESSING: > + if (retries++ > RETRY_MAX) { > + warnx("too many retries"); > + goto out; > + } > sleep(RETRY_DELAY); > + break; > + default: > + retries = 0; /* state changed, we made progress */ > + break; > + } > } > > if (order.status != ORDER_VALID) { > > > -- > In my defence, I have been left unsupervised. >