native/common/jk_shm.h (126 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/***************************************************************************
* Description: Shared Memory object header file *
* Author: Mladen Turk <mturk@jboss.com> *
* Author: Rainer Jung <rjung@apache.org> *
***************************************************************************/
#ifndef _JK_SHM_H
#define _JK_SHM_H
#include "jk_global.h"
#include "jk_pool.h"
#include "jk_util.h"
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/**
* @file jk_shm.h
* @brief Jk shared memory management
*
*
*/
#define JK_SHM_MAJOR '1'
#define JK_SHM_MINOR '3'
#define JK_SHM_STR_SIZ (JK_ALIGN(JK_MAX_NAME_LEN + 1, 8))
#define JK_SHM_MAGIC '!', 'J', 'K', 'S', 'H', 'M', JK_SHM_MAJOR, JK_SHM_MINOR
#define JK_SHM_MAGIC_SIZ 8
/* XXX: Check if adding struct members for overflow */
#define JK_SHM_SLOT_SIZE 384
/* Really huge numbers, but 64 workers should be enough */
#define JK_SHM_DEF_WORKERS 64
#define JK_SHM_ALIGNMENT JK_SHM_SLOT_SIZE
#define JK_SHM_ALIGN(x) JK_ALIGN((x), JK_SHM_ALIGNMENT)
#define JK_SHM_MIN_SIZE ((JK_SHM_SLOT_SIZE * JK_SHM_DEF_WORKERS * 3) + \
JK_SHM_ALIGNMENT)
typedef char shm_str[JK_SHM_STR_SIZ];
/** jk shm generic worker record structure */
struct jk_shm_worker_header
{
/* Shared memory slot id */
int id;
/* JK_XXX_WORKER_TYPE */
int type;
/* worker name */
shm_str name;
/* parent slot id.
* Zero in case worker does not belong to balancer.
*/
int parent_id;
/* Sequence counter starting at 0 and increasing
* every time we change the config.
*/
volatile unsigned int sequence;
};
typedef struct jk_shm_worker_header jk_shm_worker_header_t;
/** jk shm ajp13/ajp14 worker record structure */
struct jk_shm_ajp_worker
{
jk_shm_worker_header_t h;
shm_str host;
int port;
volatile int addr_sequence;
/* Configuration data mirrored from ajp_worker */
int cache_timeout;
int connect_timeout;
int ping_timeout;
int reply_timeout;
int prepost_timeout;
unsigned int recovery_opts;
int retries;
int retry_interval;
int busy_limit;
unsigned int max_packet_size;
/* current error state (runtime) of the worker */
volatile int state;
/* Statistical data */
/* Number of currently connected channels */
volatile int connected;
/* Maximum number of connected channels */
volatile int max_connected;
/* Number of currently busy channels */
volatile int busy;
/* Maximum number of busy channels */
volatile int max_busy;
volatile time_t error_time;
/* Number of bytes read from remote */
volatile jk_uint64_t readed;
/* Number of bytes transferred to remote */
volatile jk_uint64_t transferred;
/* Number of times the worker was used */
volatile jk_uint64_t used;
/* Number of times the worker was used - snapshot during maintenance */
volatile jk_uint64_t used_snapshot;
/* Number of non 200 responses */
volatile jk_uint32_t errors;
/* Decayed number of reply_timeout errors */
volatile jk_uint32_t reply_timeouts;
/* Number of client errors */
volatile jk_uint32_t client_errors;
/* Last reset time */
volatile time_t last_reset;
volatile time_t last_maintain_time;
};
typedef struct jk_shm_ajp_worker jk_shm_ajp_worker_t;
/** jk shm lb sub worker record structure */
struct jk_shm_lb_sub_worker
{
jk_shm_worker_header_t h;
/* route */
shm_str route;
/* worker domain */
shm_str domain;
/* worker redirect route */
shm_str redirect;
/* worker distance */
volatile int distance;
/* current activation state (config) of the worker */
volatile int activation;
/* current error state (runtime) of the worker */
volatile int state;
/* Current lb factor */
volatile int lb_factor;
/* Current lb reciprocal factor */
volatile jk_uint64_t lb_mult;
/* Current lb value */
volatile jk_uint64_t lb_value;
/* First consecutive error time */
volatile time_t first_error_time;
/* Last consecutive error time */
volatile time_t last_error_time;
/* Number of times the worker was elected - snapshot during maintenance */
volatile jk_uint64_t elected_snapshot;
/* Number of non-sticky requests handled, that were not marked as stateless */
volatile jk_uint64_t sessions;
/* Number of non 200 responses */
volatile jk_uint32_t errors;
};
typedef struct jk_shm_lb_sub_worker jk_shm_lb_sub_worker_t;
/** jk shm lb worker record structure */
struct jk_shm_lb_worker
{
jk_shm_worker_header_t h;
/* Number of currently busy channels */
volatile int busy;
/* Maximum number of busy channels */
volatile int max_busy;
int sticky_session;
int sticky_session_force;
int recover_wait_time;
int error_escalation_time;
int max_reply_timeouts;
int retries;
int retry_interval;
int lbmethod;
int lblock;
unsigned int max_packet_size;
/* Last reset time */
volatile time_t last_reset;
volatile time_t last_maintain_time;
};
typedef struct jk_shm_lb_worker jk_shm_lb_worker_t;
int jk_shm_str_init(shm_str dst, const char *src,
const char *name, jk_log_context_t *l);
int jk_shm_str_init_ne(shm_str dst, const char *src,
const char *name, jk_log_context_t *l);
void jk_shm_str_copy(shm_str dst, shm_str src,
jk_log_context_t *l);
const char *jk_shm_name(void);
/* Calculate needed shm size */
int jk_shm_calculate_size(jk_map_t *init_data, jk_log_context_t *log_ctx);
/* Open the shared memory creating file if needed
*/
int jk_shm_open(const char *fname, int sz, jk_log_context_t *log_ctx);
/* Close the shared memory
*/
void jk_shm_close(jk_log_context_t *log_ctx);
/* Attach the shared memory in child process.
* File has to be opened in parent.
*/
int jk_shm_attach(const char *fname, int sz, jk_log_context_t *log_ctx);
/* allocate shm ajp worker record
* If there is no shm present the pool will be used instead
*/
jk_shm_ajp_worker_t *jk_shm_alloc_ajp_worker(jk_pool_t *p, const char *name,
jk_log_context_t *log_ctx);
/* allocate shm lb sub worker record
* If there is no shm present the pool will be used instead
*/
jk_shm_lb_sub_worker_t *jk_shm_alloc_lb_sub_worker(jk_pool_t *p,
int lb_id, const char *name,
jk_log_context_t *log_ctx);
/* allocate shm lb worker record
* If there is no shm present the pool will be used instead
*/
jk_shm_lb_worker_t *jk_shm_alloc_lb_worker(jk_pool_t *p, const char *name,
jk_log_context_t *log_ctx);
int jk_shm_check_maintain(time_t trigger);
/* Lock shared memory for thread safe access */
int jk_shm_lock(void);
/* Unlock shared memory for thread safe access */
int jk_shm_unlock(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _JK_SHM_H */