35#define HM_UPDATE_SEC (5)
38#define HM_WATHCHDOG_NAME ("_heartmonitor_")
44module AP_MODULE_DECLARE_DATA heartmonitor_module;
85 "Failed to create listening socket.");
92 "Failed to set APR_SO_REUSEADDR to 1 on socket.");
100 "Failed to set APR_SO_NONBLOCK to 1 on socket.");
107 "Failed to bind on socket.");
115 "Failed to join multicast group");
122 "Failed to accept localhost mulitcast on socket.");
166#define SEEN_TIMEOUT (30)
177 old->ready =
new->ready;
178 old->seen =
new->seen;
190 s->item_id =
old->id;
245 "Unable to open tmp file: %s",
path);
262 "Unable to read file: %s",
ctx->storage_path);
286 "Unable to read from file: %s",
ctx->storage_path);
303 if (!ip ||
buf[0] ==
'#') {
307 else if (
strcmp(ip,
s->ip) != 0 ) {
350 s->ip,
s->ready,
s->busy, (
unsigned int) seen,
s->port);
360 s->ip,
s->ready,
s->busy, (
unsigned int) seen,
s->port);
366 "Unable to flush file: %s",
path);
373 "Unable to close file: %s",
path);
382 "Unable to set file permissions on %s",
391 "Unable to move file: %s -> %s",
path,
419 "Unable to open tmp file: %s",
path);
438 s->ip,
s->ready,
s->busy, (
unsigned int) seen,
s->port);
445 "Unable to flush file: %s",
path);
452 "Unable to close file: %s",
path);
461 "Unable to set file permissions on %s",
470 "Unable to move file: %s -> %s",
path,
550 "%pI busy=%s ready=%s", from,
566 "malformed message from %pI",
572#define MAX_MSG_LEN (1000)
615 "Unable to listen for connections!");
618 ctx->keep_running = 1;
620 "%s listener started.",
648 if (!
ctx->keep_running) {
661 "stopping %s listener.",
664 ctx->keep_running = 0;
679 &heartmonitor_module);
687 "mod_watchdog is required");
699 "failed to lookup provider 'shm' for '%s', "
700 "maybe you need to load mod_slotmem_shm?",
707 "slotmem_create for status failed");
721 "Failed to create watchdog instance (%s)",
732 "Failed to register watchdog callback (%s)",
761 &heartmonitor_module);
795 static const char *
const aszSucc[]={
"mod_proxy.c",
NULL };
819 void *dconf,
const char *
path)
824 &heartmonitor_module);
837 void *dconf,
const char *mcast_addr)
846 &heartmonitor_module);
857 return "HeartbeatListen: May only be specified once.";
863 return "HeartbeatListen: Unable to parse multicast address.";
867 return "HeartbeatListen: No host provided in multicast address";
871 return "HeartbeatListen: No port provided in multicast address";
879 "HeartbeatListen: apr_sockaddr_info_get failed on multicast address";
886 void *dconf,
const char *
data)
896 return "HeartbeatMaxServers: Should be 0 for file storage, "
897 "or greater or equal than 10 for slotmem";
904 "Address to listen for heartbeat requests"),
906 "Path to store heartbeat data."),
908 "Max number of servers when using slotmem (instead file) to store heartbeat data."),
Apache Multi-Processing Module library.
const char apr_size_t len
Memory Slot Extension Storage Module for Apache.
#define AP_INIT_TAKE1(directive, func, mconfig, where, help)
char * ap_runtime_dir_relative(apr_pool_t *p, const char *fname)
#define ap_get_module_config(v, m)
void ap_hook_post_config(ap_HOOK_post_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_DECLARE_MODULE(foo)
void ap_hook_handler(ap_HOOK_handler_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
request_rec int int apr_table_t const char * path
apr_status_t ap_get_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes)
int ap_state_query(int query_code)
#define AP_SQ_MS_CREATE_CONFIG
const unsigned char * buf
int int ap_rflush(request_rec *r)
int ap_map_http_request_error(apr_status_t rv, int status)
void ap_set_content_length(request_rec *r, apr_off_t length)
static APR_INLINE int ap_rputs(const char *str, request_rec *r)
void ap_set_content_type_ex(request_rec *r, const char *ct, int trusted)
void * ap_lookup_provider(const char *provider_group, const char *provider_name, const char *provider_version)
const char apr_port_t port
#define APR_STATUS_IS_EAGAIN(s)
#define APR_BRIGADE_EMPTY(b)
apr_brigade_flush void * ctx
const char *const const char *const * aszSucc
#define APR_RETRIEVE_OPTIONAL_FN(name)
#define APR_OPTIONAL_FN_TYPE(name)
#define DEFAULT_HEARTBEAT_STORAGE
#define HTTP_METHOD_NOT_ALLOWED
#define AP_SLOTMEM_PROVIDER_GROUP
#define AP_SLOTMEM_TYPE_PREGRAB
#define AP_SLOTMEM_PROVIDER_VERSION
#define AP_WATCHDOG_STATE_STARTING
#define AP_WATCHDOG_STATE_STOPPING
#define AP_WATCHDOG_STATE_RUNNING
#define STANDARD20_MODULE_STUFF
int ap_unescape_url(char *url)
const char * ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden)
const char int apr_pool_t * pool
#define APR_HASH_KEY_STRING
#define apr_pool_create(newpool, parent)
#define apr_pcalloc(p, size)
apr_int32_t apr_int32_t apr_int32_t err
apr_int64_t apr_interval_time_t
#define apr_time_sec(time)
#define apr_time_from_sec(sec)
commun structures for mod_heartmonitor.c and mod_lbmethod_heartbeat.c
static apr_status_t hm_recv(hm_ctx_t *ctx, apr_pool_t *p)
static const char * cmd_hm_storage(cmd_parms *cmd, void *dconf, const char *path)
static void qs_to_table(const char *input, apr_table_t *parms, apr_pool_t *p)
static void hm_processmsg(hm_ctx_t *ctx, apr_pool_t *p, apr_sockaddr_t *from, char *buf, apr_size_t len)
static apr_status_t hm_update_stats(hm_ctx_t *ctx, apr_pool_t *p)
static apr_status_t hm_slotmem_update_stats(hm_ctx_t *ctx, apr_pool_t *p)
static hm_server_t * hm_get_server(hm_ctx_t *ctx, const char *ip, const int port)
#define HM_WATHCHDOG_NAME
static apr_status_t hm_update_stat(hm_ctx_t *ctx, hm_server_t *s, apr_pool_t *pool)
static int hm_handler(request_rec *r)
static const char * cmd_hm_maxworkers(cmd_parms *cmd, void *dconf, const char *data)
static const ap_slotmem_provider_t * storage
static const command_rec hm_cmds[]
static int hm_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
static apr_status_t hm_slotmem_remove_stat(hm_server_t *s, apr_pool_t *pool)
static apr_status_t hm_file_update_stat(hm_ctx_t *ctx, hm_server_t *s, apr_pool_t *pool)
static void hm_register_hooks(apr_pool_t *p)
static const char * cmd_hm_listen(cmd_parms *cmd, void *dconf, const char *mcast_addr)
static apr_status_t hm_watchdog_callback(int state, void *data, apr_pool_t *pool)
static void * hm_create_config(apr_pool_t *p, server_rec *s)
static apr_status_t hm_readid(void *mem, void *data, apr_pool_t *p)
static apr_status_t hm_slotmem_update_stat(hm_server_t *s, apr_pool_t *pool)
static ap_slotmem_instance_t * slotmem
static apr_status_t hm_file_update_stats(hm_ctx_t *ctx, apr_pool_t *p)
static apr_status_t hm_update(void *mem, void *data, apr_pool_t *p)
static apr_status_t hm_listen(hm_ctx_t *ctx)
static apr_status_t ap_watchdog_register_callback(ap_watchdog_t *w, apr_interval_time_t interval, const void *data, ap_watchdog_callback_fn_t *callback)
static apr_status_t ap_watchdog_get_instance(ap_watchdog_t **watchdog, const char *name, int parent, int singleton, apr_pool_t *p)
Watchdog module for Apache.
Apache scoreboard library.
apr_status_t(* create)(ap_slotmem_instance_t **inst, const char *name, apr_size_t item_size, unsigned int item_num, ap_slotmem_type_t type, apr_pool_t *pool)
apr_status_t(* doall)(ap_slotmem_instance_t *s, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool)
apr_status_t(* put)(ap_slotmem_instance_t *slot, unsigned int item_id, unsigned char *src, apr_size_t src_len)
apr_status_t(* release)(ap_slotmem_instance_t *s, unsigned int item_id)
apr_status_t(* grab)(ap_slotmem_instance_t *s, unsigned int *item_id)
apr_sockaddr_t * client_addr
struct apr_bucket_alloc_t * bucket_alloc
volatile int keep_running
apr_interval_time_t interval
apr_sockaddr_t * mcast_addr
const char * storage_path
A structure that represents the current request.
struct ap_filter_t * input_filters
A structure to store information for each virtual server.
struct ap_conf_vector_t * module_config
apr_status_t apr_socket_recvfrom(apr_sockaddr_t *from, apr_socket_t *sock, apr_int32_t flags, char *buf, apr_size_t *len)
apr_status_t apr_socket_bind(apr_socket_t *sock, apr_sockaddr_t *sa)
apr_status_t apr_socket_close(apr_socket_t *thesocket)
apr_status_t apr_socket_create(apr_socket_t **new, int ofamily, int type, int protocol, apr_pool_t *cont)
apr_status_t apr_socket_opt_set(apr_socket_t *sock, apr_int32_t opt, apr_int32_t on)