]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Expose interface to requeue requests
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 6 Dec 2019 11:46:40 +0000 (18:46 +0700)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sat, 7 Dec 2019 05:36:35 +0000 (12:36 +0700)
src/lib/server/trunk.c
src/lib/server/trunk.h

index 4d9c588e53d5cce8065dbdc56af9075a68123bb2..d03724bee00c09629efa687c6c58bf238c94298b 100644 (file)
@@ -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
index 8207560cba321ba17b244d1529f260e27965782a..554fba0b45275e95e5929a755a4c99f9248cf2db 100644 (file)
@@ -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);