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;

Reply via email to