34 #include <sys/select.h> 44 #include <sys/types.h> 48 #include <sys/param.h> 49 #include <sys/resource.h> 50 #include <netinet/in.h> 84 int server_name_length);
86 char *server_name,
int server_name_length);
107 #if !defined(WINDOWS) 115 static int css_Active_server_count = 0;
126 #if !defined(WINDOWS) 145 fprintf (stderr,
"Master process: %s\n", error_string);
146 perror (
"css_master_error");
148 syslog (LOG_ALERT,
"Master process: %s %s\n", error_string, errno > 0 ? strerror (errno) :
"");
165 #if !defined(WINDOWS) 169 struct timeval timeout;
178 #if !defined(WINDOWS) 182 for (temp = css_Master_socket_anchor; temp; temp = temp->
next)
184 if (kill (temp->
pid, 0) && errno == ESRCH)
187 if (css_Active_server_count > 0)
189 css_Active_server_count--;
192 #if !defined(WINDOWS) 222 #if !defined(WINDOWS) 262 #if !defined(WINDOWS) 282 reject_reason =
htonl (reason);
283 css_send_data (conn, rid, (
char *) &reject_reason,
sizeof (
int));
297 reject_reason =
htonl (reason);
298 send (conn->
fd, (
char *) &reject_reason, sizeof (
int), 0);
313 accept_reason =
htonl (reason);
314 send (conn->
fd, (
char *) &accept_reason, sizeof (
int), 0);
344 css_Active_server_count++;
347 &css_Master_socket_anchor);
348 length = (int)
strlen (server_name) + 1;
349 if (length < server_name_length)
354 server_name += length;
364 strcpy (entry->
env_var, server_name);
367 server_name +=
strlen (server_name) + 1;
369 entry->
pid = atoi (server_name);
396 int server_name_length)
412 entry->
fd = server_fd;
415 length = (int)
strlen (server_name) + 1;
416 if (length < server_name_length)
418 server_name += length;
444 char *server_name =
NULL;
469 css_Active_server_count++;
472 &css_Master_socket_anchor);
480 if (server_name !=
NULL)
485 #if !defined(WINDOWS) 505 char *server_name =
NULL;
508 int server_name_length, length;
531 server_name_length = name_length;
535 name_length =
sizeof (buffer);
539 css_Active_server_count++;
543 &css_Master_socket_anchor);
548 length = (int)
strlen (server_name) + 1;
550 if (length < server_name_length)
557 recv_data = server_name + length;
566 strcpy (entry->
env_var, recv_data);
568 recv_data +=
strlen (recv_data) + 1;
569 entry->
pid = atoi (recv_data);
593 if (server_name !=
NULL)
638 char *server_name =
NULL;
639 int name_length, buffer;
646 #
if !defined(WINDOWS)
663 #if !defined(WINDOWS) 692 #if !defined(WINDOWS) 710 if (server_name !=
NULL)
750 switch (function_code)
791 for (temp = anchor_p; temp; temp = temp->
next)
795 FD_SET (temp->
fd, fd_var);
796 if (temp->
fd > max_fd)
860 for (temp = anchor_p; temp; temp = temp->
next)
864 FD_SET (temp->
fd, fd_var);
865 if (temp->
fd > max_fd)
894 #if !defined(WINDOWS) 900 for (temp = css_Master_socket_anchor; temp; temp = temp->
next)
905 if (css_Active_server_count > 0)
907 css_Active_server_count--;
910 #if !defined(WINDOWS) 939 #if !defined(WINDOWS) 945 #if !defined(WINDOWS) 948 for (temp = css_Master_socket_anchor; *count && temp; temp = next)
953 FD_CLR (temp->fd, fd_var);
978 if (css_Active_server_count > 0)
980 css_Active_server_count--;
992 #if !defined(WINDOWS) 1017 #if !defined(WINDOWS) 1023 #if !defined(WINDOWS) 1026 for (temp = css_Master_socket_anchor; temp; temp = temp->
next)
1029 #
if !defined(WINDOWS)
1030 (fcntl (temp->
fd, F_GETFL, 0) < 0) ||
1036 if (css_Active_server_count > 0)
1038 css_Active_server_count--;
1041 FD_CLR (temp->
fd, fd_var);
1044 #if !defined(WINDOWS) 1050 #if !defined(WINDOWS) 1060 #if !defined(WINDOWS) 1067 #if !defined(WINDOWS) 1080 fd_set read_fd, write_fd, exception_fd;
1081 static struct timeval timeout;
1087 int max_fd, max_fd1, max_fd2, max_fd3;
1093 max_fd = MAX (MAX (max_fd1, max_fd2), max_fd3);
1098 rc = select (max_fd + 1, &read_fd, &write_fd, &exception_fd, &timeout);
1126 static const char suffix[] =
"_master.err";
1128 char *errlog =
NULL;
1129 int status = EXIT_SUCCESS;
1130 const char *msg_format;
1134 return EXIT_FAILURE;
1137 #if defined(WINDOWS) 1142 printf (
"Unable to initialize Winsock.\n");
1143 status = EXIT_FAILURE;
1153 strcat (hostname, suffix);
1160 status = EXIT_FAILURE;
1168 status = EXIT_FAILURE;
1177 status = EXIT_FAILURE;
1187 #if !defined(WINDOWS) 1203 status = EXIT_FAILURE;
1212 #if !defined(WINDOWS) 1217 status = EXIT_FAILURE;
1225 &css_Master_socket_anchor);
1228 &css_Master_socket_anchor);
1234 #if defined(WINDOWS) 1296 for (p = *anchor_p, q =
NULL;
p; q =
p, p = p->
next)
1298 if (p->conn_ptr != conn_p)
1305 *anchor_p = p->
next;
1346 p->
name = (
char *) malloc (
strlen (name_p) + 1);
1349 strcpy (p->
name, name_p);
1350 #if !defined(WINDOWS) 1372 p->
next = *anchor_p;
1395 for (p = anchor_p;
p; p = p->
next)
1397 if (p->
name && strcmp (p->
name, name_p) == 0)
1402 #if !defined(WINDOWS) 1406 if (strcmp ((
char *) (p->
name + 1), name_p) == 0)
1433 for (p = *anchor_p;
p; p = p->
next)
1447 #if !defined(WINDOWS) 1460 int ppid = getpid ();
1467 if (getppid () == 1)
1510 else if (childpid > 0)
1521 while (getppid () == ppid)
1550 for (fd = 3; fd < fd_max; fd++)
static void css_accept_new_request(CSS_CONN_ENTRY *conn, unsigned short rid, char *server_name, int server_name_length)
pthread_mutex_t css_Master_er_log_lock
#define IS_MASTER_CONN_NAME_HA_APPLYLOG(name)
int css_Total_request_count
#define PRINT_AND_LOG_ERR_MSG(...)
#define pthread_mutex_init(a, b)
static bool css_send_new_request_to_server(SOCKET server_fd, SOCKET client_fd, unsigned short rid, CSS_SERVER_REQUEST request)
static void css_free_entry(SOCKET_QUEUE_ENTRY *entry_p)
static int css_master_init(int cport, SOCKET *clientfd)
unsigned int htonl(unsigned int from)
#define IS_MASTER_CONN_NAME_HA_SERVER(name)
void css_free_conn(CSS_CONN_ENTRY *conn)
CSS_CONN_ENTRY * conn_ptr
#define pthread_mutex_unlock(a)
static void css_send_to_existing_server(CSS_CONN_ENTRY *conn, unsigned short rid, CSS_SERVER_REQUEST request)
void css_remove_entry_by_conn(CSS_CONN_ENTRY *conn_p, SOCKET_QUEUE_ENTRY **anchor_p)
static void css_reject_client_request(CSS_CONN_ENTRY *conn, unsigned short rid, int reason)
pthread_mutex_t css_Master_socket_anchor_lock
static int css_enroll_exception_sockets(SOCKET_QUEUE_ENTRY *anchor_p, fd_set *fd_var)
int main(int argc, char **argv)
int css_Master_timeout_value_in_seconds
int css_get_max_socket_fds(void)
static void css_process_new_connection(SOCKET fd)
bool css_does_master_exist(int port_id)
bool css_transfer_fd(SOCKET server_fd, SOCKET client_fd, unsigned short rid, CSS_SERVER_REQUEST request_for_server)
int er_init(const char *msglog_filename, int exit_ask)
int css_receive_request(CSS_CONN_ENTRY *conn, unsigned short *rid, int *request, int *buffer_size)
static int css_enroll_master_read_sockets(fd_set *fd_var)
static void css_check_master_socket_input(int *count, fd_set *fd_var)
void er_final(ER_FINAL_CODE do_global_final)
static int css_enroll_read_sockets(SOCKET_QUEUE_ENTRY *anchor_p, fd_set *fd_var)
void css_process_heartbeat_request(CSS_CONN_ENTRY *conn)
static int css_check_master_socket_exception(fd_set *fd_var)
void css_master_cleanup(int sig)
#define ERR_CSS_CANNOT_FORK
#define IS_INVALID_SOCKET(socket)
const char * db_error_string(int level)
static void css_register_new_server(CSS_CONN_ENTRY *conn, unsigned short rid)
void css_shutdown_socket(SOCKET fd)
static void cleanup(int signo)
bool master_util_config_startup(const char *db_name, int *port_id)
bool hb_is_hang_process(int sfd)
static void css_accept_old_request(CSS_CONN_ENTRY *conn, unsigned short rid, SOCKET_QUEUE_ENTRY *entry, char *server_name, int server_name_length)
#define TPRINTF(error_string, arg)
struct packet_header NET_HEADER
int count(int &result, const cub_regex_object ®, const std::string &src, const int position, const INTL_CODESET codeset)
SOCKET css_Master_socket_fd[2]
int css_Master_timeout_value_in_microseconds
bool css_tcp_master_datagram(char *path_name, SOCKET *sockfd)
const char * envvar_get(const char *name)
#define MASTER_ER_SET(...)
int css_receive_data(CSS_CONN_ENTRY *conn, unsigned short req_id, char **buffer, int *buffer_size, int timeout)
SOCKET_QUEUE_ENTRY * css_add_request_to_socket_queue(CSS_CONN_ENTRY *conn_p, int info_p, char *name_p, SOCKET fd, int fd_type, int pid, SOCKET_QUEUE_ENTRY **anchor_p)
static void css_daemon_start(void)
static void css_check_master_socket_output(void)
int css_windows_startup(void)
char * css_get_master_domain_path(void)
#define free_and_init(ptr)
struct timeval * css_Master_timeout
static int css_master_timeout(void)
int css_tcp_master_open(int port, SOCKET *sockfd)
void css_windows_shutdown(void)
static void css_master_loop(void)
static void css_accept_server_request(CSS_CONN_ENTRY *conn, int reason)
int util_log_write_errstr(const char *format,...)
static void css_master_error(const char *error_string)
int css_net_recv(SOCKET fd, char *buffer, int *maxlen, int timeout)
static void css_register_new_server2(CSS_CONN_ENTRY *conn, unsigned short rid)
SOCKET_QUEUE_ENTRY * css_return_entry_by_conn(CSS_CONN_ENTRY *conn_p, SOCKET_QUEUE_ENTRY **anchor_p)
char * msgcat_message(int cat_id, int set_id, int msg_id)
static int css_enroll_master_write_sockets(fd_set *fd_var)
enum css_server_request CSS_SERVER_REQUEST
#define pthread_mutex_lock(a)
struct socket_queue_entry * next
void css_process_info_request(CSS_CONN_ENTRY *conn)
static int css_enroll_master_exception_sockets(fd_set *fd_var)
unsigned int ntohl(unsigned int from)
int css_send_data(CSS_CONN_ENTRY *conn, unsigned short rid, const char *buffer, int buffer_size)
static void css_reject_server_request(CSS_CONN_ENTRY *conn, int reason)
static int css_enroll_write_sockets(SOCKET_QUEUE_ENTRY *anchor_p, fd_set *fd_var)
SOCKET_QUEUE_ENTRY * css_return_entry_of_server(char *name_p, SOCKET_QUEUE_ENTRY *anchor_p)
int css_check_magic(CSS_CONN_ENTRY *conn)
pthread_mutex_t css_Master_er_log_enable_lock
bool css_Master_er_log_enabled
#define CUB_MAXHOSTNAMELEN
static void css_master_select_error(void)
bool hb_is_deactivation_started(void)
#define IS_MASTER_CONN_NAME_HA_COPYLOG(name)
SIGNAL_HANDLER_FUNCTION os_set_signal_handler(const int sig_no, SIGNAL_HANDLER_FUNCTION sig_handler)
SOCKET css_master_accept(SOCKET sockfd)
#define GETHOSTNAME(p, l)
SOCKET_QUEUE_ENTRY * css_Master_socket_anchor
void hb_cleanup_conn_and_start_process(CSS_CONN_ENTRY *conn, SOCKET sfd)
CSS_CONN_ENTRY * css_make_conn(SOCKET fd)
#define MSGCAT_CATALOG_UTILS