]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
trunk: Add triggers for request state transitions in debug builds
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 19 Apr 2020 01:56:08 +0000 (20:56 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 19 Apr 2020 01:56:08 +0000 (20:56 -0500)
src/lib/server/trunk.c

index b80356a46b612c0fec6539ddcccc58a4fb1514c6..2dc9f02985436addea61b647faa6927a99a8cd05 100644 (file)
@@ -303,6 +303,28 @@ CONF_PARSER const fr_trunk_config[] = {
        CONF_PARSER_TERMINATOR
 };
 
+#ifndef NDEBUG
+/** Map request states to trigger names
+ *
+ * Must stay in the same order as #fr_trunk_connection_state_t
+ */
+static fr_table_num_indexed_bit_pos_t const fr_trunk_req_trigger_names[] = {
+       { "pool.request_init",                  FR_TRUNK_REQUEST_STATE_INIT             },      /* 0x0000 - bit 0 */
+       { "pool.request_unassigned",            FR_TRUNK_REQUEST_STATE_UNASSIGNED       },      /* 0x0001 - bit 1 */
+       { "pool.request_backlog",               FR_TRUNK_REQUEST_STATE_BACKLOG          },      /* 0x0002 - bit 2 */
+       { "pool.request_pending",               FR_TRUNK_REQUEST_STATE_PENDING          },      /* 0x0004 - bit 3 */
+       { "pool.request_partial",               FR_TRUNK_REQUEST_STATE_PARTIAL          },      /* 0x0008 - bit 4 */
+       { "pool.request_sent",                  FR_TRUNK_REQUEST_STATE_SENT             },      /* 0x0010 - bit 5 */
+       { "pool.request_complete",              FR_TRUNK_REQUEST_STATE_COMPLETE         },      /* 0x0020 - bit 6 */
+       { "pool.request_state_failed",          FR_TRUNK_REQUEST_STATE_FAILED           },      /* 0x0040 - bit 7 */
+       { "pool.request_state_cancel",          FR_TRUNK_REQUEST_STATE_CANCEL           },      /* 0x0080 - bit 8 */
+       { "pool.request_state_cancel_sent",     FR_TRUNK_REQUEST_STATE_CANCEL_SENT      },      /* 0x0100 - bit 9 */
+       { "pool.request_state_cancel_partial",  FR_TRUNK_REQUEST_STATE_CANCEL_PARTIAL   },      /* 0x0200 - bit 10 */
+       { "pool.request_state_cancel_complete", FR_TRUNK_REQUEST_STATE_CANCEL_COMPLETE  }       /* 0x0400 - bit 11 */
+};
+static size_t fr_trunk_req_trigger_names_len = NUM_ELEMENTS(fr_trunk_req_trigger_names);
+#endif
+
 static fr_table_num_ordered_t const fr_trunk_request_states[] = {
        { "INIT",                               FR_TRUNK_REQUEST_STATE_INIT             },
        { "UNASSIGNED",                         FR_TRUNK_REQUEST_STATE_UNASSIGNED       },
@@ -315,7 +337,7 @@ static fr_table_num_ordered_t const fr_trunk_request_states[] = {
        { "CANCEL",                             FR_TRUNK_REQUEST_STATE_CANCEL           },
        { "CANCEL-SENT",                        FR_TRUNK_REQUEST_STATE_CANCEL_SENT      },
        { "CANCEL-PARTIAL",                     FR_TRUNK_REQUEST_STATE_CANCEL_PARTIAL   },
-       { "CANCEL-COMPLETE",                    FR_TRUNK_REQUEST_STATE_CANCEL_COMPLETE}
+       { "CANCEL-COMPLETE",                    FR_TRUNK_REQUEST_STATE_CANCEL_COMPLETE  }
 };
 static size_t fr_trunk_request_states_len = NUM_ELEMENTS(fr_trunk_request_states);
 
@@ -324,46 +346,46 @@ static size_t fr_trunk_request_states_len = NUM_ELEMENTS(fr_trunk_request_states
  * Must stay in the same order as #fr_trunk_connection_state_t
  */
 static fr_table_num_indexed_bit_pos_t const fr_trunk_conn_trigger_names[] = {
-       { "pool.conn_halted",                   FR_TRUNK_CONN_HALTED            },
-       { "pool.conn_init",                     FR_TRUNK_CONN_INIT              },
-       { "pool.conn_connecting",               FR_TRUNK_CONN_CONNECTING        },
-       { "pool.conn_active",                   FR_TRUNK_CONN_ACTIVE            },
-       { "pool.conn_closed",                   FR_TRUNK_CONN_CLOSED            },
-       { "pool.conn_full",                     FR_TRUNK_CONN_FULL              },
-       { "pool.conn_inactive",                 FR_TRUNK_CONN_INACTIVE          },
-       { "pool.conn_inactive_draining",        FR_TRUNK_CONN_INACTIVE_DRAINING },
-       { "pool.conn_draining",                 FR_TRUNK_CONN_DRAINING          },
-       { "pool.conn_draining_to_free",         FR_TRUNK_CONN_DRAINING_TO_FREE  }
+       { "pool.connection_halted",             FR_TRUNK_CONN_HALTED                    },      /* 0x0000 - bit 0 */
+       { "pool.connection_init",               FR_TRUNK_CONN_INIT                      },      /* 0x0001 - bit 1 */
+       { "pool.connection_connecting",         FR_TRUNK_CONN_CONNECTING                },      /* 0x0002 - bit 2 */
+       { "pool.connection_active",             FR_TRUNK_CONN_ACTIVE                    },      /* 0x0004 - bit 3 */
+       { "pool.connection_closed",             FR_TRUNK_CONN_CLOSED                    },      /* 0x0008 - bit 4 */
+       { "pool.connection_full",               FR_TRUNK_CONN_FULL                      },      /* 0x0010 - bit 5 */
+       { "pool.connection_inactive",           FR_TRUNK_CONN_INACTIVE                  },      /* 0x0020 - bit 6 */
+       { "pool.connection_inactive_draining",  FR_TRUNK_CONN_INACTIVE_DRAINING         },      /* 0x0040 - bit 7 */
+       { "pool.connection_draining",           FR_TRUNK_CONN_DRAINING                  },      /* 0x0080 - bit 8 */
+       { "pool.connection_draining_to_free",   FR_TRUNK_CONN_DRAINING_TO_FREE          }       /* 0x0100 - bit 9 */
 };
 static size_t fr_trunk_conn_trigger_names_len = NUM_ELEMENTS(fr_trunk_conn_trigger_names);
 
 static fr_table_num_ordered_t const fr_trunk_connection_states[] = {
-       { "INIT",                               FR_TRUNK_CONN_INIT              },
-       { "HALTED",                             FR_TRUNK_CONN_HALTED            },
-       { "CONNECTING",                         FR_TRUNK_CONN_CONNECTING        },
-       { "ACTIVE",                             FR_TRUNK_CONN_ACTIVE            },
-       { "CLOSED",                             FR_TRUNK_CONN_CLOSED            },
-       { "FULL",                               FR_TRUNK_CONN_FULL              },
-       { "INACTIVE",                           FR_TRUNK_CONN_INACTIVE          },
-       { "INACTIVE-DRAINING",                  FR_TRUNK_CONN_INACTIVE_DRAINING },
-       { "DRAINING",                           FR_TRUNK_CONN_DRAINING          },
-       { "DRAINING-TO-FREE",                   FR_TRUNK_CONN_DRAINING_TO_FREE  }
+       { "INIT",                               FR_TRUNK_CONN_INIT                      },
+       { "HALTED",                             FR_TRUNK_CONN_HALTED                    },
+       { "CONNECTING",                         FR_TRUNK_CONN_CONNECTING                },
+       { "ACTIVE",                             FR_TRUNK_CONN_ACTIVE                    },
+       { "CLOSED",                             FR_TRUNK_CONN_CLOSED                    },
+       { "FULL",                               FR_TRUNK_CONN_FULL                      },
+       { "INACTIVE",                           FR_TRUNK_CONN_INACTIVE                  },
+       { "INACTIVE-DRAINING",                  FR_TRUNK_CONN_INACTIVE_DRAINING         },
+       { "DRAINING",                           FR_TRUNK_CONN_DRAINING                  },
+       { "DRAINING-TO-FREE",                   FR_TRUNK_CONN_DRAINING_TO_FREE          }
 };
 static size_t fr_trunk_connection_states_len = NUM_ELEMENTS(fr_trunk_connection_states);
 
 static fr_table_num_ordered_t const fr_trunk_cancellation_reasons[] = {
-       { "FR_TRUNK_CANCEL_REASON_NONE",        FR_TRUNK_CANCEL_REASON_NONE     },
-       { "FR_TRUNK_CANCEL_REASON_SIGNAL",      FR_TRUNK_CANCEL_REASON_SIGNAL   },
-       { "FR_TRUNK_CANCEL_REASON_MOVE",        FR_TRUNK_CANCEL_REASON_MOVE     },
-       { "FR_TRUNK_CANCEL_REASON_REQUEUE",     FR_TRUNK_CANCEL_REASON_REQUEUE  }
+       { "FR_TRUNK_CANCEL_REASON_NONE",        FR_TRUNK_CANCEL_REASON_NONE             },
+       { "FR_TRUNK_CANCEL_REASON_SIGNAL",      FR_TRUNK_CANCEL_REASON_SIGNAL           },
+       { "FR_TRUNK_CANCEL_REASON_MOVE",        FR_TRUNK_CANCEL_REASON_MOVE             },
+       { "FR_TRUNK_CANCEL_REASON_REQUEUE",     FR_TRUNK_CANCEL_REASON_REQUEUE          }
 };
 static size_t fr_trunk_cancellation_reasons_len = NUM_ELEMENTS(fr_trunk_cancellation_reasons);
 
 static fr_table_num_ordered_t const fr_trunk_connection_events[] = {
-       { "FR_TRUNK_CONN_EVENT_NONE",           FR_TRUNK_CONN_EVENT_NONE        },
-       { "FR_TRUNK_CONN_EVENT_READ",           FR_TRUNK_CONN_EVENT_READ        },
-       { "FR_TRUNK_CONN_EVENT_WRITE",          FR_TRUNK_CONN_EVENT_WRITE       },
-       { "FR_TRUNK_CONN_EVENT_BOTH",           FR_TRUNK_CONN_EVENT_BOTH        },
+       { "FR_TRUNK_CONN_EVENT_NONE",           FR_TRUNK_CONN_EVENT_NONE                },
+       { "FR_TRUNK_CONN_EVENT_READ",           FR_TRUNK_CONN_EVENT_READ                },
+       { "FR_TRUNK_CONN_EVENT_WRITE",          FR_TRUNK_CONN_EVENT_WRITE               },
+       { "FR_TRUNK_CONN_EVENT_BOTH",           FR_TRUNK_CONN_EVENT_BOTH                },
 };
 static size_t fr_trunk_connection_events_len = NUM_ELEMENTS(fr_trunk_connection_events);
 
@@ -397,6 +419,13 @@ do { \
 void trunk_request_state_log_entry_add(char const *function, int line,
                                       fr_trunk_request_t *treq, fr_trunk_request_state_t new) CC_HINT(nonnull);
 
+#define REQUEST_TRIGGER(_state) do { \
+       if (trunk->pub.triggers) { \
+               trigger_exec(NULL, NULL, fr_table_str_by_value(fr_trunk_req_trigger_names, _state, \
+                                                              "<INVALID>"), true, NULL); \
+       } \
+} while (0)
+
 /** Record a request state transition and log appropriate output
  *
  */
@@ -408,6 +437,7 @@ do { \
               fr_table_str_by_value(fr_trunk_request_states, _new, "<INVALID>")); \
        trunk_request_state_log_entry_add(__FUNCTION__, __LINE__, treq, _new); \
        treq->pub.state = _new; \
+       REQUEST_TRIGGER(_new); \
 } while (0)
 #define REQUEST_BAD_STATE_TRANSITION(_new) \
 do { \