From: Arran Cudbard-Bell Date: Fri, 6 Dec 2019 11:46:40 +0000 (+0700) Subject: Expose interface to requeue requests X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=491bb262018a73ef805fc535e8f6e2bf2beaf558;p=thirdparty%2Ffreeradius-server.git Expose interface to requeue requests --- diff --git a/src/lib/server/trunk.c b/src/lib/server/trunk.c index 4d9c588e53d..d03724bee00 100644 --- a/src/lib/server/trunk.c +++ b/src/lib/server/trunk.c @@ -1303,11 +1303,13 @@ static void trunk_connection_requests_dequeue(fr_dlist_head_t *out, fr_trunk_con * * @param[in] tconn To remove requests from. * @param[in] states One or more states or'd together. + * @return the number of requests re-queued. */ -static void trunk_connection_requests_requeue(fr_trunk_connection_t *tconn, int states) +static uint64_t trunk_connection_requests_requeue(fr_trunk_connection_t *tconn, int states) { fr_dlist_head_t to_process; fr_trunk_request_t *treq = NULL; + uint64_t moved = 0; fr_dlist_talloc_init(&to_process, fr_trunk_request_t, list); @@ -1323,6 +1325,8 @@ static void trunk_connection_requests_requeue(fr_trunk_connection_t *tconn, int while ((treq = fr_dlist_next(&to_process, treq))) { fr_trunk_request_t *prev; + moved++; + prev = fr_dlist_remove(&to_process, treq); switch (trunk_request_enqueue_existing(treq)) { case TRUNK_ENQUEUE_OK: @@ -1364,6 +1368,8 @@ static void trunk_connection_requests_requeue(fr_trunk_connection_t *tconn, int while ((treq = fr_dlist_next(&to_process, treq))) { fr_trunk_request_t *prev; + moved++; + prev = fr_dlist_remove(&to_process, treq); talloc_free(treq); treq = prev; @@ -1377,6 +1383,27 @@ static void trunk_connection_requests_requeue(fr_trunk_connection_t *tconn, int if (tconn->state == FR_TRUNK_CONN_DRAINING) { trunk_requests_per_connnection(NULL, NULL, tconn->trunk, fr_time()); } + + return moved; +} + +/** Move requests off of a connection and requeue elsewhere + * + * @param[in] tconn to move requests off of. + * @param[in] states Only move requests in this state. + * @return The number of requests requeued. + */ +uint64_t fr_trunk_connection_requests_requeue(fr_trunk_connection_t *tconn, int states) +{ + switch (tconn->state) { + case FR_TRUNK_CONN_ACTIVE: + case FR_TRUNK_CONN_INACTIVE: + case FR_TRUNK_CONN_DRAINING: + return trunk_connection_requests_requeue(tconn, states); + + default: + return 0; + } } /** If the trunk request is freed then update the target requests diff --git a/src/lib/server/trunk.h b/src/lib/server/trunk.h index 8207560cba3..554fba0b452 100644 --- a/src/lib/server/trunk.h +++ b/src/lib/server/trunk.h @@ -386,9 +386,10 @@ void fr_trunk_request_signal_cancel_sent(fr_trunk_request_t *treq); void fr_trunk_request_signal_cancel_complete(fr_trunk_request_t *treq); /** @} */ -/** @name Enqueue requests +/** @name (R)enqueue requests * @{ */ +uint64_t fr_trunk_connection_requests_requeue(fr_trunk_connection_t *tconn, int states); int fr_trunk_request_enqueue(fr_trunk_request_t **treq, fr_trunk_t *trunk, REQUEST *request, void *preq, void *rctx);