Signed-off-by: Steven Dake <sdake@xxxxxxxxxx> --- TODO | 5 +- corosync.spec.in | 1 - exec/apidef.c | 1 - exec/apidef.h | 2 +- exec/evil.c | 2 +- exec/main.h | 2 +- exec/mainconfig.h | 2 +- exec/service.c | 1 - exec/vsf_quorum.c | 2 +- exec/vsf_ykd.c | 2 +- include/Makefile.am | 5 +- include/corosync/coroapi.h | 469 +++++++++++++++++++++++++++++++++++++ include/corosync/engine/coroapi.h | 469 ------------------------------------- services/cfg.c | 2 +- services/cmap.c | 2 +- services/cpg.c | 2 +- services/evs.c | 2 +- services/mon.c | 2 +- services/pload.c | 2 +- services/testquorum.c | 2 +- services/votequorum.c | 2 +- services/wd.c | 2 +- 22 files changed, 489 insertions(+), 492 deletions(-) create mode 100644 include/corosync/coroapi.h delete mode 100644 include/corosync/engine/coroapi.h diff --git a/TODO b/TODO index 6fdc5ec..e1e8a4d 100644 --- a/TODO +++ b/TODO @@ -10,9 +10,8 @@ Current priority list for Needle 2.0 -------------------------------------- 1. quorum debugging and rework -2. remove external plug-in api -3. allow a cluster name to autogenerate a mcastaddr -4. ring status change via corosync-notifyd +2. allow a cluster name to autogenerate a mcastaddr +3. ring status change via corosync-notifyd -------------------------------------- Current priority list for Needle 2.1 diff --git a/corosync.spec.in b/corosync.spec.in index 36956fd..7e314ec 100644 --- a/corosync.spec.in +++ b/corosync.spec.in @@ -294,7 +294,6 @@ The Corosync Cluster Engine APIs. %{_includedir}/corosync/lcr/lcr_ifact.h %dir %{_includedir}/corosync/engine %{_includedir}/corosync/engine/config.h -%{_includedir}/corosync/engine/coroapi.h %{_includedir}/corosync/engine/icmap.h %{_includedir}/corosync/engine/quorum.h %{_libdir}/libcfg.so diff --git a/exec/apidef.c b/exec/apidef.c index 795b594..6e14e55 100644 --- a/exec/apidef.c +++ b/exec/apidef.c @@ -54,7 +54,6 @@ #include "schedwrk.h" #include "main.h" #include "apidef.h" -#include <corosync/engine/coroapi.h> #include "service.h" LOGSYS_DECLARE_SUBSYS ("APIDEF"); diff --git a/exec/apidef.h b/exec/apidef.h index efb72ca..299270c 100644 --- a/exec/apidef.h +++ b/exec/apidef.h @@ -35,7 +35,7 @@ #ifndef APIDEF_H_DEFINED #define APIDEF_H_DEFINED -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> extern struct corosync_api_v1 *apidef_get (void); diff --git a/exec/evil.c b/exec/evil.c index ba4bde9..092f55d 100644 --- a/exec/evil.c +++ b/exec/evil.c @@ -71,7 +71,7 @@ #include <corosync/list.h> #include <corosync/lcr/lcr_ifact.h> #include <corosync/config.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/logsys.h> #include <qb/qbipcs.h> #include "sync.h" diff --git a/exec/main.h b/exec/main.h index 91a2706..ad73d87 100644 --- a/exec/main.h +++ b/exec/main.h @@ -49,7 +49,7 @@ #include <qb/qbloop.h> #include <corosync/totem/totempg.h> #include <corosync/engine/config.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> extern unsigned long long *(*main_clm_get_by_nodeid) (unsigned int node_id); diff --git a/exec/mainconfig.h b/exec/mainconfig.h index 3de7a7e..2d5c552 100644 --- a/exec/mainconfig.h +++ b/exec/mainconfig.h @@ -37,7 +37,7 @@ #include <corosync/logsys.h> #include <corosync/list.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> /** * All service handlers in the AIS diff --git a/exec/service.c b/exec/service.c index a7be311..1425bac 100644 --- a/exec/service.c +++ b/exec/service.c @@ -52,7 +52,6 @@ #include <corosync/totem/totempg.h> #include <corosync/totem/totemip.h> #include "main.h" -#include <corosync/engine/coroapi.h> #include "service.h" #include <qb/qbipcs.h> diff --git a/exec/vsf_quorum.c b/exec/vsf_quorum.c index 79bea03..99ccda4 100644 --- a/exec/vsf_quorum.c +++ b/exec/vsf_quorum.c @@ -64,7 +64,7 @@ #include <corosync/lcr/lcr_comp.h> #include <corosync/lcr/lcr_ifact.h> #include <corosync/mar_gen.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/logsys.h> #include <corosync/engine/quorum.h> #include <corosync/engine/icmap.h> diff --git a/exec/vsf_ykd.c b/exec/vsf_ykd.c index f8cdd04..f9012be 100644 --- a/exec/vsf_ykd.c +++ b/exec/vsf_ykd.c @@ -60,7 +60,7 @@ #include <corosync/corotypes.h> #include <qb/qbipc_common.h> #include <corosync/mar_gen.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/engine/quorum.h> #include <corosync/swab.h> #include <corosync/lcr/lcr_comp.h> diff --git a/include/Makefile.am b/include/Makefile.am index a36cfc0..a8fbaca 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -36,11 +36,12 @@ CS_H = hdb.h cs_config.h cpg.h cfg.h evs.h mar_gen.h swab.h \ list.h corotypes.h quorum.h votequorum.h sam.h cmap.h CS_INTERNAL_H = ipc_cfg.h ipc_cpg.h ipc_evs.h ipc_pload.h ipc_quorum.h \ - jhash.h pload.h quorum.h sq.h ipc_votequorum.h ipc_cmap.h logsys.h + jhash.h pload.h quorum.h sq.h ipc_votequorum.h ipc_cmap.h \ + logsys.h coroapi.h LCR_H = lcr_ckpt.h lcr_comp.h lcr_ifact.h -ENGINE_H = config.h coroapi.h quorum.h icmap.h +ENGINE_H = config.h quorum.h icmap.h TOTEM_H = totem.h totemip.h totempg.h diff --git a/include/corosync/coroapi.h b/include/corosync/coroapi.h new file mode 100644 index 0000000..fa6a510 --- /dev/null +++ b/include/corosync/coroapi.h @@ -0,0 +1,469 @@ +/* + * Copyright (c) 2008, 2009 Red Hat, Inc. + * + * All rights reserved. + * + * Author: Steven Dake (sdake@xxxxxxxxxx) + * + * This software licensed under BSD license, the text of which follows: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of the MontaVista Software, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef COROAPI_H_DEFINED +#define COROAPI_H_DEFINED + +#include <stdio.h> +#ifdef COROSYNC_BSD +#include <sys/uio.h> +#endif +#include <corosync/hdb.h> +#include <qb/qbloop.h> +#include <corosync/swab.h> + +typedef struct { + uint32_t nodeid __attribute__((aligned(8))); + void *conn __attribute__((aligned(8))); +} mar_message_source_t __attribute__((aligned(8))); + +static inline void swab_mar_message_source_t (mar_message_source_t *to_swab) +{ + swab32 (to_swab->nodeid); + /* + * if it is from a byteswapped machine, then we can safely + * ignore its conn info data structure since this is only + * local to the machine + */ + to_swab->conn = NULL; +} + +#ifndef TIMER_HANDLE_T +typedef qb_loop_timer_handle corosync_timer_handle_t; +#define TIMER_HANDLE_T 1 +#endif + +struct corosync_tpg_group { + const void *group; + size_t group_len; +}; + +#define TOTEMIP_ADDRLEN (sizeof(struct in6_addr)) + +#define INTERFACE_MAX 2 + +#ifndef MESSAGE_QUEUE_MAX +#ifdef HAVE_SMALL_MEMORY_FOOTPRINT +#define PROCESSOR_COUNT_MAX 16 +#define MESSAGE_SIZE_MAX 1024*64 +#define MESSAGE_QUEUE_MAX 512 +#else +#define PROCESSOR_COUNT_MAX 384 +#define MESSAGE_SIZE_MAX 1024*1024 +#define MESSAGE_QUEUE_MAX ((4 * MESSAGE_SIZE_MAX) / totem_config->net_mtu) +#endif /* HAVE_SMALL_MEMORY_FOOTPRINT */ +#endif /* MESSAGE_QUEUE_MAX */ + +#define TOTEM_AGREED 0 +#define TOTEM_SAFE 1 + +#define MILLI_2_NANO_SECONDS 1000000ULL + +#if !defined(TOTEM_IP_ADDRESS) +struct totem_ip_address { + unsigned int nodeid; + unsigned short family; + unsigned char addr[TOTEMIP_ADDRLEN]; +} __attribute__((packed)); +#endif + +#if !defined(MEMB_RING_ID) +struct memb_ring_id { + struct totem_ip_address rep; + unsigned long long seq; +} __attribute__((packed)); +#endif + +#if !defined(TOTEM_CONFIGURATION_TYPE) +enum totem_configuration_type { + TOTEM_CONFIGURATION_REGULAR, + TOTEM_CONFIGURATION_TRANSITIONAL +}; +#endif + +#if !defined(TOTEM_CALLBACK_TOKEN_TYPE) +enum totem_callback_token_type { + TOTEM_CALLBACK_TOKEN_RECEIVED = 1, + TOTEM_CALLBACK_TOKEN_SENT = 2 +}; +#endif + +enum cs_lib_flow_control { + CS_LIB_FLOW_CONTROL_REQUIRED = 1, + CS_LIB_FLOW_CONTROL_NOT_REQUIRED = 2 +}; +#define corosync_lib_flow_control cs_lib_flow_control +#define COROSYNC_LIB_FLOW_CONTROL_REQUIRED CS_LIB_FLOW_CONTROL_REQUIRED +#define COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED CS_LIB_FLOW_CONTROL_NOT_REQUIRED + +enum cs_lib_allow_inquorate { + CS_LIB_DISALLOW_INQUORATE = 0, /* default */ + CS_LIB_ALLOW_INQUORATE = 1 +}; + +#if !defined (COROSYNC_FLOW_CONTROL_STATE) +enum cs_flow_control_state { + CS_FLOW_CONTROL_STATE_DISABLED, + CS_FLOW_CONTROL_STATE_ENABLED +}; +#define corosync_flow_control_state cs_flow_control_state +#define CS_FLOW_CONTROL_STATE_DISABLED CS_FLOW_CONTROL_STATE_DISABLED +#define CS_FLOW_CONTROL_STATE_ENABLED CS_FLOW_CONTROL_STATE_ENABLED + +#endif /* COROSYNC_FLOW_CONTROL_STATE */ + +enum cs_sync_mode { + CS_SYNC_V1 = 0, + CS_SYNC_V2 = 1, + CS_SYNC_V1_APIV2 = 2 +}; + +typedef enum { + COROSYNC_FATAL_ERROR_EXIT = -1, + COROSYNC_LIBAIS_SOCKET = -6, + COROSYNC_LIBAIS_BIND = -7, + COROSYNC_READKEY = -8, + COROSYNC_INVALID_CONFIG = -9, + COROSYNC_DYNAMICLOAD = -12, + COROSYNC_OUT_OF_MEMORY = -15, + COROSYNC_FATAL_ERR = -16 +} cs_fatal_error_t; +#define corosync_fatal_error_t cs_fatal_error_t; + +#ifndef QUORUM_H_DEFINED +typedef void (*quorum_callback_fn_t) (int quorate, void *context); + +struct quorum_callin_functions +{ + int (*quorate) (void); + int (*register_callback) (quorum_callback_fn_t callback_fn, void *context); + int (*unregister_callback) (quorum_callback_fn_t callback_fn, void *context); +}; + +typedef void (*sync_callback_fn_t) ( + const unsigned int *view_list, + size_t view_list_entries, + int primary_designated, + struct memb_ring_id *ring_id); + +#endif /* QUORUM_H_DEFINED */ + +struct corosync_api_v1 { + /* + * Time and timer APIs + */ + int (*timer_add_duration) ( + unsigned long long nanoseconds_in_future, + void *data, + void (*timer_nf) (void *data), + corosync_timer_handle_t *handle); + + int (*timer_add_absolute) ( + unsigned long long nanoseconds_from_epoch, + void *data, + void (*timer_fn) (void *data), + corosync_timer_handle_t *handle); + + void (*timer_delete) ( + corosync_timer_handle_t timer_handle); + + unsigned long long (*timer_time_get) (void); + + unsigned long long (*timer_expire_time_get) ( + corosync_timer_handle_t timer_handle); + + /* + * IPC APIs + */ + void (*ipc_source_set) (mar_message_source_t *source, void *conn); + + int (*ipc_source_is_local) (const mar_message_source_t *source); + + void *(*ipc_private_data_get) (void *conn); + + int (*ipc_response_send) (void *conn, const void *msg, size_t mlen); + + int (*ipc_response_iov_send) (void *conn, + const struct iovec *iov, unsigned int iov_len); + + int (*ipc_dispatch_send) (void *conn, const void *msg, size_t mlen); + + int (*ipc_dispatch_iov_send) (void *conn, + const struct iovec *iov, unsigned int iov_len); + + void (*ipc_refcnt_inc) (void *conn); + + void (*ipc_refcnt_dec) (void *conn); + + /* + * Totem APIs + */ + unsigned int (*totem_nodeid_get) (void); + + int (*totem_family_get) (void); + + int (*totem_ring_reenable) (void); + + int (*totem_mcast) (const struct iovec *iovec, + unsigned int iov_len, unsigned int guarantee); + + int (*totem_ifaces_get) ( + unsigned int nodeid, + struct totem_ip_address *interfaces, + char ***status, + unsigned int *iface_count); + + const char *(*totem_ifaces_print) (unsigned int nodeid); + + const char *(*totem_ip_print) (const struct totem_ip_address *addr); + + int (*totem_crypto_set) (unsigned int type); + + int (*totem_callback_token_create) ( + void **handle_out, + enum totem_callback_token_type type, + int delete, + int (*callback_fn) (enum totem_callback_token_type type, + const void *), + const void *data); + + /* + * Totem open process groups API for those service engines + * wanting their own groups + */ + int (*tpg_init) ( + void **instance, + + void (*deliver_fn) ( + unsigned int nodeid, + const void *msg, + unsigned int msg_len, + int endian_conversion_required), + + void (*confchg_fn) ( + enum totem_configuration_type configuration_type, + const unsigned int *member_list, + size_t member_list_entries, + const unsigned int *left_list, + size_t left_list_entries, + const unsigned int *joined_list, + size_t joined_list_entries, + const struct memb_ring_id *ring_id)); + + int (*tpg_exit) ( + void *instance); + + int (*tpg_join) ( + void *instance, + const struct corosync_tpg_group *groups, + size_t group_cnt); + + int (*tpg_leave) ( + void *instance, + const struct corosync_tpg_group *groups, + size_t group_cnt); + + int (*tpg_joined_mcast) ( + void *totempg_groups_instance, + const struct iovec *iovec, + unsigned int iov_len, + int guarantee); + + int (*tpg_joined_reserve) ( + void *totempg_groups_instance, + const struct iovec *iovec, + unsigned int iov_len); + + int (*tpg_joined_release) ( + int reserved_msgs); + + int (*tpg_groups_mcast) ( + void *instance, + int guarantee, + const struct corosync_tpg_group *groups, + size_t groups_cnt, + const struct iovec *iovec, + unsigned int iov_len); + + int (*tpg_groups_reserve) ( + void *instance, + const struct corosync_tpg_group *groups, + size_t groups_cnt, + const struct iovec *iovec, + unsigned int iov_len); + + int (*tpg_groups_release) ( + int reserved_msgs); + + int (*schedwrk_create) ( + hdb_handle_t *handle, + int (schedwrk_fn) (const void *), + const void *context); + + void (*schedwrk_destroy) (hdb_handle_t handle); + + int (*sync_request) ( + const char *service_name); + + /* + * User plugin-callable functions for quorum + */ + int (*quorum_is_quorate) (void); + int (*quorum_register_callback) (quorum_callback_fn_t callback_fn, void *context); + int (*quorum_unregister_callback) (quorum_callback_fn_t callback_fn, void *context); + + /* + * This one is for the quorum management plugin's use + */ + int (*quorum_initialize)(struct quorum_callin_functions *fns); + + /* + * Plugin loading and unloading + */ + int (*plugin_interface_reference) ( + hdb_handle_t *handle, + const char *iface_name, + int version, + void **interface, + void *context); + + int (*plugin_interface_release) (hdb_handle_t handle); + + /* + * Service loading and unloading APIs + */ + unsigned int (*service_link_and_init) ( + struct corosync_api_v1 *corosync_api_v1, + const char *service_name, + unsigned int service_ver); + + unsigned int (*service_unlink_and_exit) ( + struct corosync_api_v1 *corosync_api_v1, + const char *service_name, + unsigned int service_ver); + + /* + * Error handling APIs + */ + void (*error_memory_failure) (void) __attribute__ ((noreturn)); + +#define corosync_fatal_error(err) api->fatal_error ((err), __FILE__, __LINE__) + void (*fatal_error) (cs_fatal_error_t err, + const char *file, + unsigned int line) __attribute__ ((noreturn)); + + void (*shutdown_request) (void); + + void (*state_dump) (void); + + qb_loop_t *(*poll_handle_get) (void); + + void *(*totem_get_stats)(void); + + int (*schedwrk_create_nolock) ( + hdb_handle_t *handle, + int (schedwrk_fn) (const void *), + const void *context); + + int (*poll_dispatch_add) (qb_loop_t * handle, + int fd, + int events, + void *data, + + int (*dispatch_fn) (int fd, + int revents, + void *data)); + + + int (*poll_dispatch_delete) ( + qb_loop_t * handle, + int fd); + +}; + +#define SERVICE_ID_MAKE(a,b) ( ((a)<<16) | (b) ) + +#define SERVICE_HANDLER_MAXIMUM_COUNT 64 + +struct corosync_lib_handler { + void (*lib_handler_fn) (void *conn, const void *msg); + enum cs_lib_flow_control flow_control; +}; + +struct corosync_exec_handler { + void (*exec_handler_fn) (const void *msg, unsigned int nodeid); + void (*exec_endian_convert_fn) (void *msg); +}; + +struct corosync_service_engine_iface_ver0 { + struct corosync_service_engine *(*corosync_get_service_engine_ver0) (void); +}; + +typedef void (*sync_init_v1_fn_t) ( + const unsigned int *member_list, + size_t member_list_entries, + const struct memb_ring_id *ring_id) ; + +struct corosync_service_engine { + const char *name; + unsigned short id; + unsigned short priority; /* Lower priority are loaded first, unloaded last. + * 0 is a special case which always loaded _and_ unloaded last + */ + unsigned int private_data_size; + enum cs_lib_flow_control flow_control; + enum cs_lib_allow_inquorate allow_inquorate; + int (*exec_init_fn) (struct corosync_api_v1 *); + int (*exec_exit_fn) (void); + void (*exec_dump_fn) (void); + int (*lib_init_fn) (void *conn); + int (*lib_exit_fn) (void *conn); + struct corosync_lib_handler *lib_engine; + int lib_engine_count; + struct corosync_exec_handler *exec_engine; + int exec_engine_count; + int (*config_init_fn) (struct corosync_api_v1 *); + void (*confchg_fn) ( + enum totem_configuration_type configuration_type, + const unsigned int *member_list, size_t member_list_entries, + const unsigned int *left_list, size_t left_list_entries, + const unsigned int *joined_list, size_t joined_list_entries, + const struct memb_ring_id *ring_id); + enum cs_sync_mode sync_mode; + sync_init_v1_fn_t sync_init; + int (*sync_process) (void); + void (*sync_activate) (void); + void (*sync_abort) (void); +}; + +#endif /* COROAPI_H_DEFINED */ diff --git a/include/corosync/engine/coroapi.h b/include/corosync/engine/coroapi.h deleted file mode 100644 index fa6a510..0000000 --- a/include/corosync/engine/coroapi.h +++ /dev/null @@ -1,469 +0,0 @@ -/* - * Copyright (c) 2008, 2009 Red Hat, Inc. - * - * All rights reserved. - * - * Author: Steven Dake (sdake@xxxxxxxxxx) - * - * This software licensed under BSD license, the text of which follows: - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the name of the MontaVista Software, Inc. nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef COROAPI_H_DEFINED -#define COROAPI_H_DEFINED - -#include <stdio.h> -#ifdef COROSYNC_BSD -#include <sys/uio.h> -#endif -#include <corosync/hdb.h> -#include <qb/qbloop.h> -#include <corosync/swab.h> - -typedef struct { - uint32_t nodeid __attribute__((aligned(8))); - void *conn __attribute__((aligned(8))); -} mar_message_source_t __attribute__((aligned(8))); - -static inline void swab_mar_message_source_t (mar_message_source_t *to_swab) -{ - swab32 (to_swab->nodeid); - /* - * if it is from a byteswapped machine, then we can safely - * ignore its conn info data structure since this is only - * local to the machine - */ - to_swab->conn = NULL; -} - -#ifndef TIMER_HANDLE_T -typedef qb_loop_timer_handle corosync_timer_handle_t; -#define TIMER_HANDLE_T 1 -#endif - -struct corosync_tpg_group { - const void *group; - size_t group_len; -}; - -#define TOTEMIP_ADDRLEN (sizeof(struct in6_addr)) - -#define INTERFACE_MAX 2 - -#ifndef MESSAGE_QUEUE_MAX -#ifdef HAVE_SMALL_MEMORY_FOOTPRINT -#define PROCESSOR_COUNT_MAX 16 -#define MESSAGE_SIZE_MAX 1024*64 -#define MESSAGE_QUEUE_MAX 512 -#else -#define PROCESSOR_COUNT_MAX 384 -#define MESSAGE_SIZE_MAX 1024*1024 -#define MESSAGE_QUEUE_MAX ((4 * MESSAGE_SIZE_MAX) / totem_config->net_mtu) -#endif /* HAVE_SMALL_MEMORY_FOOTPRINT */ -#endif /* MESSAGE_QUEUE_MAX */ - -#define TOTEM_AGREED 0 -#define TOTEM_SAFE 1 - -#define MILLI_2_NANO_SECONDS 1000000ULL - -#if !defined(TOTEM_IP_ADDRESS) -struct totem_ip_address { - unsigned int nodeid; - unsigned short family; - unsigned char addr[TOTEMIP_ADDRLEN]; -} __attribute__((packed)); -#endif - -#if !defined(MEMB_RING_ID) -struct memb_ring_id { - struct totem_ip_address rep; - unsigned long long seq; -} __attribute__((packed)); -#endif - -#if !defined(TOTEM_CONFIGURATION_TYPE) -enum totem_configuration_type { - TOTEM_CONFIGURATION_REGULAR, - TOTEM_CONFIGURATION_TRANSITIONAL -}; -#endif - -#if !defined(TOTEM_CALLBACK_TOKEN_TYPE) -enum totem_callback_token_type { - TOTEM_CALLBACK_TOKEN_RECEIVED = 1, - TOTEM_CALLBACK_TOKEN_SENT = 2 -}; -#endif - -enum cs_lib_flow_control { - CS_LIB_FLOW_CONTROL_REQUIRED = 1, - CS_LIB_FLOW_CONTROL_NOT_REQUIRED = 2 -}; -#define corosync_lib_flow_control cs_lib_flow_control -#define COROSYNC_LIB_FLOW_CONTROL_REQUIRED CS_LIB_FLOW_CONTROL_REQUIRED -#define COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED CS_LIB_FLOW_CONTROL_NOT_REQUIRED - -enum cs_lib_allow_inquorate { - CS_LIB_DISALLOW_INQUORATE = 0, /* default */ - CS_LIB_ALLOW_INQUORATE = 1 -}; - -#if !defined (COROSYNC_FLOW_CONTROL_STATE) -enum cs_flow_control_state { - CS_FLOW_CONTROL_STATE_DISABLED, - CS_FLOW_CONTROL_STATE_ENABLED -}; -#define corosync_flow_control_state cs_flow_control_state -#define CS_FLOW_CONTROL_STATE_DISABLED CS_FLOW_CONTROL_STATE_DISABLED -#define CS_FLOW_CONTROL_STATE_ENABLED CS_FLOW_CONTROL_STATE_ENABLED - -#endif /* COROSYNC_FLOW_CONTROL_STATE */ - -enum cs_sync_mode { - CS_SYNC_V1 = 0, - CS_SYNC_V2 = 1, - CS_SYNC_V1_APIV2 = 2 -}; - -typedef enum { - COROSYNC_FATAL_ERROR_EXIT = -1, - COROSYNC_LIBAIS_SOCKET = -6, - COROSYNC_LIBAIS_BIND = -7, - COROSYNC_READKEY = -8, - COROSYNC_INVALID_CONFIG = -9, - COROSYNC_DYNAMICLOAD = -12, - COROSYNC_OUT_OF_MEMORY = -15, - COROSYNC_FATAL_ERR = -16 -} cs_fatal_error_t; -#define corosync_fatal_error_t cs_fatal_error_t; - -#ifndef QUORUM_H_DEFINED -typedef void (*quorum_callback_fn_t) (int quorate, void *context); - -struct quorum_callin_functions -{ - int (*quorate) (void); - int (*register_callback) (quorum_callback_fn_t callback_fn, void *context); - int (*unregister_callback) (quorum_callback_fn_t callback_fn, void *context); -}; - -typedef void (*sync_callback_fn_t) ( - const unsigned int *view_list, - size_t view_list_entries, - int primary_designated, - struct memb_ring_id *ring_id); - -#endif /* QUORUM_H_DEFINED */ - -struct corosync_api_v1 { - /* - * Time and timer APIs - */ - int (*timer_add_duration) ( - unsigned long long nanoseconds_in_future, - void *data, - void (*timer_nf) (void *data), - corosync_timer_handle_t *handle); - - int (*timer_add_absolute) ( - unsigned long long nanoseconds_from_epoch, - void *data, - void (*timer_fn) (void *data), - corosync_timer_handle_t *handle); - - void (*timer_delete) ( - corosync_timer_handle_t timer_handle); - - unsigned long long (*timer_time_get) (void); - - unsigned long long (*timer_expire_time_get) ( - corosync_timer_handle_t timer_handle); - - /* - * IPC APIs - */ - void (*ipc_source_set) (mar_message_source_t *source, void *conn); - - int (*ipc_source_is_local) (const mar_message_source_t *source); - - void *(*ipc_private_data_get) (void *conn); - - int (*ipc_response_send) (void *conn, const void *msg, size_t mlen); - - int (*ipc_response_iov_send) (void *conn, - const struct iovec *iov, unsigned int iov_len); - - int (*ipc_dispatch_send) (void *conn, const void *msg, size_t mlen); - - int (*ipc_dispatch_iov_send) (void *conn, - const struct iovec *iov, unsigned int iov_len); - - void (*ipc_refcnt_inc) (void *conn); - - void (*ipc_refcnt_dec) (void *conn); - - /* - * Totem APIs - */ - unsigned int (*totem_nodeid_get) (void); - - int (*totem_family_get) (void); - - int (*totem_ring_reenable) (void); - - int (*totem_mcast) (const struct iovec *iovec, - unsigned int iov_len, unsigned int guarantee); - - int (*totem_ifaces_get) ( - unsigned int nodeid, - struct totem_ip_address *interfaces, - char ***status, - unsigned int *iface_count); - - const char *(*totem_ifaces_print) (unsigned int nodeid); - - const char *(*totem_ip_print) (const struct totem_ip_address *addr); - - int (*totem_crypto_set) (unsigned int type); - - int (*totem_callback_token_create) ( - void **handle_out, - enum totem_callback_token_type type, - int delete, - int (*callback_fn) (enum totem_callback_token_type type, - const void *), - const void *data); - - /* - * Totem open process groups API for those service engines - * wanting their own groups - */ - int (*tpg_init) ( - void **instance, - - void (*deliver_fn) ( - unsigned int nodeid, - const void *msg, - unsigned int msg_len, - int endian_conversion_required), - - void (*confchg_fn) ( - enum totem_configuration_type configuration_type, - const unsigned int *member_list, - size_t member_list_entries, - const unsigned int *left_list, - size_t left_list_entries, - const unsigned int *joined_list, - size_t joined_list_entries, - const struct memb_ring_id *ring_id)); - - int (*tpg_exit) ( - void *instance); - - int (*tpg_join) ( - void *instance, - const struct corosync_tpg_group *groups, - size_t group_cnt); - - int (*tpg_leave) ( - void *instance, - const struct corosync_tpg_group *groups, - size_t group_cnt); - - int (*tpg_joined_mcast) ( - void *totempg_groups_instance, - const struct iovec *iovec, - unsigned int iov_len, - int guarantee); - - int (*tpg_joined_reserve) ( - void *totempg_groups_instance, - const struct iovec *iovec, - unsigned int iov_len); - - int (*tpg_joined_release) ( - int reserved_msgs); - - int (*tpg_groups_mcast) ( - void *instance, - int guarantee, - const struct corosync_tpg_group *groups, - size_t groups_cnt, - const struct iovec *iovec, - unsigned int iov_len); - - int (*tpg_groups_reserve) ( - void *instance, - const struct corosync_tpg_group *groups, - size_t groups_cnt, - const struct iovec *iovec, - unsigned int iov_len); - - int (*tpg_groups_release) ( - int reserved_msgs); - - int (*schedwrk_create) ( - hdb_handle_t *handle, - int (schedwrk_fn) (const void *), - const void *context); - - void (*schedwrk_destroy) (hdb_handle_t handle); - - int (*sync_request) ( - const char *service_name); - - /* - * User plugin-callable functions for quorum - */ - int (*quorum_is_quorate) (void); - int (*quorum_register_callback) (quorum_callback_fn_t callback_fn, void *context); - int (*quorum_unregister_callback) (quorum_callback_fn_t callback_fn, void *context); - - /* - * This one is for the quorum management plugin's use - */ - int (*quorum_initialize)(struct quorum_callin_functions *fns); - - /* - * Plugin loading and unloading - */ - int (*plugin_interface_reference) ( - hdb_handle_t *handle, - const char *iface_name, - int version, - void **interface, - void *context); - - int (*plugin_interface_release) (hdb_handle_t handle); - - /* - * Service loading and unloading APIs - */ - unsigned int (*service_link_and_init) ( - struct corosync_api_v1 *corosync_api_v1, - const char *service_name, - unsigned int service_ver); - - unsigned int (*service_unlink_and_exit) ( - struct corosync_api_v1 *corosync_api_v1, - const char *service_name, - unsigned int service_ver); - - /* - * Error handling APIs - */ - void (*error_memory_failure) (void) __attribute__ ((noreturn)); - -#define corosync_fatal_error(err) api->fatal_error ((err), __FILE__, __LINE__) - void (*fatal_error) (cs_fatal_error_t err, - const char *file, - unsigned int line) __attribute__ ((noreturn)); - - void (*shutdown_request) (void); - - void (*state_dump) (void); - - qb_loop_t *(*poll_handle_get) (void); - - void *(*totem_get_stats)(void); - - int (*schedwrk_create_nolock) ( - hdb_handle_t *handle, - int (schedwrk_fn) (const void *), - const void *context); - - int (*poll_dispatch_add) (qb_loop_t * handle, - int fd, - int events, - void *data, - - int (*dispatch_fn) (int fd, - int revents, - void *data)); - - - int (*poll_dispatch_delete) ( - qb_loop_t * handle, - int fd); - -}; - -#define SERVICE_ID_MAKE(a,b) ( ((a)<<16) | (b) ) - -#define SERVICE_HANDLER_MAXIMUM_COUNT 64 - -struct corosync_lib_handler { - void (*lib_handler_fn) (void *conn, const void *msg); - enum cs_lib_flow_control flow_control; -}; - -struct corosync_exec_handler { - void (*exec_handler_fn) (const void *msg, unsigned int nodeid); - void (*exec_endian_convert_fn) (void *msg); -}; - -struct corosync_service_engine_iface_ver0 { - struct corosync_service_engine *(*corosync_get_service_engine_ver0) (void); -}; - -typedef void (*sync_init_v1_fn_t) ( - const unsigned int *member_list, - size_t member_list_entries, - const struct memb_ring_id *ring_id) ; - -struct corosync_service_engine { - const char *name; - unsigned short id; - unsigned short priority; /* Lower priority are loaded first, unloaded last. - * 0 is a special case which always loaded _and_ unloaded last - */ - unsigned int private_data_size; - enum cs_lib_flow_control flow_control; - enum cs_lib_allow_inquorate allow_inquorate; - int (*exec_init_fn) (struct corosync_api_v1 *); - int (*exec_exit_fn) (void); - void (*exec_dump_fn) (void); - int (*lib_init_fn) (void *conn); - int (*lib_exit_fn) (void *conn); - struct corosync_lib_handler *lib_engine; - int lib_engine_count; - struct corosync_exec_handler *exec_engine; - int exec_engine_count; - int (*config_init_fn) (struct corosync_api_v1 *); - void (*confchg_fn) ( - enum totem_configuration_type configuration_type, - const unsigned int *member_list, size_t member_list_entries, - const unsigned int *left_list, size_t left_list_entries, - const unsigned int *joined_list, size_t joined_list_entries, - const struct memb_ring_id *ring_id); - enum cs_sync_mode sync_mode; - sync_init_v1_fn_t sync_init; - int (*sync_process) (void); - void (*sync_activate) (void); - void (*sync_abort) (void); -}; - -#endif /* COROAPI_H_DEFINED */ diff --git a/services/cfg.c b/services/cfg.c index b00ae93..a4d43f4 100644 --- a/services/cfg.c +++ b/services/cfg.c @@ -60,7 +60,7 @@ #include <corosync/ipc_cfg.h> #include <corosync/lcr/lcr_comp.h> #include <corosync/logsys.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/engine/icmap.h> #include <corosync/corodefs.h> diff --git a/services/cmap.c b/services/cmap.c index 076d8db..62e73e7 100644 --- a/services/cmap.c +++ b/services/cmap.c @@ -53,7 +53,7 @@ #include <corosync/ipc_cmap.h> #include <corosync/lcr/lcr_comp.h> #include <corosync/logsys.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/engine/icmap.h> #define hdb_error_to_cs(_result_) qb_to_cs_error(_result_) diff --git a/services/cpg.c b/services/cpg.c index 008a3ea..c7c4ead 100644 --- a/services/cpg.c +++ b/services/cpg.c @@ -64,7 +64,7 @@ #include <corosync/jhash.h> #include <corosync/lcr/lcr_comp.h> #include <corosync/logsys.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/cpg.h> #include <corosync/ipc_cpg.h> diff --git a/services/evs.c b/services/evs.c index e8d5879..bad8154 100644 --- a/services/evs.c +++ b/services/evs.c @@ -57,7 +57,7 @@ #include <corosync/corodefs.h> #include <corosync/mar_gen.h> #include <corosync/lcr/lcr_comp.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/logsys.h> #include <corosync/list.h> diff --git a/services/mon.c b/services/mon.c index a0bc705..665e768 100644 --- a/services/mon.c +++ b/services/mon.c @@ -42,7 +42,7 @@ #include <corosync/corotypes.h> #include <corosync/corodefs.h> #include <corosync/lcr/lcr_comp.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/list.h> #include <corosync/logsys.h> #include <corosync/engine/icmap.h> diff --git a/services/pload.c b/services/pload.c index 85a485f..c8f64ce 100644 --- a/services/pload.c +++ b/services/pload.c @@ -61,7 +61,7 @@ #include <corosync/corodefs.h> #include <corosync/lcr/lcr_comp.h> #include <corosync/mar_gen.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/ipc_pload.h> #include <corosync/list.h> #include <corosync/logsys.h> diff --git a/services/testquorum.c b/services/testquorum.c index 3cdf9cd..5122054 100644 --- a/services/testquorum.c +++ b/services/testquorum.c @@ -62,7 +62,7 @@ #include <corosync/mar_gen.h> #include <corosync/lcr/lcr_comp.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/engine/quorum.h> diff --git a/services/votequorum.c b/services/votequorum.c index d9930fb..126354f 100644 --- a/services/votequorum.c +++ b/services/votequorum.c @@ -66,7 +66,7 @@ #include <corosync/lcr/lcr_comp.h> #include <corosync/logsys.h> #include <corosync/mar_gen.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/engine/quorum.h> #include <corosync/engine/icmap.h> #include <corosync/ipc_votequorum.h> diff --git a/services/wd.c b/services/wd.c index 72544ae..055cc8a 100644 --- a/services/wd.c +++ b/services/wd.c @@ -44,7 +44,7 @@ #include <corosync/corotypes.h> #include <corosync/corodefs.h> #include <corosync/lcr/lcr_comp.h> -#include <corosync/engine/coroapi.h> +#include <corosync/coroapi.h> #include <corosync/list.h> #include <corosync/logsys.h> #include <corosync/engine/icmap.h> -- 1.7.7.4 _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss