CUBRID Engine  latest
master_request.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 /*
20  * master_request.c - master request handling module
21  */
22 
23 #ident "$Id$"
24 
25 #include "config.h"
26 
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <time.h>
31 #include <signal.h>
32 #if defined(WINDOWS)
33 #include <winsock2.h>
34 #include <time.h>
35 #else /* ! WINDOWS */
36 #include <sys/time.h>
37 #include <sys/param.h>
38 #include <netinet/in.h>
39 #include <pthread.h>
40 #endif /* ! WINDOWS */
41 
42 #include "system_parameter.h"
43 #include "connection_globals.h"
44 #include "connection_cl.h"
45 #include "error_manager.h"
46 #include "utility.h"
47 #include "message_catalog.h"
48 #include "memory_alloc.h"
49 #include "porting.h"
50 #include "release_string.h"
51 #if !defined(WINDOWS)
52 #include "tcp.h"
53 #else /* ! WINDOWS */
54 #include "wintcp.h"
55 #endif /* ! WINDOWS */
56 #include "master_util.h"
57 #include "master_request.h"
58 #include "master_heartbeat.h"
59 
60 #if defined (SUPPRESS_STRLEN_WARNING)
61 #define strlen(s1) ((int) strlen(s1))
62 #endif /* defined (SUPPRESS_STRLEN_WARNING) */
63 
64 #define IS_MASTER_SOCKET_FD(FD) \
65  ((FD) == css_Master_socket_fd[0] || (FD) == css_Master_socket_fd[1])
66 
67 #define SERVER_FORMAT_STRING " Server %s (rel %s, pid %d)\n"
68 #define HA_SERVER_FORMAT_STRING " HA-Server %s (rel %s, pid %d)\n"
69 #define HA_COPYLOGDB_FORMAT_STRING " HA-copylogdb %s (rel %s, pid %d)\n"
70 #define HA_APPLYLOGDB_FORMAT_STRING " HA-applylogdb %s (rel %s, pid %d)\n"
71 
72 static void css_send_command_to_server (const SOCKET_QUEUE_ENTRY * sock_entry, int command);
73 static void css_send_message_to_server (const SOCKET_QUEUE_ENTRY * sock_entry, const char *message);
74 static void css_cleanup_info_connection (CSS_CONN_ENTRY * conn);
75 static void css_process_start_time_info (CSS_CONN_ENTRY * conn, unsigned short request_id);
76 static void css_process_shutdown_time_info (CSS_CONN_ENTRY * conn, unsigned short request_id);
77 static void css_process_server_count_info (CSS_CONN_ENTRY * conn, unsigned short request_id);
78 static void css_process_all_count_info (CSS_CONN_ENTRY * conn, unsigned short request_id);
79 static void css_process_server_list_info (CSS_CONN_ENTRY * conn, unsigned short request_id);
80 static void css_process_all_list_info (CSS_CONN_ENTRY * conn, unsigned short request_id);
81 static void css_process_kill_slave (CSS_CONN_ENTRY * conn, unsigned short request_id, char *server_name);
82 static void css_process_kill_immediate (CSS_CONN_ENTRY * conn, unsigned short request_id, char *server_name);
83 static void css_send_term_signal (int pid);
84 static void css_process_kill_master (void);
85 static void css_process_request_count_info (CSS_CONN_ENTRY * conn, unsigned short request_id);
86 static void css_process_shutdown (char *time_buffer);
87 static void css_process_get_server_ha_mode (CSS_CONN_ENTRY * conn, unsigned short request_id, char *server_name);
88 static void css_process_get_eof (CSS_CONN_ENTRY * conn);
89 static void css_process_ha_node_list_info (CSS_CONN_ENTRY * conn, unsigned short request_id, bool verbose_yn);
90 static void css_process_ha_process_list_info (CSS_CONN_ENTRY * conn, unsigned short request_id, bool verbose_yn);
91 
92 static void css_process_kill_all_ha_process (CSS_CONN_ENTRY * conn, unsigned short request_id);
93 static void css_process_is_registered_ha_proc (CSS_CONN_ENTRY * conn, unsigned short request_id, char *buf);
94 static void css_process_ha_deregister_by_pid (CSS_CONN_ENTRY * conn, unsigned short request_id, char *pid_p);
95 static void css_process_ha_deregister_by_args (CSS_CONN_ENTRY * conn, unsigned short request_id, char *args);
96 static void css_process_reconfig_heartbeat (CSS_CONN_ENTRY * conn, unsigned short request_id);
97 static void css_process_deact_stop_all (CSS_CONN_ENTRY * conn, unsigned short request_id, char *deact_immediately);
98 static void css_process_deact_confirm_stop_all (CSS_CONN_ENTRY * conn, unsigned short request_id);
99 static void css_process_deactivate_heartbeat (CSS_CONN_ENTRY * conn, unsigned short request_id);
100 static void css_process_deact_confirm_no_server (CSS_CONN_ENTRY * conn, unsigned short request_id);
101 static void css_process_activate_heartbeat (CSS_CONN_ENTRY * conn, unsigned short request_id);
102 
105 static void css_process_change_ha_mode (CSS_CONN_ENTRY * conn);
106 static void css_process_ha_ping_host_info (CSS_CONN_ENTRY * conn, unsigned short request_id);
107 static void css_process_ha_admin_info (CSS_CONN_ENTRY * conn, unsigned short request_id);
108 static void css_process_ha_start_util_process (CSS_CONN_ENTRY * conn, unsigned short request_id, char *args);
109 
110 static void css_process_server_state (CSS_CONN_ENTRY * conn, unsigned short request_id, char *server_name);
111 
112 /*
113  * css_send_command_to_server()
114  * return: none
115  * sock_entry(in)
116  * command(in)
117  */
118 static void
119 css_send_command_to_server (const SOCKET_QUEUE_ENTRY * sock_entry, int command)
120 {
121  int request;
122 
123  request = htonl (command);
124  if (sock_entry->conn_ptr && !sock_entry->info_p && !IS_MASTER_SOCKET_FD (sock_entry->conn_ptr->fd)
125  && !IS_INVALID_SOCKET (sock_entry->conn_ptr->fd))
126  {
127  send (sock_entry->conn_ptr->fd, (char *) &request, sizeof (int), 0);
128  }
129 }
130 
131 /*
132  * css_send_message_to_server()
133  * return: none
134  * sock_entry(in)
135  * message(in)
136  */
137 static void
138 css_send_message_to_server (const SOCKET_QUEUE_ENTRY * sock_entry, const char *message)
139 {
140  if (sock_entry->conn_ptr && !sock_entry->info_p && !IS_MASTER_SOCKET_FD (sock_entry->conn_ptr->fd)
141  && !IS_INVALID_SOCKET (sock_entry->conn_ptr->fd))
142  {
143  send (sock_entry->conn_ptr->fd, message, MASTER_TO_SRV_MSG_SIZE, 0);
144  }
145 }
146 
147 /*
148  * css_cleanup_info_connection()
149  * return: none
150  * conn(in)
151  */
152 static void
154 {
156 }
157 
158 /*
159  * css_process_start_time_info()
160  * return: none
161  * conn(in)
162  * request_id(in)
163  */
164 static void
165 css_process_start_time_info (CSS_CONN_ENTRY * conn, unsigned short request_id)
166 {
167  char *my_time;
168 
169  my_time = ctime (&css_Start_time);
170  if (css_send_data (conn, request_id, my_time, 26) != NO_ERRORS)
171  {
173  }
174 }
175 
176 /*
177  * css_process_shutdown_time_info() - send a remaining shutdown time
178  * return: none
179  * conn(in)
180  * request_id(in)
181  */
182 static void
183 css_process_shutdown_time_info (CSS_CONN_ENTRY * conn, unsigned short request_id)
184 {
185  struct timeval timeout;
186  int time_left;
187  char time_string[1028];
188  char *master_release = (char *) rel_release_string ();
189 
190  if (css_Master_timeout == NULL)
191  {
192  if (css_send_data (conn, request_id, master_release, strlen (master_release) + 1) != NO_ERRORS)
193  {
195  }
196  return;
197  }
198 
199  if (time ((time_t *) (&timeout.tv_sec)) == (time_t) (-1))
200  {
201  if (css_send_data (conn, request_id, master_release, strlen (master_release) + 1) != NO_ERRORS)
202  {
204  }
205  }
206 
207  if ((time_left = css_Master_timeout->tv_sec - timeout.tv_sec) > 0)
208  {
209  time_left = time_left / 60;
210  sprintf (time_string, "%d", time_left);
211  if (css_send_data (conn, request_id, time_string, strlen (time_string) + 1) != NO_ERRORS)
212  {
214  }
215  }
216  else if (css_send_data (conn, request_id, master_release, strlen (master_release) + 1) != NO_ERRORS)
217  {
219  }
220 }
221 
222 /*
223  * css_process_server_count_info()
224  * return: none
225  * conn(in)
226  * request_id(in)
227  */
228 static void
229 css_process_server_count_info (CSS_CONN_ENTRY * conn, unsigned short request_id)
230 {
231  int count = 0;
232  SOCKET_QUEUE_ENTRY *temp;
233 
234  for (temp = css_Master_socket_anchor; temp; temp = temp->next)
235  {
236  if (!IS_INVALID_SOCKET (temp->fd) && !IS_MASTER_SOCKET_FD (temp->fd) && temp->name
239  {
240  count++;
241  }
242  }
243 
244  count = htonl (count);
245  if (css_send_data (conn, request_id, (char *) &count, sizeof (int)) != NO_ERRORS)
246  {
248  }
249 }
250 
251 /*
252  * css_process_all_count_info()
253  * return: none
254  * conn(in)
255  * request_id(in)
256  */
257 static void
258 css_process_all_count_info (CSS_CONN_ENTRY * conn, unsigned short request_id)
259 {
260  int count = 0;
261  SOCKET_QUEUE_ENTRY *temp;
262 
263  for (temp = css_Master_socket_anchor; temp; temp = temp->next)
264  {
265  if (!IS_INVALID_SOCKET (temp->fd) && !IS_MASTER_SOCKET_FD (temp->fd) && temp->name)
266  {
267  count++;
268  }
269  }
270 
271  count = htonl (count);
272  if (css_send_data (conn, request_id, (char *) &count, sizeof (int)) != NO_ERRORS)
273  {
275  }
276 }
277 
278 /*
279  * css_process_server_list_info()
280  * return: none
281  * conn(in)
282  * request_id(in)
283  */
284 static void
285 css_process_server_list_info (CSS_CONN_ENTRY * conn, unsigned short request_id)
286 {
287  int bufsize = 0, required_size;
288  char *buffer = NULL;
289  SOCKET_QUEUE_ENTRY *temp;
290 
291  for (temp = css_Master_socket_anchor; temp; temp = temp->next)
292  {
293  if (!IS_INVALID_SOCKET (temp->fd) && !IS_MASTER_SOCKET_FD (temp->fd) && temp->name != NULL
296  {
297  required_size = 0;
298 
299  /* if HA mode server */
301  {
302  required_size += strlen (HA_SERVER_FORMAT_STRING);
303  }
304  else
305  {
306  required_size += strlen (SERVER_FORMAT_STRING);
307  }
308  required_size += strlen (temp->name);
309  if (temp->version_string != NULL)
310  {
311  required_size += strlen (temp->version_string);
312  }
313  required_size += 5; /* length of pid string */
314 
315  bufsize += required_size;
316 
317  if (buffer == NULL)
318  {
319  buffer = (char *) malloc (bufsize * sizeof (char));
320  if (buffer == NULL)
321  {
322  goto error_return;
323  }
324  buffer[0] = '\0';
325  }
326  else
327  {
328  char *oldbuffer = buffer; /* save pointer in case realloc fails */
329  buffer = (char *) realloc (buffer, bufsize * sizeof (char));
330  if (buffer == NULL)
331  {
332  free_and_init (oldbuffer);
333  goto error_return;
334  }
335  }
336 
337  /* if HA mode server */
339  {
340  snprintf (buffer + strlen (buffer), required_size, HA_SERVER_FORMAT_STRING, temp->name + 1,
341  (temp->version_string == NULL ? "?" : temp->version_string), temp->pid);
342  }
343  else
344  {
345  snprintf (buffer + strlen (buffer), required_size, SERVER_FORMAT_STRING, temp->name,
346  (temp->version_string == NULL ? "?" : temp->version_string), temp->pid);
347 
348  }
349  }
350  }
351 
352  if (buffer == NULL)
353  {
354  goto error_return;
355  }
356 
357  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
358  {
360  }
361 
362  free_and_init (buffer);
363  return;
364 
365 error_return:
366  if (css_send_data (conn, request_id, "\0", 1) != NO_ERRORS)
367  {
369  }
370 
371  if (buffer != NULL)
372  {
373  free_and_init (buffer);
374  }
375  return;
376 }
377 
378 /*
379  * css_process_all_list_info()
380  * return: none
381  * conn(in)
382  * request_id(in)
383  */
384 static void
385 css_process_all_list_info (CSS_CONN_ENTRY * conn, unsigned short request_id)
386 {
387  int bufsize = 0, required_size;
388  char *buffer = NULL;
389  SOCKET_QUEUE_ENTRY *temp;
390 
391  for (temp = css_Master_socket_anchor; temp; temp = temp->next)
392  {
393  if (!IS_INVALID_SOCKET (temp->fd) && !IS_MASTER_SOCKET_FD (temp->fd) && temp->name != NULL)
394  {
395  required_size = 0;
396 
397  switch (temp->name[0])
398  {
399  case '#':
400  required_size += strlen (HA_SERVER_FORMAT_STRING);
401  break;
402  case '$':
403  required_size += strlen (HA_COPYLOGDB_FORMAT_STRING);
404  break;
405  case '%':
406  required_size += strlen (HA_APPLYLOGDB_FORMAT_STRING);
407  break;
408  default:
409  required_size += strlen (SERVER_FORMAT_STRING);
410  break;
411  }
412  required_size += strlen (temp->name);
413  if (temp->version_string != NULL)
414  {
415  required_size += strlen (temp->version_string);
416  }
417  required_size += 5; /* length of pid string */
418 
419  bufsize += required_size;
420 
421  if (buffer == NULL)
422  {
423  buffer = (char *) malloc (bufsize * sizeof (char));
424  if (buffer == NULL)
425  {
426  goto error_return;
427  }
428  buffer[0] = '\0';
429  }
430  else
431  {
432  char *oldbuffer = buffer; /* save pointer in case realloc fails */
433  buffer = (char *) realloc (buffer, bufsize * sizeof (char));
434  if (buffer == NULL)
435  {
436  free_and_init (oldbuffer);
437  goto error_return;
438  }
439  }
440 
441  switch (temp->name[0])
442  {
443  case '#':
444  snprintf (buffer + strlen (buffer), required_size, HA_SERVER_FORMAT_STRING, temp->name + 1,
445  (temp->version_string == NULL ? "?" : temp->version_string), temp->pid);
446  break;
447  case '$':
448  snprintf (buffer + strlen (buffer), required_size, HA_COPYLOGDB_FORMAT_STRING, temp->name + 1,
449  (temp->version_string == NULL ? "?" : temp->version_string), temp->pid);
450  break;
451  case '%':
452  snprintf (buffer + strlen (buffer), required_size, HA_APPLYLOGDB_FORMAT_STRING, temp->name + 1,
453  (temp->version_string == NULL ? "?" : temp->version_string), temp->pid);
454  break;
455  default:
456  snprintf (buffer + strlen (buffer), required_size, SERVER_FORMAT_STRING, temp->name,
457  (temp->version_string == NULL ? "?" : temp->version_string), temp->pid);
458  break;
459  }
460  }
461  }
462 
463  if (buffer == NULL)
464  {
465  goto error_return;
466  }
467 
468  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
469  {
471  }
472 
473  free_and_init (buffer);
474  return;
475 
476 error_return:
477  if (css_send_data (conn, request_id, "\0", 1) != NO_ERRORS)
478  {
480  }
481 
482  if (buffer != NULL)
483  {
484  free_and_init (buffer);
485  }
486  return;
487 }
488 
489 /*
490  * css_process_kill_slave()
491  * return: none
492  * conn(in)
493  * request_id(in)
494  * server_name(in/out)
495  */
496 static void
497 css_process_kill_slave (CSS_CONN_ENTRY * conn, unsigned short request_id, char *server_name)
498 {
499  int timeout;
500  SOCKET_QUEUE_ENTRY *temp;
501  char buffer[MASTER_TO_SRV_MSG_SIZE];
502  char *time_buffer = NULL;
503  int time_size = 0;
504  int rc;
505 
506  rc = css_receive_data (conn, request_id, &time_buffer, &time_size, -1);
507  if (rc == NO_ERRORS && time_buffer != NULL)
508  {
509  timeout = ntohl ((int) *(int *) time_buffer);
510  free_and_init (time_buffer);
511 
512  for (temp = css_Master_socket_anchor; temp; temp = temp->next)
513  {
514  if ((temp->name != NULL) && ((strcmp (temp->name, server_name) == 0)
515 #if !defined(WINDOWS)
517  && (strcmp (temp->name + 1, server_name) == 0))
518 #endif
519  ))
520  {
521 #if !defined(WINDOWS)
523  {
524  hb_deregister_by_pid (temp->pid);
525  }
526  else
527 #endif
528  {
529  memset (buffer, 0, sizeof (buffer));
530  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
532  server_name, timeout);
533  css_process_start_shutdown (temp, timeout * 60, buffer);
534  }
535  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
537  server_name);
538 
539  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
540  {
542  }
543  break;
544  }
545  }
546  }
547 
548  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
550 
551  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
552  {
554  }
555 
556  if (time_buffer != NULL)
557  {
558  free_and_init (time_buffer);
559  }
560 }
561 
562 /*
563  * css_process_kill_immediate()
564  * return: none
565  * conn(in)
566  * request_id(in)
567  * server_name(in/out)
568  */
569 static void
570 css_process_kill_immediate (CSS_CONN_ENTRY * conn, unsigned short request_id, char *server_name)
571 {
572  SOCKET_QUEUE_ENTRY *temp;
573  char buffer[512];
574 
575  for (temp = css_Master_socket_anchor; temp; temp = temp->next)
576  {
577  if ((temp->name != NULL) && (strcmp (temp->name, server_name) == 0) && !IS_MASTER_CONN_NAME_HA_SERVER (temp->name)
579  {
581 
582  snprintf (buffer, 512,
584  server_name);
585  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
586  {
588  }
589  return;
590  }
591  }
593  server_name);
594  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
595  {
597  }
598 }
599 
600 /*
601  * css_send_term_signal() - send a signal to the target process
602  * return: none
603  * pid(in)
604  * This function is created to send a SIGTERM to the processe.
605  */
606 static void
608 {
609 
610 #if defined(WINDOWS)
611  HANDLE phandle;
612 
613  phandle = OpenProcess (PROCESS_TERMINATE, FALSE, pid);
614  if (phandle)
615  {
616  TerminateProcess (phandle, 0);
617  CloseHandle (phandle);
618  }
619 #else /* ! WINDOWS */
620  kill (pid, SIGTERM);
621 #endif /* ! WINDOWS */
622 }
623 
624 /*
625  * css_process_kill_master()
626  * return: none
627  */
628 static void
630 {
633 
634 #if !defined(WINDOWS)
635  unlink (css_get_master_domain_path ());
636 
637  if (hb_Resource && resource_Jobs)
638  {
640  }
641 
642  if (hb_Cluster && cluster_Jobs)
643  {
645  }
646 
647  if (!HA_DISABLED ())
648  {
650  }
651 #endif
652 
654 
655  exit (1);
656 }
657 
658 /*
659  * css_process_request_count_info()
660  * return: none
661  * conn(in)
662  * request_id(in)
663  */
664 static void
665 css_process_request_count_info (CSS_CONN_ENTRY * conn, unsigned short request_id)
666 {
667  int count;
668 
669  count = htonl (css_Total_request_count);
670  if (css_send_data (conn, request_id, (char *) &count, sizeof (int)) != NO_ERRORS)
671  {
673  }
674 }
675 
676 /*
677  * css_process_start_shutdown()
678  * return: none
679  * sock_entq(in)
680  * timeout(in) : sec
681  * buffer(in)
682  */
683 void
684 css_process_start_shutdown (SOCKET_QUEUE_ENTRY * sock_entq, int timeout, char *buffer)
685 {
687 
688  /* Send timeout delay period (in seconds) */
689  css_send_command_to_server (sock_entq, timeout);
690 
691  /* Send shutdown message to server */
692  css_send_message_to_server (sock_entq, buffer);
693 }
694 
695 /*
696  * css_process_shutdown()
697  * return: none
698  * time_buffer(in/out)
699  */
700 static void
701 css_process_shutdown (char *time_buffer)
702 {
703  int timeout;
704  SOCKET_QUEUE_ENTRY *temp;
705  char buffer[MASTER_TO_SRV_MSG_SIZE];
706 
707  timeout = ntohl ((int) *(int *) time_buffer);
708 
709  memset (buffer, 0, sizeof (buffer));
710  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
712 
713  for (temp = css_Master_socket_anchor; temp; temp = temp->next)
714  {
715  /* do not send shutdown command to master and connector, only to servers: cause connector crash */
716  if (!IS_INVALID_SOCKET (temp->fd) && !IS_MASTER_SOCKET_FD (temp->fd) && temp->name
719  {
720  css_process_start_shutdown (temp, timeout * 60, buffer);
721 
722  /* wait process terminated */
724  }
725  }
726 
727  if (css_Master_timeout == NULL)
728  {
729  css_Master_timeout = (struct timeval *) malloc (sizeof (struct timeval));
730  }
731 
732  /* check again to be sure allocation was successful */
733  if (css_Master_timeout)
734  {
735  css_Master_timeout->tv_sec = 0;
736  css_Master_timeout->tv_usec = 0;
737 
738  if (time ((time_t *) (&css_Master_timeout->tv_sec)) == (time_t) (-1))
739  {
741  return;
742  }
743  css_Master_timeout->tv_sec += timeout * 60;
744  }
746 }
747 
748 /*
749  * css_process_stop_shutdown()
750  * return: none
751  */
752 void
754 {
755  SOCKET_QUEUE_ENTRY *temp;
756 
757  if (css_Master_timeout != NULL)
758  {
760  }
761 
762  for (temp = css_Master_socket_anchor; temp; temp = temp->next)
763  {
764  /* do not send shutdown command to master and connector, only to servers: cause connector crash */
765  if (!IS_INVALID_SOCKET (temp->fd) && !IS_MASTER_SOCKET_FD (temp->fd) && temp->name
768  {
770  }
771  }
772 }
773 
774 /*
775  * css_process_get_server_ha_mode
776  * return: none
777  * conn(in)
778  * request_id(in)
779  * server_name(in/out)
780  */
781 static void
782 css_process_get_server_ha_mode (CSS_CONN_ENTRY * conn, unsigned short request_id, char *server_name)
783 {
784  SOCKET_QUEUE_ENTRY *temp;
785  char ha_state_str[64];
786  char buffer[MASTER_TO_SRV_MSG_SIZE];
787  int len;
788  int response;
789  HA_SERVER_STATE ha_state;
790 
791  for (temp = css_Master_socket_anchor; temp; temp = temp->next)
792  {
793  if ((temp->name != NULL) && (strcmp (temp->name, server_name) == 0))
794  {
796 
797  len = css_readn (temp->conn_ptr->fd, (char *) &response, sizeof (int), -1);
798  if (len < 0)
799  {
800  return;
801  }
802 
803  ha_state = (HA_SERVER_STATE) htonl (response);
804 
805  if (ha_state == HA_SERVER_STATE_NA)
806  {
807  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
809  }
810  else if ((ha_state >= HA_SERVER_STATE_IDLE) && (ha_state <= HA_SERVER_STATE_DEAD))
811  {
812  strncpy (ha_state_str, css_ha_server_state_string (ha_state), sizeof (ha_state_str) - 1);
813  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
815  temp->name, ha_state_str);
816  }
817  else
818  {
819  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
821  "unknown");
822  }
823 
824  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
825  {
827  }
828  return;
829  }
830  }
831 
832  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
834 
835  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
836  {
838  }
839 }
840 
841 /*
842  * css_process_register_ha_process()
843  * return: none
844  * conn(in):
845  * request_id(in):
846  */
847 static void
849 {
850 #if !defined(WINDOWS)
852 #endif
853 }
854 
855 /*
856  * css_process_deregister_ha_process()
857  * return: none
858  * conn(in):
859  *
860  * NOTE: this deregistration is requested directly by HA process itself
861  * , not by commdb
862  */
863 static void
865 {
866 #if !defined(WINDOWS)
867  int rv, pid;
868 
869  rv = css_receive_heartbeat_data (conn, (char *) &pid, sizeof (pid));
870  if (rv != NO_ERRORS)
871  {
872  return;
873  }
874 
875  pid = ntohl (pid);
876  hb_deregister_by_pid (pid);
877 
878  /* deregister will clean up this connection */
879 #else /* !WINDOWS */
881 #endif /* WINDOWS */
882 }
883 
884 /*
885  * css_process_register_ha_process()
886  * return: none
887  * conn(in):
888  * request_id(in):
889  */
890 static void
892 {
893 #if !defined(WINDOWS)
895 #endif
896 }
897 
898 /*
899  * css_process_ha_ping_hosts_info()
900  * return: none
901  * conn(in):
902  * request_id(in):
903  */
904 static void
905 css_process_ha_ping_host_info (CSS_CONN_ENTRY * conn, unsigned short request_id)
906 {
907 #if !defined(WINDOWS)
908  char *buffer = NULL;
909  int result;
910 
911  if (HA_DISABLED ())
912  {
913  goto error_return;
914  }
915 
916  result = hb_check_request_eligibility (conn->fd);
917  if (result != HB_HC_ELIGIBLE_LOCAL && result != HB_HC_ELIGIBLE_REMOTE)
918  {
919  goto error_return;
920  }
921 
923 
924  if (buffer == NULL)
925  {
926  goto error_return;
927  }
928 
929  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
930  {
932  }
933 
934  if (buffer != NULL)
935  {
936  free_and_init (buffer);
937  }
938  return;
939 
940 error_return:
941  if (css_send_data (conn, request_id, "\0", 1) != NO_ERRORS)
942  {
944  }
945 
946  if (buffer != NULL)
947  {
948  free_and_init (buffer);
949  }
950  return;
951 #else
952  char buffer[MASTER_TO_SRV_MSG_SIZE];
953 
954  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
956 
957  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
958  {
960  }
961 #endif
962 }
963 
964 /*
965  * css_process_ha_admin_info()
966  * return: none
967  * conn(in):
968  * request_id(in):
969  */
970 static void
971 css_process_ha_admin_info (CSS_CONN_ENTRY * conn, unsigned short request_id)
972 {
973 #if !defined(WINDOWS)
974  char *buffer = NULL;
975  int result;
976 
977  if (HA_DISABLED ())
978  {
979  goto error_return;
980  }
981 
982  result = hb_check_request_eligibility (conn->fd);
983  if (result != HB_HC_ELIGIBLE_LOCAL && result != HB_HC_ELIGIBLE_REMOTE)
984  {
985  goto error_return;
986  }
987 
988  hb_get_admin_info_string (&buffer);
989 
990  if (buffer == NULL)
991  {
992  goto error_return;
993  }
994 
995  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
996  {
998  }
999 
1000  if (buffer != NULL)
1001  {
1002  free_and_init (buffer);
1003  }
1004  return;
1005 
1006 error_return:
1007  if (css_send_data (conn, request_id, "\0", 1) != NO_ERRORS)
1008  {
1010  }
1011 
1012  if (buffer != NULL)
1013  {
1014  free_and_init (buffer);
1015  }
1016  return;
1017 #else
1018  char buffer[MASTER_TO_SRV_MSG_SIZE];
1019 
1020  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1022 
1023  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1024  {
1026  }
1027 #endif
1028 }
1029 
1030 
1031 /*
1032  * css_process_get_eof()
1033  * return: none
1034  * conn(in):
1035  */
1036 static void
1038 {
1039 #if !defined(WINDOWS)
1041 #endif
1042 }
1043 
1044 /*
1045  * css_process_ha_node_list_info()
1046  * return: none
1047  * conn(in):
1048  * request_id(in):
1049  * verbose_yn(in):
1050  */
1051 static void
1052 css_process_ha_node_list_info (CSS_CONN_ENTRY * conn, unsigned short request_id, bool verbose_yn)
1053 {
1054 #if !defined(WINDOWS)
1055  char *buffer = NULL;
1056  int result;
1057 
1058  if (HA_DISABLED ())
1059  {
1060  goto error_return;
1061  }
1062 
1063  result = hb_check_request_eligibility (conn->fd);
1064  if (result != HB_HC_ELIGIBLE_LOCAL && result != HB_HC_ELIGIBLE_REMOTE)
1065  {
1066  goto error_return;
1067  }
1068 
1069  hb_get_node_info_string (&buffer, verbose_yn);
1070 
1071  if (buffer == NULL)
1072  {
1073  goto error_return;
1074  }
1075 
1076  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1077  {
1079  }
1080 
1081  if (buffer != NULL)
1082  {
1083  free_and_init (buffer);
1084  }
1085  return;
1086 
1087 error_return:
1088  if (css_send_data (conn, request_id, "\0", 1) != NO_ERRORS)
1089  {
1091  }
1092 
1093  if (buffer != NULL)
1094  {
1095  free_and_init (buffer);
1096  }
1097  return;
1098 #else
1099  char buffer[MASTER_TO_SRV_MSG_SIZE];
1100 
1101  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1103 
1104  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1105  {
1107  }
1108 #endif
1109 
1110 }
1111 
1112 /*
1113  * css_process_ha_process_list_info()
1114  * return: none
1115  * conn(in):
1116  * request_id(in):
1117  * verbose_yn(in):
1118  */
1119 static void
1120 css_process_ha_process_list_info (CSS_CONN_ENTRY * conn, unsigned short request_id, bool verbose_yn)
1121 {
1122 #if !defined(WINDOWS)
1123  char *buffer = NULL;
1124  int result;
1125 
1126  if (HA_DISABLED ())
1127  {
1128  goto error_return;
1129  }
1130 
1131  result = hb_check_request_eligibility (conn->fd);
1132  if (result != HB_HC_ELIGIBLE_LOCAL && result != HB_HC_ELIGIBLE_REMOTE)
1133  {
1134  goto error_return;
1135  }
1136 
1137  hb_get_process_info_string (&buffer, verbose_yn);
1138 
1139  if (buffer == NULL)
1140  {
1141  goto error_return;
1142  }
1143 
1144  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1145  {
1147  }
1148 
1149  if (buffer != NULL)
1150  {
1151  free_and_init (buffer);
1152  }
1153  return;
1154 
1155 error_return:
1156  if (css_send_data (conn, request_id, "\0", 1) != NO_ERRORS)
1157  {
1159  }
1160 
1161  if (buffer != NULL)
1162  {
1163  free_and_init (buffer);
1164  }
1165  return;
1166 #else
1167  char buffer[MASTER_TO_SRV_MSG_SIZE];
1168 
1169  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1171 
1172  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1173  {
1175  }
1176 #endif
1177 }
1178 
1179 /*
1180  * css_process_kill_all_ha_process()
1181  * return: none
1182  * conn(in):
1183  * request_id(in):
1184  */
1185 static void
1186 css_process_kill_all_ha_process (CSS_CONN_ENTRY * conn, unsigned short request_id)
1187 {
1188 #if !defined(WINDOWS)
1189  char *buffer = NULL;
1190 
1191  if (HA_DISABLED ())
1192  {
1193  goto error_return;
1194  }
1195 
1197 
1198  if (buffer == NULL)
1199  {
1200  goto error_return;
1201  }
1202 
1203  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1204  {
1206  }
1207 
1208  if (buffer != NULL)
1209  {
1210  free_and_init (buffer);
1211  }
1212  return;
1213 
1214 error_return:
1215  if (css_send_data (conn, request_id, "\0", 1) != NO_ERRORS)
1216  {
1218  }
1219  if (buffer != NULL)
1220  {
1221  free_and_init (buffer);
1222  }
1223  return;
1224 #else
1225  char buffer[MASTER_TO_SRV_MSG_SIZE];
1226 
1227  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1229 
1230  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1231  {
1233  }
1234 #endif
1235 }
1236 
1237 /*
1238  * css_process_is_registered_ha_proc()
1239  * return: none
1240  * conn(in):
1241  * request_id(in):
1242  */
1243 static void
1244 css_process_is_registered_ha_proc (CSS_CONN_ENTRY * conn, unsigned short request_id, char *buf)
1245 {
1246 #if !defined(WINDOWS)
1247  if (!HA_DISABLED ())
1248  {
1249  if (hb_is_registered_process (conn, buf))
1250  {
1252  {
1254  }
1255  return;
1256  }
1257  }
1258 
1260  {
1262  }
1263  return;
1264 #else
1265  char buffer[MASTER_TO_SRV_MSG_SIZE];
1266 
1267  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1269 
1270  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1271  {
1273  }
1274 #endif
1275 }
1276 
1277 /*
1278  * css_process_ha_deregister_by_pid()
1279  * return: none
1280  * conn(in):
1281  * request_id(in):
1282  * pid_p(in):
1283  */
1284 static void
1285 css_process_ha_deregister_by_pid (CSS_CONN_ENTRY * conn, unsigned short request_id, char *pid_p)
1286 {
1287 #if !defined(WINDOWS)
1288  pid_t pid;
1289  int result;
1290 
1291  if (!HA_DISABLED ())
1292  {
1293  result = hb_check_request_eligibility (conn->fd);
1294  if (result != HB_HC_ELIGIBLE_LOCAL && result != HB_HC_ELIGIBLE_REMOTE)
1295  {
1296  goto error_return;
1297  }
1298 
1299  pid = ntohl (*((int *) pid_p));
1300  hb_deregister_by_pid (pid);
1301  }
1302  else
1303  {
1304  goto error_return;
1305  }
1306 
1308  {
1310  }
1311 
1312  return;
1313 
1314 error_return:
1316  {
1318  }
1319 
1320  return;
1321 
1322 #else
1323  char buffer[MASTER_TO_SRV_MSG_SIZE];
1324 
1325  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1327 
1328  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1329  {
1331  }
1332 #endif
1333 }
1334 
1335 /*
1336  * css_process_ha_deregister_by_args()
1337  * return: none
1338  * conn(in):
1339  * request_id(in):
1340  * pid_p(in):
1341  */
1342 static void
1343 css_process_ha_deregister_by_args (CSS_CONN_ENTRY * conn, unsigned short request_id, char *args)
1344 {
1345 #if !defined(WINDOWS)
1346  int result;
1347 
1348  if (!HA_DISABLED ())
1349  {
1350  result = hb_check_request_eligibility (conn->fd);
1351  if (result != HB_HC_ELIGIBLE_LOCAL && result != HB_HC_ELIGIBLE_REMOTE)
1352  {
1353  goto error_return;
1354  }
1355 
1356  hb_deregister_by_args (args);
1357  }
1358  else
1359  {
1360  goto error_return;
1361  }
1362 
1364  {
1366  }
1367 
1368  return;
1369 
1370 error_return:
1372  {
1374  }
1375 
1376  return;
1377 
1378 #else
1379  char buffer[MASTER_TO_SRV_MSG_SIZE];
1380 
1381  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1383 
1384  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1385  {
1387  }
1388 #endif
1389 }
1390 
1391 
1392 
1393 /*
1394  * css_process_reconfig_heartbeat()
1395  * return: none
1396  * conn(in):
1397  * request_id(in):
1398  */
1399 static void
1400 css_process_reconfig_heartbeat (CSS_CONN_ENTRY * conn, unsigned short request_id)
1401 {
1402 #if !defined(WINDOWS)
1403  char *buffer = NULL;
1404 
1405  if (HA_DISABLED ())
1406  {
1407  goto error_return;
1408  }
1409 
1410  hb_reconfig_heartbeat (&buffer);
1411  if (buffer == NULL)
1412  {
1413  goto error_return;
1414  }
1415  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1416  {
1418  }
1419 
1420  if (buffer != NULL)
1421  {
1422  free_and_init (buffer);
1423  }
1424  return;
1425 
1426 error_return:
1427  if (css_send_data (conn, request_id, "\0", 1) != NO_ERRORS)
1428  {
1430  }
1431 
1432  if (buffer != NULL)
1433  {
1434  free_and_init (buffer);
1435  }
1436  return;
1437 #else
1438  char buffer[MASTER_TO_SRV_MSG_SIZE];
1439  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1441  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1442  {
1444  }
1445 #endif
1446 }
1447 
1448 /*
1449  * css_process_deactivate_heartbeat()
1450  * return: none
1451  * conn(in):
1452  * request_id(in):
1453  */
1454 static void
1455 css_process_deactivate_heartbeat (CSS_CONN_ENTRY * conn, unsigned short request_id)
1456 {
1457 #if !defined(WINDOWS)
1458  int error = NO_ERROR;
1459  int result;
1460  char *message;
1461  char error_string[LINE_MAX];
1462  char request_from[CUB_MAXHOSTNAMELEN] = "";
1463 
1464  if (HA_DISABLED ())
1465  {
1466  goto error_return;
1467  }
1468 
1469  result = hb_check_request_eligibility (conn->fd);
1470  if (result != HB_HC_ELIGIBLE_LOCAL)
1471  {
1472  if (css_get_peer_name (conn->fd, request_from, sizeof (request_from)) != 0)
1473  {
1474  snprintf (request_from, sizeof (request_from), "UNKNOWN");
1475  }
1476  }
1477 
1478  if (result == HB_HC_FAILED)
1479  {
1480  snprintf (error_string, LINE_MAX, "%s.(failed to check eligibility of request)", HB_RESULT_FAILURE_STR);
1482  goto error_return;
1483  }
1484  else if (result == HB_HC_UNAUTHORIZED)
1485  {
1486  snprintf (error_string, LINE_MAX, "%s.(request from unauthorized host %s)", HB_RESULT_FAILURE_STR, request_from);
1488  goto error_return;
1489  }
1490  else if (result == HB_HC_ELIGIBLE_REMOTE)
1491  {
1492  hb_disable_er_log (HB_NOLOG_REMOTE_STOP, "deactivation request from %s", request_from);
1493  }
1494 
1495  error = hb_deactivate_heartbeat ();
1496  if (error != NO_ERROR)
1497  {
1498  goto error_return;
1499  }
1500 
1502  {
1504 
1505  if (css_send_data (conn, request_id, message, strlen (message) + 1) != NO_ERRORS)
1506  {
1508  return;
1509  }
1510  }
1511  else
1512  {
1513  if (css_send_data (conn, request_id, "\0", 1) != NO_ERRORS)
1514  {
1516  return;
1517  }
1518  }
1519 
1521  {
1523  }
1524 
1525  return;
1526 
1527 error_return:
1528  if (css_send_data (conn, request_id, "\0", 1) != NO_ERRORS)
1529  {
1531  return;
1532  }
1533 
1535  {
1537  }
1538 
1539  return;
1540 
1541 #else
1542  char buffer[MASTER_TO_SRV_MSG_SIZE];
1543  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1545  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1546  {
1548  }
1549 #endif
1550 }
1551 
1552 static void
1553 css_process_deact_confirm_no_server (CSS_CONN_ENTRY * conn, unsigned short request_id)
1554 {
1555 #if !defined(WINDOWS)
1556  int error;
1557 
1559  {
1560  error = css_send_data (conn, request_id, HA_REQUEST_SUCCESS, HA_REQUEST_RESULT_SIZE);
1561 
1563  }
1564  else
1565  {
1566  error = css_send_data (conn, request_id, HA_REQUEST_FAILURE, HA_REQUEST_RESULT_SIZE);
1567  }
1568 
1569  if (error != NO_ERRORS)
1570  {
1572  }
1573 
1574  return;
1575 #else
1576  char buffer[MASTER_TO_SRV_MSG_SIZE];
1577  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1579  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1580  {
1582  }
1583 #endif
1584 }
1585 
1586 static void
1587 css_process_deact_confirm_stop_all (CSS_CONN_ENTRY * conn, unsigned short request_id)
1588 {
1589 #if !defined(WINDOWS)
1590  int error;
1591 
1592  if (hb_is_deactivation_ready () == true)
1593  {
1594  error = css_send_data (conn, request_id, HA_REQUEST_SUCCESS, HA_REQUEST_RESULT_SIZE);
1595  }
1596  else
1597  {
1598  error = css_send_data (conn, request_id, HA_REQUEST_FAILURE, HA_REQUEST_RESULT_SIZE);
1599  }
1600 
1601  if (error != NO_ERRORS)
1602  {
1604  }
1605 
1606  return;
1607 #else
1608  char buffer[MASTER_TO_SRV_MSG_SIZE];
1609  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1611  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1612  {
1614  }
1615 #endif
1616 }
1617 
1618 static void
1619 css_process_deact_stop_all (CSS_CONN_ENTRY * conn, unsigned short request_id, char *deact_immediately)
1620 {
1621 #if !defined(WINDOWS)
1622  int result;
1623  char error_string[LINE_MAX];
1624  char request_from[CUB_MAXHOSTNAMELEN] = "";
1625 
1626  if (HA_DISABLED ())
1627  {
1628  goto error_return;
1629  }
1630 
1631  result = hb_check_request_eligibility (conn->fd);
1632 
1633  if (result != HB_HC_ELIGIBLE_LOCAL)
1634  {
1635  if (css_get_peer_name (conn->fd, request_from, sizeof (request_from)) != 0)
1636  {
1637  snprintf (request_from, sizeof (request_from), "UNKNOWN");
1638  }
1639  }
1640 
1641  if (result == HB_HC_FAILED)
1642  {
1643  snprintf (error_string, LINE_MAX, "%s.(failed to check eligibility of request)", HB_RESULT_FAILURE_STR);
1645  goto error_return;
1646  }
1647  else if (result == HB_HC_UNAUTHORIZED)
1648  {
1649  snprintf (error_string, LINE_MAX, "%s.(request from unauthorized host %s)", HB_RESULT_FAILURE_STR, request_from);
1651  goto error_return;
1652  }
1653  else if (result == HB_HC_ELIGIBLE_REMOTE)
1654  {
1655  hb_disable_er_log (HB_NOLOG_REMOTE_STOP, "deactivation request from %s", request_from);
1656  }
1657 
1658  if (hb_is_deactivation_started () == false)
1659  {
1661 
1662  if (deact_immediately != NULL && *((bool *) deact_immediately) == true)
1663  {
1665  }
1666  else
1667  {
1668  hb_Deactivate_immediately = false;
1669  }
1670 
1671  result = hb_prepare_deactivate_heartbeat ();
1672  if (result != NO_ERROR)
1673  {
1674  goto error_return;
1675  }
1676  }
1677 
1679  {
1681  }
1682 
1683  return;
1684 
1685 error_return:
1687  {
1689  }
1690 
1691  return;
1692 #else
1693  char buffer[MASTER_TO_SRV_MSG_SIZE];
1694  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1696  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1697  {
1699  }
1700 #endif
1701 }
1702 
1703 /*
1704  * css_process_activate_heartbeat()
1705  * return: none
1706  * conn(in):
1707  * request_id(in):
1708  */
1709 static void
1710 css_process_activate_heartbeat (CSS_CONN_ENTRY * conn, unsigned short request_id)
1711 {
1712 #if !defined(WINDOWS)
1713  int error = NO_ERROR;
1714 
1715  if (HA_DISABLED ())
1716  {
1717  goto error_return;
1718  }
1719 
1720  error = hb_activate_heartbeat ();
1721  if (error != NO_ERROR)
1722  {
1723  goto error_return;
1724  }
1725 
1727  {
1729  }
1730 
1731  return;
1732 
1733 error_return:
1735  {
1737  }
1738 
1739  return;
1740 #else
1741  char buffer[MASTER_TO_SRV_MSG_SIZE];
1742  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1744  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1745  {
1747  }
1748 #endif
1749 }
1750 
1751 /*
1752  * css_process_ha_start_util_process()
1753  * return: none
1754  * conn(in):
1755  * request_id(in):
1756  * args(in):
1757  */
1758 static void
1759 css_process_ha_start_util_process (CSS_CONN_ENTRY * conn, unsigned short request_id, char *args)
1760 {
1761 #if !defined(WINDOWS)
1762  int error = NO_ERROR;
1763  int result;
1764 
1765  if (HA_DISABLED ())
1766  {
1767  goto error_return;
1768  }
1769 
1770  result = hb_check_request_eligibility (conn->fd);
1771  if (result != HB_HC_ELIGIBLE_LOCAL && result != HB_HC_ELIGIBLE_REMOTE)
1772  {
1773  goto error_return;
1774  }
1775 
1776  error = hb_start_util_process (args);
1777  if (error != NO_ERROR)
1778  {
1779  goto error_return;
1780  }
1781 
1783  {
1785  }
1786 
1787  return;
1788 
1789 error_return:
1791  {
1793  }
1794 
1795  return;
1796 #else
1797  char buffer[MASTER_TO_SRV_MSG_SIZE];
1798 
1799  snprintf (buffer, MASTER_TO_SRV_MSG_SIZE,
1801 
1802  if (css_send_data (conn, request_id, buffer, strlen (buffer) + 1) != NO_ERRORS)
1803  {
1805  }
1806 
1807  return;
1808 #endif
1809 }
1810 
1811 /*
1812  * css_process_server_state()
1813  * return: none
1814  * conn(in)
1815  * request_id(in)
1816  * server_name(in)
1817  */
1818 static void
1819 css_process_server_state (CSS_CONN_ENTRY * conn, unsigned short request_id, char *server_name)
1820 {
1821  int state = 0;
1822 #if !defined(WINDOWS)
1823  SOCKET_QUEUE_ENTRY *temp;
1824 
1826  if (temp == NULL || IS_INVALID_SOCKET (temp->fd))
1827  {
1828  state = HB_PSTATE_DEAD;
1829  goto send_to_client;
1830  }
1831 
1832  if (!temp->ha_mode)
1833  {
1834  state = HB_PSTATE_UNKNOWN;
1835  goto send_to_client;
1836  }
1837 
1838  state = hb_return_proc_state_by_fd (temp->fd);
1839 send_to_client:
1840 #endif
1841 
1842  state = htonl (state);
1843  if (css_send_data (conn, request_id, (char *) &state, sizeof (int)) != NO_ERRORS)
1844  {
1846  }
1847 }
1848 
1849 /*
1850  * css_process_info_request() - information server main loop
1851  * return: none
1852  * conn(in)
1853  */
1854 void
1856 {
1857  int rc;
1858  int buffer_size;
1859  int request;
1860  unsigned short request_id;
1861  char *buffer = NULL;
1862 
1863  rc = css_receive_request (conn, &request_id, &request, &buffer_size);
1864  if (rc == NO_ERRORS)
1865  {
1866  if (buffer_size && css_receive_data (conn, request_id, &buffer, &buffer_size, -1) != NO_ERRORS)
1867  {
1868  if (buffer != NULL)
1869  {
1870  free_and_init (buffer);
1871  }
1873  return;
1874  }
1875  switch (request)
1876  {
1877  case GET_START_TIME:
1878  css_process_start_time_info (conn, request_id);
1879  break;
1880  case GET_SHUTDOWN_TIME:
1881  css_process_shutdown_time_info (conn, request_id);
1882  break;
1883  case GET_SERVER_COUNT:
1884  css_process_server_count_info (conn, request_id);
1885  break;
1886  case GET_REQUEST_COUNT:
1887  css_process_request_count_info (conn, request_id);
1888  break;
1889  case GET_SERVER_LIST:
1890  css_process_server_list_info (conn, request_id);
1891  break;
1892  case KILL_SLAVE_SERVER:
1893  if (buffer != NULL)
1894  {
1895  css_process_kill_slave (conn, request_id, buffer);
1896  }
1897  break;
1898  case KILL_MASTER_SERVER:
1900  break;
1901  case START_SHUTDOWN:
1902  if (buffer != NULL)
1903  {
1904  css_process_shutdown (buffer);
1905  }
1907  break;
1908  case CANCEL_SHUTDOWN:
1910  break;
1911  case KILL_SERVER_IMMEDIATE:
1912  if (buffer != NULL)
1913  {
1914  css_process_kill_immediate (conn, request_id, buffer);
1915  }
1916  break;
1917  case GET_ALL_COUNT:
1918  css_process_all_count_info (conn, request_id);
1919  break;
1920  case GET_ALL_LIST:
1921  css_process_all_list_info (conn, request_id);
1922  break;
1923  case GET_SERVER_HA_MODE:
1924  if (buffer != NULL)
1925  {
1926  css_process_get_server_ha_mode (conn, request_id, buffer);
1927  }
1928  break;
1929  case GET_HA_PING_HOST_INFO:
1930  css_process_ha_ping_host_info (conn, request_id);
1931  break;
1932  case GET_HA_NODE_LIST:
1933  css_process_ha_node_list_info (conn, request_id, false);
1934  break;
1936  css_process_ha_node_list_info (conn, request_id, true);
1937  break;
1938  case GET_HA_PROCESS_LIST:
1939  css_process_ha_process_list_info (conn, request_id, false);
1940  break;
1942  css_process_ha_process_list_info (conn, request_id, true);
1943  break;
1944  case GET_HA_ADMIN_INFO:
1945  css_process_ha_admin_info (conn, request_id);
1946  break;
1947  case KILL_ALL_HA_PROCESS:
1948  css_process_kill_all_ha_process (conn, request_id);
1949  break;
1950  case IS_REGISTERED_HA_PROC:
1951  css_process_is_registered_ha_proc (conn, request_id, buffer);
1952  break;
1954  css_process_ha_deregister_by_pid (conn, request_id, buffer);
1955  break;
1957  css_process_ha_deregister_by_args (conn, request_id, buffer);
1958  break;
1959  case RECONFIG_HEARTBEAT:
1960  css_process_reconfig_heartbeat (conn, request_id);
1961  break;
1962  case DEACTIVATE_HEARTBEAT:
1963  css_process_deactivate_heartbeat (conn, request_id);
1964  break;
1965  case DEACT_STOP_ALL:
1966  css_process_deact_stop_all (conn, request_id, buffer);
1967  break;
1969  css_process_deact_confirm_stop_all (conn, request_id);
1970  break;
1972  css_process_deact_confirm_no_server (conn, request_id);
1973  break;
1974  case ACTIVATE_HEARTBEAT:
1975  css_process_activate_heartbeat (conn, request_id);
1976  break;
1977  case GET_SERVER_STATE:
1978  if (buffer != NULL)
1979  {
1980  css_process_server_state (conn, request_id, buffer);
1981  }
1982  break;
1983  case START_HA_UTIL_PROCESS:
1984  css_process_ha_start_util_process (conn, request_id, buffer);
1985  break;
1986  default:
1987  if (buffer != NULL)
1988  {
1989  free_and_init (buffer);
1990  }
1991  return;
1992  }
1993  }
1994  else
1995  {
1997  }
1998  if (buffer != NULL)
1999  {
2000  free_and_init (buffer);
2001  }
2002 }
2003 
2004 
2005 /*
2006  * css_process_heartbeat_request() -
2007  * return: none
2008  * conn(in)
2009  */
2010 void
2012 {
2013 #if !defined(WINDOWS)
2014  int error, request;
2015  int rfd = (conn) ? conn->fd : INVALID_SOCKET;
2016  char *buffer = NULL;
2017 
2018  error = css_receive_heartbeat_request (conn, &request);
2019  if (error == NO_ERRORS)
2020  {
2021  switch (request)
2022  {
2025  break;
2028  break;
2029  case SERVER_CHANGE_HA_MODE:
2031  break;
2032  case SERVER_GET_EOF:
2033  css_process_get_eof (conn);
2034  break;
2035  default:
2036  MASTER_ER_LOG_DEBUG (ARG_FILE_LINE, "receive unexpected request. (request:%d).\n", request);
2037  break;
2038  }
2039  }
2040  else
2041  {
2042  MASTER_ER_LOG_DEBUG (ARG_FILE_LINE, "receive error request. (error:%d). \n", error);
2044  }
2045 #else
2047 #endif
2048 
2049  return;
2050 }
void hb_finish_deactivate_server_info(void)
static void css_process_change_ha_mode(CSS_CONN_ENTRY *conn)
#define HA_REQUEST_SUCCESS
static void css_send_command_to_server(const SOCKET_QUEUE_ENTRY *sock_entry, int command)
#define NO_ERROR
Definition: error_code.h:46
static void css_process_kill_all_ha_process(CSS_CONN_ENTRY *conn, unsigned short request_id)
int hb_start_util_process(char *args)
static void css_process_request_count_info(CSS_CONN_ENTRY *conn, unsigned short request_id)
static void css_process_all_list_info(CSS_CONN_ENTRY *conn, unsigned short request_id)
char * name
Definition: master_util.h:84
static void css_process_deact_confirm_stop_all(CSS_CONN_ENTRY *conn, unsigned short request_id)
#define IS_MASTER_CONN_NAME_HA_APPLYLOG(name)
Definition: master_util.h:104
int css_Total_request_count
Definition: master.c:119
static void css_process_deact_confirm_no_server(CSS_CONN_ENTRY *conn, unsigned short request_id)
void hb_deregister_by_args(char *args)
void hb_get_admin_info_string(char **str)
#define IS_MASTER_CONN_NAME_DRIVER(name)
Definition: master_util.h:101
unsigned int htonl(unsigned int from)
static void css_process_is_registered_ha_proc(CSS_CONN_ENTRY *conn, unsigned short request_id, char *buf)
#define HA_REQUEST_FAILURE
static void css_cleanup_info_connection(CSS_CONN_ENTRY *conn)
void master_util_wait_proc_terminate(int pid)
Definition: master_util.c:72
#define IS_MASTER_CONN_NAME_HA_SERVER(name)
Definition: master_util.h:102
void hb_reconfig_heartbeat(char **str)
#define HA_COPYLOGDB_FORMAT_STRING
CSS_CONN_ENTRY * conn_ptr
Definition: master_util.h:87
int hb_activate_heartbeat(void)
void hb_kill_all_heartbeat_process(char **str)
void css_remove_entry_by_conn(CSS_CONN_ENTRY *conn_p, SOCKET_QUEUE_ENTRY **anchor_p)
Definition: master.c:1287
static void css_process_ha_ping_host_info(CSS_CONN_ENTRY *conn, unsigned short request_id)
void hb_register_new_process(CSS_CONN_ENTRY *conn)
SOCKET fd
int css_receive_heartbeat_request(CSS_CONN_ENTRY *conn, int *command)
Definition: heartbeat.c:202
#define MASTER_TO_SRV_MSG_SIZE
static void css_process_deactivate_heartbeat(CSS_CONN_ENTRY *conn, unsigned short request_id)
static void css_process_all_count_info(CSS_CONN_ENTRY *conn, unsigned short request_id)
void css_process_start_shutdown(SOCKET_QUEUE_ENTRY *sock_entq, int timeout, char *buffer)
static void css_process_kill_slave(CSS_CONN_ENTRY *conn, unsigned short request_id, char *server_name)
int css_receive_heartbeat_data(CSS_CONN_ENTRY *conn, char *data, int size)
Definition: heartbeat.c:230
HB_JOB * cluster_Jobs
#define INVALID_SOCKET
Definition: porting.h:483
int css_receive_request(CSS_CONN_ENTRY *conn, unsigned short *rid, int *request, int *buffer_size)
static void css_process_activate_heartbeat(CSS_CONN_ENTRY *conn, unsigned short request_id)
#define HB_RESULT_FAILURE_STR
int hb_return_proc_state_by_fd(int sfd)
static void css_process_ha_admin_info(CSS_CONN_ENTRY *conn, unsigned short request_id)
#define HA_REQUEST_RESULT_SIZE
#define ERR_CSS_MINFO_MESSAGE
Definition: error_code.h:421
void er_final(ER_FINAL_CODE do_global_final)
#define HA_SERVER_FORMAT_STRING
void css_process_heartbeat_request(CSS_CONN_ENTRY *conn)
void hb_resource_receive_changemode(CSS_CONN_ENTRY *conn)
void hb_start_deactivate_server_info(void)
SOCKET fd
Definition: master_util.h:77
static void css_process_ha_deregister_by_args(CSS_CONN_ENTRY *conn, unsigned short request_id, char *args)
const char * css_ha_server_state_string(HA_SERVER_STATE state)
static void css_process_register_ha_process(CSS_CONN_ENTRY *conn)
void hb_resource_receive_get_eof(CSS_CONN_ENTRY *conn)
int ha_mode
Definition: master_util.h:89
bool hb_is_registered_process(CSS_CONN_ENTRY *conn, char *args)
static void css_process_server_list_info(CSS_CONN_ENTRY *conn, unsigned short request_id)
#define IS_INVALID_SOCKET(socket)
Definition: porting.h:484
void hb_resource_shutdown_and_cleanup(void)
int info_p
Definition: master_util.h:81
static void css_send_message_to_server(const SOCKET_QUEUE_ENTRY *sock_entry, const char *message)
static void css_process_deregister_ha_process(CSS_CONN_ENTRY *conn)
void css_shutdown_socket(SOCKET fd)
Definition: tcp.c:1179
static int rv
Definition: area_alloc.c:52
void hb_get_process_info_string(char **str, bool verbose_yn)
#define HB_CMD_DEACTIVATE_STR
bool hb_is_deactivation_ready(void)
#define NULL
Definition: freelistheap.h:34
pid_t pid
Definition: dynamic_load.c:955
#define ER_HB_COMMAND_EXECUTION
Definition: error_code.h:1240
void css_process_stop_shutdown(void)
char * version_string
Definition: master_util.h:85
static void css_process_ha_process_list_info(CSS_CONN_ENTRY *conn, unsigned short request_id, bool verbose_yn)
static void css_process_ha_deregister_by_pid(CSS_CONN_ENTRY *conn, unsigned short request_id, char *pid_p)
#define HA_APPLYLOGDB_FORMAT_STRING
Definition: master_util.h:75
static void css_process_kill_immediate(CSS_CONN_ENTRY *conn, unsigned short request_id, char *server_name)
int pid
Definition: master_util.h:83
int count(int &result, const cub_regex_object &reg, const std::string &src, const int position, const INTL_CODESET codeset)
SOCKET css_Master_socket_fd[2]
Definition: master.c:122
static void css_process_server_state(CSS_CONN_ENTRY *conn, unsigned short request_id, char *server_name)
HB_CLUSTER * hb_Cluster
#define MASTER_ER_LOG_DEBUG(...)
Definition: master_util.h:65
static void css_process_ha_node_list_info(CSS_CONN_ENTRY *conn, unsigned short request_id, bool verbose_yn)
void hb_disable_er_log(int reason, const char *msg_fmt,...)
HB_RESOURCE * hb_Resource
static void error(const char *msg)
Definition: gencat.c:331
#define SERVER_FORMAT_STRING
#define MASTER_ER_SET(...)
Definition: master_util.h:47
static int rc
Definition: serial.c:50
int css_readn(SOCKET fd, char *ptr, int nbytes, int timeout)
int css_receive_data(CSS_CONN_ENTRY *conn, unsigned short req_id, char **buffer, int *buffer_size, int timeout)
static void css_process_ha_start_util_process(CSS_CONN_ENTRY *conn, unsigned short request_id, char *args)
#define ARG_FILE_LINE
Definition: error_manager.h:44
static void css_process_reconfig_heartbeat(CSS_CONN_ENTRY *conn, unsigned short request_id)
char * css_get_master_domain_path(void)
Definition: tcp.c:155
#define ER_HB_STOPPED
Definition: error_code.h:1237
bool hb_Deactivate_immediately
static void css_process_deact_stop_all(CSS_CONN_ENTRY *conn, unsigned short request_id, char *deact_immediately)
#define free_and_init(ptr)
Definition: memory_alloc.h:147
#define strlen(s1)
Definition: intl_support.c:43
static void css_process_start_time_info(CSS_CONN_ENTRY *conn, unsigned short request_id)
struct timeval * css_Master_timeout
Definition: master.c:111
static void css_process_get_server_ha_mode(CSS_CONN_ENTRY *conn, unsigned short request_id, char *server_name)
void hb_cluster_shutdown_and_cleanup(void)
static void css_process_server_count_info(CSS_CONN_ENTRY *conn, unsigned short request_id)
int hb_get_deactivating_server_count(void)
#define FALSE
Definition: broker_admin.c:50
static void css_process_shutdown(char *time_buffer)
static void css_process_shutdown_time_info(CSS_CONN_ENTRY *conn, unsigned short request_id)
int hb_deactivate_heartbeat(void)
char * msgcat_message(int cat_id, int set_id, int msg_id)
int hb_check_request_eligibility(SOCKET sd)
void hb_deregister_by_pid(pid_t pid)
int css_get_peer_name(SOCKET sockfd, char *hostname, size_t len)
Definition: tcp.c:1592
void hb_get_ping_host_info_string(char **str)
#define HA_DISABLED()
struct socket_queue_entry * next
Definition: master_util.h:90
void css_process_info_request(CSS_CONN_ENTRY *conn)
int hb_prepare_deactivate_heartbeat(void)
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_send_term_signal(int pid)
enum ha_server_state HA_SERVER_STATE
Definition: boot.h:126
SOCKET_QUEUE_ENTRY * css_return_entry_of_server(char *name_p, SOCKET_QUEUE_ENTRY *anchor_p)
Definition: master.c:1386
#define CUB_MAXHOSTNAMELEN
Definition: porting.h:379
const char * rel_release_string(void)
bool hb_is_deactivation_started(void)
#define IS_MASTER_CONN_NAME_HA_COPYLOG(name)
Definition: master_util.h:103
static void css_process_kill_master(void)
#define IS_MASTER_SOCKET_FD(FD)
HB_JOB * resource_Jobs
SOCKET_QUEUE_ENTRY * css_Master_socket_anchor
Definition: master.c:125
void hb_get_node_info_string(char **str, bool verbose_yn)
time_t css_Start_time
Definition: master.c:118
void hb_cleanup_conn_and_start_process(CSS_CONN_ENTRY *conn, SOCKET sfd)
static void css_process_get_eof(CSS_CONN_ENTRY *conn)
#define MSGCAT_CATALOG_UTILS