/* * This file is part of QCluster. * * QCluster is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * QCluster is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with QCluster; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Peter Harper * * $Id: cluster.h,v 1.1 2003/12/02 06:17:38 rmello Exp $ */ #ifndef _CLUSTER_H #define _CLUSTER_H #define Version "1.3" #define DEBUG 1 /* * General definitions */ #define Q_MAX_NAME_SIZE 256 /* String size to use for */ /* character arrays used for */ /* names */ #define Q_MAX_SERVERS 64 /* Maximum number of clustered */ /* servers allowed */ /* * Message status definitions. */ #define Q_MSG_STATUS_READY 0 #define Q_MSG_STATUS_DELAYED 1 #define Q_MSG_STATUS_PROCESSING 2 #define Q_MSG_STATUS_COMPLETE 3 #define Q_MSG_STATUS_FAILED 4 #define Q_MSG_STATUS_MAX 5 #define Q_MAX_MSG_SIZE 10240 /* Maximum message size */ /* to be received from socket */ struct q_message_type { int msg_type_id; /* Message type identifier */ char type_name[Q_MAX_NAME_SIZE]; /* Name of message type */ int (*construct_in_func)(void *, int, void *, int*); /* Pointer to function that will */ /* be called for transfer in of this */ /* message type's message. */ int (*construct_out_func)(void *, int, void *, int*); /* Pointer to function that will */ /* be called for transfer out of this */ /* message type's message. */ }; struct q_message { char msg_id[Q_MAX_NAME_SIZE]; /* Unique message id */ void *msg_ptr; /* Pointer to message contents */ int msg_size; /* Size of message */ time_t timestamp; /* Timestamp of message */ int status; /* Status of message: */ /* Q_MSG_STATUS_READY */ /* Q_MSG_STATUS_DELAYED */ /* Q_MSG_STATUS_PROCESSING */ /* Q_MSG_STATUS_COMPLETE */ struct q_group *grp_ptr; /* Pointer to queue group */ struct q_message_type *type_ptr; /* Pointer to structure defining */ /* the message type of this message */ }; /* * The next two structures are used to implement the linked list for * message queues, and iteration over those lists. */ struct q_message_entry { struct q_message *msg_ptr; struct q_message_entry *prev_ptr; struct q_message_entry *next_ptr; }; struct q_message_search { int specific_status; struct q_message_entry *prev_ptr; struct q_message_entry *cur_ptr; struct q_message_entry *next_ptr; }; struct q_group { char grp_name[Q_MAX_NAME_SIZE]; /* Name of queue group */ int grp_id; /* Unique id of queue group */ int can_process_p; /* Flag indicating whether this */ /* server has links to process this */ /* message group */ Ns_Cond event; /* Thread event structure */ Ns_Mutex event_lock; /* Thread event lock structure */ struct q_message_entry *queue_ll; /* Message queue linked list */ struct q_message_entry *queue_by_stat_ll[Q_MSG_STATUS_MAX]; /* Message queue (grouped by status) */ /* linked list */ Tcl_HashTable queue_ht; /* Message queue lookup hashtable */ }; struct q_server { char svr_ip[Q_MAX_NAME_SIZE]; /* The IP address of the foreign */ /* server. */ char svr_name[Q_MAX_NAME_SIZE]; /* The unique name of the foreign */ /* server. */ int iam_p; /* Flag indicating whether this */ /* server entry is us. */ int l_port; /* Port on which this server is */ /* listening. */ /* client connection information (outgoing)*/ SOCKET c_sock; struct sockaddr_in c_sa; Ns_Mutex c_mutex; /* server connection information (incoming)*/ Ns_Mutex s_mutex; SOCKET s_sock; struct sockaddr_in s_sa; Tcl_HashTable groups_ht; /* Server groups */ }; /* * Global qcluster data */ extern Ns_RWLock g_cluster_mutex; extern Tcl_HashTable g_cluster; extern struct q_server *g_cluster_order[Q_MAX_SERVERS]; extern int g_cluster_size; extern int g_this_server_pos; extern char *g_addr; extern char *g_iam; extern struct q_server *g_server; extern int g_port; extern int g_qcluster_started; extern Ns_Mutex g_recover_mutex; /* * Function declarations */ extern int q_data_add_msg(struct q_group *group_ptr, struct q_message *msg_ptr); extern int q_data_delete_msg(struct q_group *group_ptr, char *msg_id, int free_msg_ptr_p, int free_payload_ptr_p); extern struct q_message * q_data_get_msg_entry(struct q_group *group_ptr, char *msg_id); extern int q_data_update_msg_status(struct q_group *group_ptr, struct q_message *msg_ptr, int new_status); extern struct q_message * q_data_first_msg_entry(struct q_group *group_ptr, int specific_status, struct q_message_search *search_ptr); extern struct q_message * q_data_next_msg_entry(struct q_message_search *search_ptr); #endif