![]() |
The FreeRADIUS server $Id: f3670dba8951ca10eb4948feb3dc3db9423a334f $
|
Functions for pipelining commands. More...
#include <freeradius-devel/server/connection.h>#include <freeradius-devel/server/trunk.h>#include "pipeline.h"#include "cluster_async.h"#include "io.h"
Include dependency graph for pipeline.c:Go to the source code of this file.
Data Structures | |
| struct | fr_redis_command_s |
| Represents a single command. More... | |
| union | fr_redis_command_s.__unnamed77__ |
| struct | fr_redis_command_s.__unnamed77__.__unnamed79__ |
| struct | fr_redis_command_s.__unnamed77__.__unnamed81__ |
| struct | fr_redis_command_set_s |
| Represents a collection of pipelined commands. More... | |
| struct | fr_redis_trunk_s |
Macros | |
| #define | COMMAND_PRE_ALLOC_COUNT 8 |
| #define | COMMAND_PRE_ALLOC_LEN 64 |
Functions | |
| static int | _command_set_free_list_free_on_exit (void *arg) |
| Free any free requests when the thread is joined. | |
| static int | _redis_command_set_free (fr_redis_command_set_t *cmds) |
| Free a command set. | |
| static void | _redis_pipeline_command_set_cancel (connection_t *conn, void *preq, trunk_cancel_reason_t reason, UNUSED void *uctx) |
| Deal with cancellation of sent requests. | |
| static void | _redis_pipeline_command_set_complete (UNUSED request_t *request, void *preq, UNUSED void *rctx, UNUSED void *uctx) |
| Signal the API client that we got a complete set of responses to a command set. | |
| static void | _redis_pipeline_command_set_fail (UNUSED request_t *request, void *preq, UNUSED void *rctx, UNUSED trunk_request_state_t state, UNUSED void *uctx) |
| Signal the API client that we failed enqueuing the commands. | |
| static void | _redis_pipeline_command_set_free (UNUSED request_t *request, void *preq, UNUSED void *uctx) |
| Free the command set. | |
| static connection_t * | _redis_pipeline_connection_alloc (trunk_connection_t *tconn, fr_event_list_t *el, connection_conf_t const *conf, char const *log_prefix, void *uctx) |
| static void | _redis_pipeline_demux (struct redisAsyncContext *ac, void *vreply, void *privdata) |
| Callback for for receiving Redis replies. | |
| static void | _redis_pipeline_mux (UNUSED fr_event_list_t *el, trunk_connection_t *tconn, connection_t *conn, UNUSED void *uctx) |
| Enqueue one or more command sets onto a redis handle. | |
| static void | _redis_trunk_active (UNUSED trunk_t *trunk, UNUSED trunk_state_t prev, UNUSED trunk_state_t state, void *uctx) |
| fr_redis_pipeline_status_t | fr_redis_command_argv_add (fr_redis_command_set_t *cmds, size_t argc, char const **argv, size_t *argv_len, fr_redis_command_complete_t complete, void *rctx) |
| Add a command with arguments to the command set. | |
| char const * | fr_redis_command_get_cmd (fr_redis_command_t *cmd) |
| fr_redis_pipeline_status_t | fr_redis_command_literal_add (fr_redis_command_set_t *cmds, char const *cmd_str, fr_redis_command_complete_t complete, void *rctx) |
| Add a literal command to the command set. | |
| fr_redis_pipeline_status_t | fr_redis_command_preformatted_add (fr_redis_command_set_t *cmds, char const *cmd_str, size_t cmd_len, fr_redis_command_complete_t complete, void *rctx) |
| Add an preformatted command to the command set as formatted by redisCommandFormat or it's variants. | |
| fr_redis_command_set_t * | fr_redis_command_set_alloc (TALLOC_CTX *ctx, request_t *request, fr_redis_command_set_complete_t complete, fr_redis_command_set_fail_t fail, void *rctx, bool autofree) |
| Allocate a new command set. | |
| void | fr_redis_command_set_cancel (fr_redis_command_set_t *cmds) |
| Cancel a command set. | |
| int | fr_redis_command_set_clear (fr_redis_command_set_t *cmds) |
| void | fr_redis_command_set_next_node (fr_redis_command_set_t *cmds, fr_redis_io_conf_t *ioconf) |
| Extract the next node address and port from a command set. | |
| fr_redis_async_rcode_t | fr_redis_command_set_rcode (fr_redis_command_set_t *cmds) |
| Extract the rcode from a command set. | |
| int | fr_redis_command_set_reset (fr_redis_command_set_t *cmds) |
| Reset a command set to it's state before enqueuing. | |
| fr_redis_trunk_t * | fr_redis_trunk_alloc (fr_redis_ct_t *rtcluster, fr_redis_io_conf_t const *io_conf, fr_pair_list_t *trigger_args, fr_redis_trunk_active_t active, void *active_uctx, bool active_oneshot) |
| Allocate a new trunk. | |
| static int | redis_addr_from_redirect (TALLOC_CTX *ctx, char **addr, uint16_t *port, redisReply *redirect) |
| Convert a MOVED / ASK reply into an address and port. | |
| fr_redis_pipeline_status_t | redis_command_set_enqueue (fr_redis_trunk_t *rtrunk, fr_redis_command_set_t *cmds) |
| Enqueue a command set on a specific trunk. | |
| static fr_redis_pipeline_status_t | redis_command_transaction_check (request_t *request, fr_redis_command_type_t *type, fr_redis_command_set_t *cmds, char const *cmd) |
Variables | |
| static _Thread_local fr_dlist_head_t * | command_set_free_list |
| The thread local free list. | |
Functions for pipelining commands.
Definition in file pipeline.c.
| struct fr_redis_command_s |
Represents a single command.
Definition at line 62 of file pipeline.c.
Collaboration diagram for fr_redis_command_s:| Data Fields | ||
|---|---|---|
| union fr_redis_command_s.__unnamed77__ | __unnamed__ | |
| fr_redis_command_set_t * | cmds | Command set this entry belongs to. |
| fr_redis_command_complete_t | complete | Callback to process result from this command. |
| fr_dlist_t | entry | Entry in the command buffer. |
| fr_redis_command_fmt_t | fmt | Redis command format. |
| void * | rctx | To be passed to the callback. |
| uint64_t | sqn |
The sequence number of the command. This is only valid for a specific handle, and is unique within the handle. |
| fr_redis_command_type_t | type | Redis command type. |
| union fr_redis_command_s.__unnamed77__ |
Definition at line 69 of file pipeline.c.
| Data Fields | ||
|---|---|---|
| struct fr_redis_command_s.__unnamed77__.__unnamed79__ | __unnamed__ | |
| struct fr_redis_command_s.__unnamed77__.__unnamed81__ | __unnamed__ | |
| struct fr_redis_command_s.__unnamed77__.__unnamed79__ |
Definition at line 70 of file pipeline.c.
| Data Fields | ||
|---|---|---|
| char const * | str | The command string. |
| size_t | str_len | Length of the command string. |
| struct fr_redis_command_s.__unnamed77__.__unnamed81__ |
Definition at line 74 of file pipeline.c.
| Data Fields | ||
|---|---|---|
| size_t | argc | Number of argv arguments. |
| char const ** | argv | Arguments for the redis command. |
| size_t * | argv_len | Lengths of the arguments. |
| struct fr_redis_command_set_s |
Represents a collection of pipelined commands.
Commands MUST map to the same cluster node if using clustering.
Definition at line 94 of file pipeline.c.
Collaboration diagram for fr_redis_command_set_s:| Data Fields | ||
|---|---|---|
| bool | autofree | Should the command set be freed when it is complete. |
| bool | blocking |
This command set contains one or more commands which block the client (e.g. WAIT) |
| fr_redis_command_set_complete_t | complete |
Notify the creator of the command set that the command set has executed to to completion. We have results for all commands. |
| fr_dlist_head_t | completed | Commands complete with replies. |
| fr_dlist_t | entry | |
| fr_redis_command_set_fail_t | fail |
Notify the creator of the command set that the command set failed to execute to completion. Partial results will be available. |
| char * | next_node_ip | IP address of node from MOVED / ASK reply. |
| uint16_t | next_node_port | Port of node from MOVED / ASK reply. |
| fr_dlist_head_t | pending | Commands yet to be sent. |
| fr_redis_async_rcode_t | rcode | Code from last error returned. |
| void * | rctx | Resume context to write results to. |
| uint8_t | redirected | How many times this command set was redirected. |
| request_t * | request | Request this commands set is associated with (if any). |
| fr_dlist_head_t | sent | Commands sent. |
| trunk_request_t * | treq | Trunk request this command set is associated with. |
| uint16_t | txn_end | The number of times a transaction block ended in this command set. |
| uint16_t | txn_start | Number of times a transaction block was started in this command set. |
| bool | txn_watch | Transaction was started with a watch statement. |
| struct fr_redis_trunk_s |
Definition at line 160 of file pipeline.c.
Collaboration diagram for fr_redis_trunk_s:| Data Fields | ||
|---|---|---|
| fr_redis_trunk_active_t | active | Callback to run when the trunk becomes active. |
| void * | active_uctx | Uctx to pass to active callback. |
| fr_redis_io_conf_t const * | io_conf |
Redis I/O configuration. Specifies how to connect to the host this trunk is used to communicate with. |
| fr_redis_ct_t * | rtcluster | Cluster this trunk belongs to. |
| trunk_t * | trunk | Trunk containing all the connections to a specific host. |
| #define COMMAND_PRE_ALLOC_COUNT 8 |
| #define COMMAND_PRE_ALLOC_LEN 64 |
Definition at line 53 of file pipeline.c.
Definition at line 42 of file pipeline.c.
|
static |
Free any free requests when the thread is joined.
Definition at line 174 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Free a command set.
Definition at line 189 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Deal with cancellation of sent requests.
We can't actually signal redis to not process the request, so depending on why the commands were cancelled, we either tell the handle to ignore them, or move them back into the pending list.
Definition at line 825 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Signal the API client that we got a complete set of responses to a command set.
Definition at line 888 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Signal the API client that we failed enqueuing the commands.
Definition at line 900 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Free the command set.
Definition at line 913 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Definition at line 729 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Callback for for receiving Redis replies.
This is called by hiredis for each response is receives. privData is set to the fr_command_set
| [in] | ac | The async context the command was enqueued on. |
| [in] | vreply | redisReply containing the result of the command. |
| [in] | privdata | fr_redis_command_t that was sent to the Redis server. The fr_redis_command_t contains a pointer to the fr_redis_command_set_t which holds the treq which we use to signal that we have responses for all commands. |
Definition at line 623 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Enqueue one or more command sets onto a redis handle.
Because the trunk is in always writable mode, _redis_pipeline_mux will be called any time trunk_request_enqueue is called, so there'll only ever be one command to dequeue.
| [in] | el | Event list for trunk events. Unused. |
| [in] | tconn | Trunk connection holding the commands to enqueue. |
| [in] | conn | Connection handle containing the fr_redis_handle_t. |
| [in] | uctx | fr_redis_cluster_t. Unused. |
Definition at line 754 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
| fr_redis_pipeline_status_t fr_redis_command_argv_add | ( | fr_redis_command_set_t * | cmds, |
| size_t | argc, | ||
| char const ** | argv, | ||
| size_t * | argv_len, | ||
| fr_redis_command_complete_t | complete, | ||
| void * | rctx | ||
| ) |
Add a command with arguments to the command set.
The command and arguments must either be entirely static, or parented by the command set.
| [in] | cmds | Command set to add command to. |
| [in] | argc | Number of arguments. |
| [in] | argv | Redis command arguments. |
| [in] | argv_len | Length of the command arguments. |
| [in] | complete | Callback to run when this command completes |
| [in] | rctx | to pass to complete |
Definition at line 436 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:| char const * fr_redis_command_get_cmd | ( | fr_redis_command_t * | cmd | ) |
| fr_redis_pipeline_status_t fr_redis_command_literal_add | ( | fr_redis_command_set_t * | cmds, |
| char const * | cmd_str, | ||
| fr_redis_command_complete_t | complete, | ||
| void * | rctx | ||
| ) |
Add a literal command to the command set.
The command must either be entirely static, or parented by the command set.
| [in] | cmds | Command set to add command to. |
| [in] | cmd_str | A fully expanded/formatted command to send to redis. Must be static, or have the same lifetime as the command set (allocated with the command set as the parent). |
| [in] | complete | Callback to run when this command completes |
| [in] | rctx | to pass to complete |
Definition at line 401 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:| fr_redis_pipeline_status_t fr_redis_command_preformatted_add | ( | fr_redis_command_set_t * | cmds, |
| char const * | cmd_str, | ||
| size_t | cmd_len, | ||
| fr_redis_command_complete_t | complete, | ||
| void * | rctx | ||
| ) |
Add an preformatted command to the command set as formatted by redisCommandFormat or it's variants.
The command must either be entirely static, or parented by the command set.
| [in] | cmds | Command set to add command to. |
| [in] | cmd_str | A fully formatted command to send to redis. Must be static, or have the same lifetime as the command set (allocated with the command set as the parent). |
| [in] | cmd_len | The length of cmd_str (as returned by redisCommandForamt) |
| [in] | complete | Callback to run when this command completes |
| [in] | rctx | to pass to complete |
Definition at line 479 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:| fr_redis_command_set_t * fr_redis_command_set_alloc | ( | TALLOC_CTX * | ctx, |
| request_t * | request, | ||
| fr_redis_command_set_complete_t | complete, | ||
| fr_redis_command_set_fail_t | fail, | ||
| void * | rctx, | ||
| bool | autofree | ||
| ) |
Allocate a new command set.
This is a set of commands that the calling module wants to execute on the redis server in sequence.
Control will be returned to the caller via the registered complete and fail functions.
| [in] | ctx | to bind the command set's lifetime to. |
| [in] | request | to pass to places that need it. |
| [in] | complete | Function to call when all commands have been processed. |
| [in] | fail | Function to call if the command set was not executed or was partially executed. |
| [in] | rctx | Resume context to pass to complete and fail functions. |
| [in] | autofree | Should the command set be freed when completed. |
Definition at line 249 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:| void fr_redis_command_set_cancel | ( | fr_redis_command_set_t * | cmds | ) |
Cancel a command set.
| [in] | cmds | Command set to cancel. |
Definition at line 557 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:| int fr_redis_command_set_clear | ( | fr_redis_command_set_t * | cmds | ) |
Definition at line 1032 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:| void fr_redis_command_set_next_node | ( | fr_redis_command_set_t * | cmds, |
| fr_redis_io_conf_t * | ioconf | ||
| ) |
Extract the next node address and port from a command set.
Definition at line 997 of file pipeline.c.
Here is the caller graph for this function:| fr_redis_async_rcode_t fr_redis_command_set_rcode | ( | fr_redis_command_set_t * | cmds | ) |
Extract the rcode from a command set.
Definition at line 990 of file pipeline.c.
Here is the caller graph for this function:| int fr_redis_command_set_reset | ( | fr_redis_command_set_t * | cmds | ) |
Reset a command set to it's state before enqueuing.
For use when handling MOVED / ASK where the command set needs to be sent to another node.
Definition at line 1008 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:| fr_redis_trunk_t * fr_redis_trunk_alloc | ( | fr_redis_ct_t * | rtcluster, |
| fr_redis_io_conf_t const * | io_conf, | ||
| fr_pair_list_t * | trigger_args, | ||
| fr_redis_trunk_active_t | active, | ||
| void * | active_uctx, | ||
| bool | active_oneshot | ||
| ) |
Allocate a new trunk.
| [in] | rtcluster | to allocate the trunk for. |
| [in] | io_conf | Describing the connection to a single REDIS host. |
| [in] | trigger_args | Pairs to pass to trigger requests, if triggers are enabled. |
| [in] | active | Callback to run when the trunk becomes active. |
| [in] | active_uctx | Uctx to pass to active callback. |
| [in] | active_oneshot | Should the call back be run just once. |
Definition at line 941 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Convert a MOVED / ASK reply into an address and port.
Definition at line 566 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:| fr_redis_pipeline_status_t redis_command_set_enqueue | ( | fr_redis_trunk_t * | rtrunk, |
| fr_redis_command_set_t * | cmds | ||
| ) |
Enqueue a command set on a specific trunk.
The command set may be passed around several trunks before it is complete. This is to allow it to follow MOVED and ASK responses.
| [in] | rtrunk | to enqueue command set on. |
| [in] | cmds | Command set to enqueue. |
Definition at line 532 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Definition at line 301 of file pipeline.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
The thread local free list.
Any entries remaining in the list will be freed when the thread is joined
Definition at line 40 of file pipeline.c.
1.9.8