You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
proxysql/include/ConnectionPoolDecision.h

54 lines
1.8 KiB

/**
* @file ConnectionPoolDecision.h
* @brief Pure decision functions for connection pool create/reuse/evict logic.
*
* Extracted from get_random_MyConn() for unit testability. These functions
* have no global state dependencies.
*
* @see Phase 3.1 (GitHub issue #5489)
*/
#ifndef CONNECTION_POOL_DECISION_H
#define CONNECTION_POOL_DECISION_H
/**
* @brief Encodes the outcome of a connection-pool evaluation.
*/
struct ConnectionPoolDecision {
bool create_new_connection; ///< True if a new backend connection must be created.
bool evict_connections; ///< True if free connections should be evicted.
unsigned int num_to_evict; ///< Number of free connections to evict.
bool needs_warming; ///< True if warming threshold not reached.
};
/**
* @brief Calculate how many free connections to evict to stay within 75% of max.
*
* Eviction is triggered when (conns_free + conns_used) >= (3 * max_connections / 4).
* At least one connection is evicted when the threshold is crossed and conns_free > 0.
* When max_connections is 0, any free connections are subject to eviction since the
* 75% threshold is 0.
*
* @return Number of free connections to evict; 0 if eviction is not needed.
*/
unsigned int calculate_eviction_count(unsigned int conns_free, unsigned int conns_used, unsigned int max_connections);
/**
* @brief Decide whether new-connection creation should be throttled.
*/
bool should_throttle_connection_creation(unsigned int new_connections_now, unsigned int throttle_connections_per_sec);
/**
* @brief Pure decision function for connection-pool create-vs-reuse logic.
*/
ConnectionPoolDecision evaluate_pool_state(
unsigned int conns_free,
unsigned int conns_used,
unsigned int max_connections,
unsigned int connection_quality_level,
bool connection_warming,
int free_connections_pct
);
#endif // CONNECTION_POOL_DECISION_H