From: Arran Cudbard-Bell Date: Sun, 19 Apr 2020 01:56:08 +0000 (-0500) Subject: trunk: Add triggers for request state transitions in debug builds X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e3c696f4fc39128ea9433911ff89b97514d94b0;p=thirdparty%2Ffreeradius-server.git trunk: Add triggers for request state transitions in debug builds --- diff --git a/src/lib/server/trunk.c b/src/lib/server/trunk.c index b80356a46b6..2dc9f029854 100644 --- a/src/lib/server/trunk.c +++ b/src/lib/server/trunk.c @@ -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, \ + ""), 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, "")); \ 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 { \