This diff uses the now available aborts to stop repository synchronisations once the timeout is hit.
I played with very short repo_timeouts and it seems to work better then what we have now. -- :wq Claudio ? obj Index: extern.h =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/extern.h,v retrieving revision 1.152 diff -u -p -r1.152 extern.h --- extern.h 2 Sep 2022 18:37:17 -0000 1.152 +++ extern.h 2 Sep 2022 18:47:16 -0000 @@ -653,9 +653,11 @@ void rrdp_finish(unsigned int, int); void rsync_fetch(unsigned int, const char *, const char *, const char *); +void rsync_abort(unsigned int); void http_fetch(unsigned int, const char *, const char *, int); void rrdp_fetch(unsigned int, const char *, const char *, struct rrdp_session *); +void rrdp_abort(unsigned int); void rrdp_http_done(unsigned int, enum http_result, const char *); int repo_check_timeout(int); Index: main.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/main.c,v retrieving revision 1.215 diff -u -p -r1.215 main.c --- main.c 30 Aug 2022 22:42:32 -0000 1.215 +++ main.c 2 Sep 2022 18:47:16 -0000 @@ -256,6 +256,18 @@ rrdp_fetch(unsigned int id, const char * io_close_buffer(&rrdpq, b); } +void +rrdp_abort(unsigned int id) +{ + enum rrdp_msg type = RRDP_ABORT; + struct ibuf *b; + + b = io_new_buffer(); + io_simple_buffer(b, &type, sizeof(type)); + io_simple_buffer(b, &id, sizeof(id)); + io_close_buffer(&rrdpq, b); +} + /* * Request a repository sync via rsync URI to directory local. */ @@ -270,6 +282,19 @@ rsync_fetch(unsigned int id, const char io_str_buffer(b, local); io_str_buffer(b, base); io_str_buffer(b, uri); + io_close_buffer(&rsyncq, b); +} + +void +rsync_abort(unsigned int id) +{ + struct ibuf *b; + + b = io_new_buffer(); + io_simple_buffer(b, &id, sizeof(id)); + io_str_buffer(b, NULL); + io_str_buffer(b, NULL); + io_str_buffer(b, NULL); io_close_buffer(&rsyncq, b); } Index: repo.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/repo.c,v retrieving revision 1.37 diff -u -p -r1.37 repo.c --- repo.c 2 Sep 2022 15:09:19 -0000 1.37 +++ repo.c 2 Sep 2022 18:47:17 -0000 @@ -1204,6 +1204,20 @@ repo_fail(struct repo *rp) errx(1, "%s: bad repo", rp->repouri); } +static void +repo_abort(struct repo *rp) +{ + /* reset the alarm */ + rp->alarm = getmonotime() + repo_timeout; + + if (rp->rsync) + rsync_abort(rp->rsync->id); + else if (rp->rrdp) + rrdp_abort(rp->rrdp->id); + else + repo_fail(rp); +} + int repo_check_timeout(int timeout) { @@ -1217,7 +1231,7 @@ repo_check_timeout(int timeout) if (rp->alarm <= now) { warnx("%s: synchronisation timeout", rp->repouri); - repo_fail(rp); + repo_abort(rp); } else { int diff = rp->alarm - now; diff *= 1000;