CUBRID Engine  latest
broker_admin_pub.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 /*
21  * broker_admin_pub.c -
22  */
23 
24 #ident "$Id$"
25 
26 #if defined(WINDOWS)
27 #include <winsock2.h>
28 #include <windows.h>
29 #endif /* WINDOWS */
30 
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <sys/types.h>
35 #include <sys/stat.h>
36 #include <signal.h>
37 #include <time.h>
38 #include <errno.h>
39 #include <assert.h>
40 
41 #if defined(WINDOWS)
42 #include <direct.h>
43 #include <process.h>
44 #include <io.h>
45 #else /* WINDOWS */
46 #include <sys/time.h>
47 #include <sys/socket.h>
48 #include <sys/un.h>
49 #include <netinet/in.h>
50 #include <arpa/inet.h>
51 #include <netdb.h>
52 #include <math.h>
53 #endif /* WINDOWS */
54 
55 #if defined(LINUX)
56 #include <sys/resource.h>
57 #endif /* LINUX */
58 
59 #include "porting.h"
60 #include "cas_common.h"
61 #include "broker_shm.h"
62 #include "shard_metadata.h"
63 #include "shard_shm.h"
64 #include "shard_key_func.h"
65 #include "broker_util.h"
66 #include "broker_env_def.h"
67 #include "broker_process_size.h"
68 #include "broker_admin_pub.h"
69 #include "broker_filename.h"
70 #include "broker_error.h"
71 #include "cas_sql_log2.h"
72 #include "broker_acl.h"
73 #include "chartype.h"
74 #include "cubrid_getopt.h"
75 #include "dbtype_def.h"
76 
77 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
78 #define DB_EMPTY_SESSION (0)
79 #endif /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
80 
81 #define ADMIN_ERR_MSG_SIZE BROKER_PATH_MAX * 2
82 
83 #define MAKE_VERSION(MAJOR, MINOR) (((MAJOR) << 8) | (MINOR))
84 
85 #define SHM_OPEN_ERR_MSG(BUF, ERRCODE, OSERRCODE) \
86  do { \
87  int _err = ERRCODE, _os_err = OSERRCODE; \
88  int _msglen = 0; \
89  char *_msg = NULL; \
90  if (_err == UW_ER_SHM_OPEN_MAGIC) { \
91  sprintf(BUF, "Cannot open shared memory (Version mismatched)"); \
92  } \
93  else { \
94  if (_os_err > 0) \
95  _msg = strerror(_os_err); \
96  _msglen = sprintf(BUF, "Cannot open shared memory"); \
97  if (_msg != NULL) \
98  _msglen += sprintf(BUF + _msglen, " (os error = %s)", _msg); \
99  } \
100  } while (0)
101 
102 #define MEMBER_SIZE(TYPE, MEMBER) ((int) sizeof(((TYPE *)0)->MEMBER))
103 #define NUM_OF_DIGITS(NUMBER) (int)log10(NUMBER) + 1
104 
105 #define ALL_PROXY -1
106 #define ALL_SHARD -1
107 #define ALL_AS -1
108 
110 
111 static int shard_shm_set_param_proxy (T_SHM_PROXY * proxy_p, const char *param_name, const char *param_value,
112  int proxy_id);
113 static int shard_shm_set_param_proxy_internal (T_PROXY_INFO * proxy_info_p, const char *param_name,
114  const char *param_value);
115 #if defined (ENABLE_UNUSED_FUNCTION)
116 static int shard_shm_set_param_shard (T_PROXY_INFO * proxy_info_p, const char *param_name, const char *param_value,
117  int shard_id);
118 static int shard_shm_set_param_shard_internal (T_SHARD_CONN_INFO * shard_conn_info_p, const char *param_name,
119  const char *param_value);
120 static int shard_shm_set_param_shard_in_proxy (T_SHM_PROXY * proxy_p, const char *param_name, const char *param_value,
121  int proxy_id, int shard_id);
122 #endif /* ENABLE_UNUSED_FUNCTION */
123 static int shard_shm_set_param_as (T_PROXY_INFO * proxy_info_p, T_SHARD_INFO * shard_info_p, const char *param_name,
124  const char *param_value, int as_number);
125 static int shard_shm_set_param_as_internal (T_APPL_SERVER_INFO * as_info, const char *param_name,
126  const char *param_value);
127 static int shard_shm_set_param_as_in_shard (T_PROXY_INFO * proxy_info_p, const char *param_name,
128  const char *param_value, int shard_id, int as_number);
129 static int shard_shm_set_param_as_in_proxy (T_SHM_PROXY * proxy_p, const char *param_name, const char *param_value,
130  int proxy_id, int shard_id, int as_number);
131 static int shard_shm_check_max_file_open_limit (T_BROKER_INFO * br_info, T_SHM_PROXY * proxy_p);
133 static void get_upper_str (char *upper_str, int len, char *value);
134 
135 static void rename_error_log_file_name (char *error_log_file, struct tm *ct);
136 
137 static int br_activate (T_BROKER_INFO * br_info, int master_shm_id, T_SHM_BROKER * shm_br);
138 static int br_inactivate (T_BROKER_INFO *);
140  T_APPL_SERVER_INFO * as_info_p, int as_idex, char **env, int env_num);
141 static void as_inactivate (T_APPL_SERVER_INFO * as_info_p, char *broker_name, int shard_flag);
142 static int check_shard_conn (T_SHM_APPL_SERVER * shm_as_p, T_SHM_PROXY * shm_proxy_p);
143 static int check_shard_as_conn (T_SHM_APPL_SERVER * shm_as_p, T_SHARD_INFO * shard_info_p);
144 
145 static void free_env (char **env, int env_num);
146 static char **make_env (char *env_file, int *env_num);
147 
148 static int broker_create_dir (const char *new_dir);
149 
151  char **env, int env_num);
153  int proxy_id, char **env, int env_num);
155 
156 #if !defined(WINDOWS)
157 #if defined (ENABLE_UNUSED_FUNCTION)
158 static int get_cubrid_version (void);
159 #endif
160 #endif /* !WINDOWS */
161 
163 
165 
166 #if !defined(WINDOWS) && !defined(LINUX)
167 extern char **environ;
168 #endif
169 
170 #if defined(WINDOWS)
171 void
172 unix_style_path (char *path)
173 {
174  char *p;
175  for (p = path; *p; p++)
176  {
177  if (*p == '\\')
178  *p = '/';
179  }
180 }
181 #endif /* WINDOWS */
182 
183 static int
184 broker_create_dir (const char *new_dir)
185 {
186  char *p, path[BROKER_PATH_MAX];
187 
188  if (new_dir == NULL)
189  return -1;
190 
191  strcpy (path, new_dir);
192  trim (path);
193 
194 #if defined(WINDOWS)
195  unix_style_path (path);
196 #endif /* WINDOWS */
197 
198  p = path;
199 #if defined(WINDOWS)
200  if (path[0] == '/')
201  p = path + 1;
202  else if (strlen (path) > 3 && path[2] == '/')
203  p = path + 3;
204 #else /* WINDOWS */
205  if (path[0] == '/')
206  {
207  p = path + 1;
208  }
209 #endif /* WINDOWS */
210 
211  while (p != NULL)
212  {
213  p = strchr (p, '/');
214  if (p != NULL)
215  *p = '\0';
216  if (access (path, F_OK) < 0)
217  {
218  if (mkdir (path, 0777) < 0)
219  {
220  return -1;
221  }
222  }
223  if (p != NULL)
224  {
225  *p = '/';
226  p++;
227  }
228  }
229  return 0;
230 }
231 
232 #if defined (ENABLE_UNUSED_FUNCTION)
233 int
234 admin_isstarted_cmd (int master_shm_id)
235 {
237 
238  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
239  if (shm_br == NULL)
240  return 0;
241  uw_shm_detach (shm_br);
242  return 1;
243 }
244 #endif /* ENABLE_UNUSED_FUNCTION */
245 
246 int
247 admin_start_cmd (T_BROKER_INFO * br_info, int br_num, int master_shm_id, bool acl_flag, char *acl_file)
248 {
249  int i;
250  int res = 0;
251  char path[BROKER_PATH_MAX];
252  char upper_broker_name[BROKER_NAME_LEN];
255  T_SHM_PROXY *shm_proxy_p = NULL;
256 
257  if (br_num <= 0)
258  {
259  strcpy (admin_err_msg, "Cannot start CUBRID Broker. (number of broker is 0)");
260  return -1;
261  }
262  chdir ("..");
269 #if !defined(WINDOWS)
272 #endif /* !WINDOWS */
273 
274 
275  for (i = 0; i < br_num; i++)
276  {
277 #if !defined(WINDOWS)
278  /* prevent the broker from hanging due to an excessively long path socket path length =
279  * sock_path[broker_name].[as_index] */
280  if (strlen (path) + strlen (br_info[i].name) + 1 + NUM_OF_DIGITS (br_info[i].appl_server_max_num) >
281  MEMBER_SIZE (struct sockaddr_un, sun_path) - 1)
282  {
283  snprintf_dots_truncate (admin_err_msg, sizeof (admin_err_msg) - 1, "The socket path is too long (>%d): %s",
284  MEMBER_SIZE (struct sockaddr_un, sun_path), path);
285  return -1;
286  }
287 #endif /* !WINDOWS */
288  broker_create_dir (br_info[i].log_dir);
289  broker_create_dir (br_info[i].slow_log_dir);
290  broker_create_dir (br_info[i].err_log_dir);
291  broker_create_dir (br_info[i].access_log_dir);
292 
293  if (br_info[i].shard_flag == ON)
294  {
295  broker_create_dir (br_info[i].proxy_log_dir);
296  }
297  }
298  chdir (envvar_bindir_file (path, BROKER_PATH_MAX, ""));
299 
300  /* create master shared memory */
301  shm_br = broker_shm_initialize_shm_broker (master_shm_id, br_info, br_num, acl_flag, acl_file);
302 
303  if (shm_br == NULL)
304  {
305  strcpy (admin_err_msg, "failed to initialize broker shared memory");
306  return -1;
307  }
308 
309  for (i = 0; i < br_num; i++)
310  {
311  if (br_info[i].shard_flag == OFF)
312  {
313  continue;
314  }
315 
316  if (br_info[i].shard_db_password[0] == '\0')
317  {
318  get_shard_db_password (&shm_br->br_info[i]);
319  }
320 
321  get_upper_str (upper_broker_name, BROKER_NAME_LEN, br_info[i].name);
322 
323  snprintf (shard_db_password_env_str[i], sizeof (shard_db_password_env_str[i]), "%s_SHARD_DB_PASSWORD=",
324  upper_broker_name);
325  putenv (shard_db_password_env_str[i]);
326  }
327 
328  for (i = 0; i < br_num; i++)
329  {
330  shm_as_p = NULL;
331  shm_proxy_p = NULL;
332 
333  if (br_info[i].service_flag == ON)
334  {
335  if (br_info[i].shard_flag == ON)
336 
337  {
338  shm_proxy_p = shard_shm_initialize_shm_proxy (&(shm_br->br_info[i]));
339 
340  if (shm_proxy_p == NULL)
341  {
342  sprintf (admin_err_msg, "%s: failed to initialize proxy shared memory.", br_info->name);
343 
344  res = -1;
345  break;
346  }
347 
348  if (shard_shm_check_max_file_open_limit (&shm_br->br_info[i], shm_proxy_p) < 0)
349  {
350  res = -1;
351  break;
352  }
353  }
354 
355  shm_as_p = broker_shm_initialize_shm_as (&(shm_br->br_info[i]), shm_proxy_p);
356  if (shm_as_p == NULL)
357  {
358  sprintf (admin_err_msg, "%s: failed to initialize appl server shared memory.", br_info->name);
359 
360  res = -1;
361  break;
362  }
363 
364  if (access_control_set_shm (shm_as_p, &shm_br->br_info[i], shm_br, admin_err_msg) < 0)
365  {
366  res = -1;
367  break;
368  }
369 
370  res = br_activate (&(shm_br->br_info[i]), master_shm_id, shm_br);
371 
372  if (shm_br->br_info[i].shard_flag == ON && res == 0)
373  {
374  res = check_shard_conn (shm_as_p, shm_proxy_p);
375  }
376 
377  if (res < 0)
378  {
379  break;
380  }
381 
382  if (shm_as_p)
383  {
384  uw_shm_detach (shm_as_p);
385  }
386  if (shm_proxy_p)
387  {
388  uw_shm_detach (shm_proxy_p);
389  }
390 
391  }
392  }
393 
394  if (res < 0)
395  {
396  char err_msg_backup[ADMIN_ERR_MSG_SIZE];
397  memcpy (err_msg_backup, admin_err_msg, ADMIN_ERR_MSG_SIZE);
398 
399  /* if shm_as_p == NULL then, it is expected that failed creating shared memory */
400  if (shm_as_p == NULL)
401  {
402  if (shm_br->br_info[i].shard_flag == ON && shm_proxy_p)
403  {
404  uw_shm_detach (shm_proxy_p);
405  shm_proxy_p = NULL;
406 
407  uw_shm_destroy (shm_br->br_info[i].proxy_shm_id);
408  }
409 
410  --i;
411  }
412 
413  for (; i >= 0; i--)
414  {
415  br_inactivate (&(shm_br->br_info[i]));
416 
418  if (shm_br->br_info[i].shard_flag == ON)
419  {
420  uw_shm_destroy ((shm_br->br_info[i].proxy_shm_id));
421  }
422  }
423 
424  memcpy (admin_err_msg, err_msg_backup, ADMIN_ERR_MSG_SIZE);
425  }
426  if (shm_br)
427  {
428  uw_shm_detach (shm_br);
429  }
430 
431  if (res < 0)
432  {
433  uw_shm_destroy (master_shm_id);
434 
435  if (shm_as_p)
436  {
437  uw_shm_detach (shm_as_p);
438  }
439  if (shm_proxy_p)
440  {
441  uw_shm_detach (shm_proxy_p);
442  }
443  }
444 #if defined(WINDOWS)
445  else
446  {
447  char shm_id_env_str[128];
448  sprintf (shm_id_env_str, "%s=%d", MASTER_SHM_KEY_ENV_STR, master_shm_id);
449  putenv (shm_id_env_str);
450  run_child (NAME_UC_SHM);
451  }
452 #endif /* WINDOWS */
453 
454  return res;
455 }
456 
457 int
458 admin_stop_cmd (int master_shm_id)
459 {
461  int i, res;
462  char err_msg_backup[ADMIN_ERR_MSG_SIZE];
463 
464  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
465  if (shm_br == NULL)
466  {
468  return -1;
469  }
470 
471 #if !defined(WINDOWS)
472  if (shm_br->owner_uid != getuid ())
473  {
474  strcpy (admin_err_msg, "Cannot stop CUBRID Broker. (Not owner)\n");
475  return -1;
476  }
477 #endif /* WINDOWS */
478 
479  memcpy (err_msg_backup, admin_err_msg, ADMIN_ERR_MSG_SIZE);
480 
481  for (i = 0; i < MAX_BROKER_NUM && i < shm_br->num_broker; i++)
482  {
483  if (shm_br->br_info[i].service_flag == ON)
484  {
485  res = br_inactivate (&(shm_br->br_info[i]));
486  if (res < 0)
487  {
488  sprintf (admin_err_msg, "Cannot inactivate broker [%s]", shm_br->br_info[i].name);
489  uw_shm_detach (shm_br);
490  return -1;
491  }
492  else
493  {
495  if (shm_br->br_info[i].shard_flag == ON)
496  {
497  uw_shm_destroy ((shm_br->br_info[i].proxy_shm_id));
498  }
499  }
500  }
501  }
502 
503  memcpy (admin_err_msg, err_msg_backup, ADMIN_ERR_MSG_SIZE);
504 
505  shm_br->magic = 0;
506 #if defined(WINDOWS)
507  uw_shm_detach (shm_br);
508 #endif /* WINDOWS */
509  uw_shm_destroy (master_shm_id);
510 
511  return 0;
512 }
513 
514 int
515 admin_add_cmd (int master_shm_id, const char *broker)
516 {
518  T_SHM_APPL_SERVER *shm_appl_server;
519  int i, br_index;
520  int appl_shm_key = 0, as_index;
521  char **env = NULL;
522  int env_num;
523 
524  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
525  if (shm_br == NULL)
526  {
528  return -1;
529  }
530  br_index = -1;
531  for (i = 0; i < shm_br->num_broker; i++)
532  {
533  if (strcasecmp (broker, shm_br->br_info[i].name) == 0)
534  {
535  appl_shm_key = shm_br->br_info[i].appl_server_shm_id;
536  br_index = i;
537  break;
538  }
539  }
540  if (br_index < 0)
541  {
542  sprintf (admin_err_msg, "Cannot find broker [%s]", broker);
543  uw_shm_detach (shm_br);
544  return -1;
545  }
546  if (shm_br->br_info[br_index].shard_flag == ON)
547  {
548  uw_shm_detach (shm_br);
549  return 0;
550  }
551 
552  if (shm_br->br_info[br_index].auto_add_appl_server == ON)
553  {
554  uw_shm_detach (shm_br);
555  return 0;
556  }
557 
558  shm_appl_server = (T_SHM_APPL_SERVER *) uw_shm_open (appl_shm_key, SHM_APPL_SERVER, SHM_MODE_ADMIN);
559  if (shm_appl_server == NULL)
560  {
562  uw_shm_detach (shm_br);
563  return -1;
564  }
565 
566  if (shm_br->br_info[br_index].appl_server_num >= shm_br->br_info[br_index].appl_server_max_num)
567  {
568  strcpy (admin_err_msg, "Cannot add appl server\n");
569  uw_shm_detach (shm_br);
570  uw_shm_detach (shm_appl_server);
571  return -1;
572  }
573 
574  as_index = shm_br->br_info[br_index].appl_server_num;
575 
576  (shm_br->br_info[br_index].appl_server_num)++;
577  (shm_appl_server->num_appl_server)++;
578 
579  env = make_env (shm_br->br_info[br_index].source_env, &env_num);
580 
581  as_activate (shm_br, &(shm_br->br_info[br_index]), shm_appl_server, &(shm_appl_server->as_info[as_index]), as_index,
582  env, env_num);
583 
584  shm_appl_server->as_info[as_index].service_flag = SERVICE_ON;
585 
586  uw_shm_detach (shm_appl_server);
587  uw_shm_detach (shm_br);
588  free_env (env, env_num);
589 
590  return 0;
591 }
592 
593 int
594 admin_restart_cmd (int master_shm_id, const char *broker, int as_index)
595 {
598  int i, br_index, appl_shm_key;
599  int pid;
600  char **env = NULL;
601  int env_num;
602  char appl_server_shm_key_str[32];
603  char appl_name[APPL_SERVER_NAME_MAX_SIZE];
604 #if !defined(WINDOWS)
605  char argv0[128];
606 #endif /* !WINDOWS */
607 
608  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
609  if (shm_br == NULL)
610  {
612  goto restart_error;
613  }
614  br_index = -1;
615  for (i = 0; i < shm_br->num_broker; i++)
616  {
617  if (strcasecmp (broker, shm_br->br_info[i].name) == 0)
618  {
619  appl_shm_key = shm_br->br_info[i].appl_server_shm_id;
620  br_index = i;
621  break;
622  }
623  }
624  if (br_index < 0)
625  {
626  sprintf (admin_err_msg, "Cannot find broker [%s]\n", broker);
627  goto restart_error;
628  }
629  if (shm_br->br_info[br_index].shard_flag == ON)
630  {
631  uw_shm_detach (shm_br);
632  return 0;
633  }
634 
635  shm_appl = (T_SHM_APPL_SERVER *) uw_shm_open (appl_shm_key, SHM_APPL_SERVER, SHM_MODE_ADMIN);
636  if (shm_appl == NULL)
637  {
639  goto restart_error;
640  }
641 
642  if (as_index < 1 || as_index > shm_br->br_info[br_index].appl_server_max_num)
643  {
644  strcpy (admin_err_msg, "Cannot restart appl server\n");
645  goto restart_error;
646  }
647  as_index--;
648 
649  if (shm_appl->as_info[as_index].service_flag != SERVICE_ON)
650  {
651  uw_shm_detach (shm_appl);
652  uw_shm_detach (shm_br);
653  return 0;
654  }
655 
656  if (IS_APPL_SERVER_TYPE_CAS (shm_br->br_info[br_index].appl_server))
657  {
658  ut_kill_as_process (shm_appl->as_info[as_index].pid, shm_br->br_info[br_index].name, as_index,
659  shm_appl->shard_flag);
660 
661  shm_appl->as_info[as_index].uts_status = UTS_STATUS_BUSY;
662  uw_shm_detach (shm_appl);
663  uw_shm_detach (shm_br);
664  return 0;
665  }
666 
667  /* mutex entry section */
668  shm_appl->as_info[as_index].mutex_flag[SHM_MUTEX_ADMIN] = TRUE;
669  shm_appl->as_info[as_index].mutex_turn = SHM_MUTEX_BROKER;
670  while ((shm_appl->as_info[as_index].mutex_flag[SHM_MUTEX_BROKER] == TRUE)
671  && (shm_appl->as_info[as_index].mutex_turn == SHM_MUTEX_BROKER))
672  { /* no-op */
673 #if defined(WINDOWS)
674  int a;
675  a = 0;
676 #endif /* WINDOWS */
677  }
678 
679  shm_appl->as_info[as_index].uts_status = UTS_STATUS_BUSY;
680 
681  if (shm_appl->as_info[as_index].pid)
682  {
683  ut_kill_as_process (shm_appl->as_info[as_index].pid, shm_br->br_info[br_index].name, as_index,
684  shm_appl->shard_flag);
685  }
686 
687  SLEEP_SEC (1);
688 
689  env = make_env (shm_br->br_info[br_index].source_env, &env_num);
690 
691  shm_appl->as_info[as_index].service_ready_flag = FALSE;
692 
693 #if defined(WINDOWS)
694  pid = 0;
695 #else /* WINDOWS */
696  pid = fork ();
697  if (pid < 0)
698  {
699  perror ("fork");
700  }
701 #endif /* !WINDOWS */
702 
703  if (pid == 0)
704  {
705  if (env != NULL)
706  {
707  for (i = 0; i < env_num; i++)
708  putenv (env[i]);
709  }
710 
711  sprintf (appl_server_shm_key_str, "%s=%d", APPL_SERVER_SHM_KEY_STR, shm_br->br_info[br_index].appl_server_shm_id);
712  putenv (appl_server_shm_key_str);
713  strcpy (appl_name, shm_appl->appl_server_name);
714 
715 #if !defined(WINDOWS)
716  snprintf (argv0, sizeof (argv0) - 1, "%s_%s_%d", shm_br->br_info[br_index].name, appl_name, as_index + 1);
717  uw_shm_detach (shm_br);
718  uw_shm_detach (shm_appl);
719 #endif /* !WINDOWS */
720 
721 #if defined(WINDOWS)
722  pid = run_child (appl_name);
723 #else /* WINDOWS */
724  if (execle (appl_name, argv0, NULL, environ) < 0)
725  {
726  perror ("execle");
727  }
728  exit (0);
729 #endif /* !WINDOWS */
730  }
731 
732  if (ut_is_appl_server_ready (pid, &shm_appl->as_info[as_index].service_ready_flag) == false)
733  {
734  snprintf_dots_truncate (admin_err_msg, ADMIN_ERR_MSG_SIZE, "Could not start the application server: %s\n",
735  shm_appl->appl_server_name);
736  goto restart_error;
737  }
738 
739  shm_appl->as_info[as_index].uts_status = UTS_STATUS_IDLE;
740  shm_appl->as_info[as_index].pid = pid;
741 
742  shm_appl->as_info[as_index].reset_flag = FALSE;
743  shm_appl->as_info[as_index].psize = getsize (shm_appl->as_info[as_index].pid);
744  shm_appl->as_info[as_index].psize_time = time (NULL);
745  shm_appl->as_info[as_index].last_access_time = time (NULL);
746  shm_appl->as_info[as_index].transaction_start_time = (time_t) 0;
747  shm_appl->as_info[as_index].clt_appl_name[0] = '\0';
748  shm_appl->as_info[as_index].clt_req_path_info[0] = '\0';
749  shm_appl->as_info[as_index].database_name[0] = '\0';
750  shm_appl->as_info[as_index].database_host[0] = '\0';
751  shm_appl->as_info[as_index].last_connect_time = 0;
752 
753  memset (&shm_appl->as_info[as_index].cas_clt_ip[0], 0x0, sizeof (shm_appl->as_info[as_index].cas_clt_ip));
754  shm_appl->as_info[as_index].cas_clt_port = 0;
755  shm_appl->as_info[as_index].driver_version[0] = '\0';
756 
757  /* mutex exit section */
758  shm_appl->as_info[as_index].mutex_flag[SHM_MUTEX_ADMIN] = FALSE;
759 
760  uw_shm_detach (shm_appl);
761  uw_shm_detach (shm_br);
762  free_env (env, env_num);
763 
764  return 0;
765 
766 restart_error:
767  if (shm_appl)
768  {
769  uw_shm_detach (shm_appl);
770  }
771  if (shm_br)
772  {
773  uw_shm_detach (shm_br);
774  }
775  if (env)
776  {
777  free_env (env, env_num);
778  }
779 
780  return -1;
781 }
782 
783 
784 int
785 admin_drop_cmd (int master_shm_id, const char *broker)
786 {
788  T_SHM_APPL_SERVER *shm_appl_server;
789  int br_index, i, appl_shm_key, as_index;
790 
791  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
792  if (shm_br == NULL)
793  {
795  return -1;
796  }
797  br_index = -1;
798  for (i = 0; i < shm_br->num_broker; i++)
799  {
800  if (strcasecmp (broker, shm_br->br_info[i].name) == 0)
801  {
802  appl_shm_key = shm_br->br_info[i].appl_server_shm_id;
803  br_index = i;
804  break;
805  }
806  }
807  if (br_index < 0)
808  {
809  sprintf (admin_err_msg, "Cannot find broker [%s]", broker);
810  uw_shm_detach (shm_br);
811  return -1;
812  }
813  if (shm_br->br_info[br_index].shard_flag == ON)
814  {
815  uw_shm_detach (shm_br);
816  return 0;
817  }
818 
819  shm_appl_server = (T_SHM_APPL_SERVER *) uw_shm_open (appl_shm_key, SHM_APPL_SERVER, SHM_MODE_ADMIN);
820  if (shm_appl_server == NULL)
821  {
823  uw_shm_detach (shm_br);
824  return -1;
825  }
826 
827  if (shm_br->br_info[br_index].appl_server_num <= 0)
828  {
829  strcpy (admin_err_msg, "Cannot drop appl server");
830  uw_shm_detach (shm_br);
831  uw_shm_detach (shm_appl_server);
832  return -1;
833  }
834 
835  if (shm_br->br_info[br_index].auto_add_appl_server == ON)
836  goto finale;
837 
838  as_index = shm_br->br_info[br_index].appl_server_num - 1;
839  shm_appl_server->as_info[as_index].service_flag = SERVICE_OFF;
840 
841  while (1)
842  {
843  if (shm_appl_server->as_info[as_index].service_flag == SERVICE_OFF_ACK)
844  break;
845  SLEEP_MILISEC (0, 500);
846  }
847 
848  (shm_br->br_info[br_index].appl_server_num)--;
849  (shm_appl_server->num_appl_server)--;
850 
851  as_inactivate (&shm_appl_server->as_info[as_index], shm_br->br_info[br_index].name, shm_appl_server->shard_flag);
852 
853 finale:
854  uw_shm_detach (shm_br);
855  uw_shm_detach (shm_appl_server);
856 
857  return 0;
858 }
859 
860 int
861 admin_on_cmd (int master_shm_id, const char *broker_name)
862 {
863  int i, res = 0;
864  char upper_broker_name[BROKER_NAME_LEN];
867  T_SHM_PROXY *shm_proxy_p = NULL;
868 
869  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
870  if (shm_br == NULL)
871  {
873  return -1;
874  }
875 
876  for (i = 0; i < shm_br->num_broker; i++)
877  {
878  if (shm_br->br_info[i].shard_flag == OFF)
879  {
880  continue;
881  }
882 
883  get_upper_str (upper_broker_name, BROKER_NAME_LEN, shm_br->br_info[i].name);
884 
885  snprintf (shard_db_password_env_str[i], sizeof (shard_db_password_env_str[i]), "%s_SHARD_DB_PASSWORD=",
886  upper_broker_name);
887  putenv (shard_db_password_env_str[i]);
888  }
889 
890  for (i = 0; i < shm_br->num_broker; i++)
891  {
892  shm_proxy_p = NULL;
893 
894  if (strcmp (shm_br->br_info[i].name, broker_name) == 0)
895  {
896  if (shm_br->br_info[i].service_flag == ON)
897  {
898  sprintf (admin_err_msg, "Broker[%s] is already running", broker_name);
899  uw_shm_detach (shm_br);
900  return -1;
901  }
902  else
903  {
904  if (shm_br->br_info[i].shard_flag == ON)
905  {
906  shm_proxy_p = shard_shm_initialize_shm_proxy (&(shm_br->br_info[i]));
907 
908  if (shm_proxy_p == NULL)
909  {
910  sprintf (admin_err_msg, "%s: failed to initialize proxy", broker_name);
911 
912  res = -1;
913  break;
914  }
915 
916  if (shard_shm_check_max_file_open_limit (&shm_br->br_info[i], shm_proxy_p) < 0)
917  {
918  res = -1;
919  break;
920  }
921  }
922 
923  shm_as_p = broker_shm_initialize_shm_as (&(shm_br->br_info[i]), shm_proxy_p);
924  if (shm_as_p == NULL)
925  {
926  sprintf (admin_err_msg, "%s: cannot create shared memory", broker_name);
927 
928  res = -1;
929  break;
930  }
931 
932  if (access_control_set_shm (shm_as_p, &shm_br->br_info[i], shm_br, admin_err_msg) < 0)
933  {
934  res = -1;
935  break;
936  }
937 
938  res = br_activate (&(shm_br->br_info[i]), master_shm_id, shm_br);
939 
940  if (shm_br->br_info[i].shard_flag == ON && res == 0)
941  {
942  res = check_shard_conn (shm_as_p, shm_proxy_p);
943  }
944  }
945  break;
946  }
947  }
948 
949  if (res < 0)
950  {
951  char err_msg_backup[ADMIN_ERR_MSG_SIZE];
952 
953  /* if shm_as_p == NULL then, it is expected that failed creating shared memory */
954  if (shm_as_p == NULL)
955  {
956  if (shm_br->br_info[i].shard_flag == ON && shm_proxy_p)
957  {
958  uw_shm_detach (shm_proxy_p);
959 
960  uw_shm_destroy (shm_br->br_info[i].proxy_shm_id);
961  }
962 
963  uw_shm_detach (shm_br);
964 
965  return -1;
966  }
967 
968  memcpy (err_msg_backup, admin_err_msg, ADMIN_ERR_MSG_SIZE);
969 
970  br_inactivate (&(shm_br->br_info[i]));
971 
973  if (shm_br->br_info[i].shard_flag == ON)
974  {
975  uw_shm_destroy ((shm_br->br_info[i].proxy_shm_id));
976  }
977 
978  memcpy (admin_err_msg, err_msg_backup, ADMIN_ERR_MSG_SIZE);
979  }
980 
981  if (i >= shm_br->num_broker)
982  {
983  sprintf (admin_err_msg, "Cannot find broker [%s]", broker_name);
984 
985  res = -1;
986  }
987 
988  uw_shm_detach (shm_br);
989  if (shm_as_p)
990  {
991  uw_shm_detach (shm_as_p);
992  }
993  if (shm_proxy_p)
994  {
995  uw_shm_detach (shm_proxy_p);
996  }
997 
998  return res;
999 }
1000 
1001 int
1002 admin_off_cmd (int master_shm_id, const char *broker_name)
1003 {
1004  int i, res;
1006 
1007  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
1008  if (shm_br == NULL)
1009  {
1011  return -1;
1012  }
1013 
1014 #if !defined(WINDOWS)
1015  if (shm_br->owner_uid != getuid ())
1016  {
1017  strcpy (admin_err_msg, "Cannot stop broker. (Not owner)");
1018  return -1;
1019  }
1020 #endif /* !WINDOWS */
1021 
1022  for (i = 0; i < shm_br->num_broker; i++)
1023  {
1024  if (strcmp (shm_br->br_info[i].name, broker_name) == 0)
1025  {
1026  if (shm_br->br_info[i].service_flag == OFF)
1027  {
1028  sprintf (admin_err_msg, "Broker[%s] is not running", broker_name);
1029  uw_shm_detach (shm_br);
1030  return -1;
1031  }
1032  else
1033  {
1034  res = br_inactivate (&(shm_br->br_info[i]));
1035  if (res < 0)
1036  {
1037  sprintf (admin_err_msg, "Cannot inactivate broker [%s]", broker_name);
1038  uw_shm_detach (shm_br);
1039  return -1;
1040  }
1041  else
1042  {
1043  uw_shm_destroy ((shm_br->br_info[i].appl_server_shm_id));
1044  if (shm_br->br_info[i].shard_flag == ON)
1045  {
1046  uw_shm_destroy ((shm_br->br_info[i].proxy_shm_id));
1047  }
1048  }
1049  }
1050  break;
1051  }
1052  }
1053 
1054  if (i >= shm_br->num_broker)
1055  {
1056  sprintf (admin_err_msg, "Cannot find broker [%s]", broker_name);
1057  uw_shm_detach (shm_br);
1058  return -1;
1059  }
1060 
1061  uw_shm_detach (shm_br);
1062  return 0;
1063 }
1064 
1065 int
1066 admin_reset_cmd (int master_shm_id, const char *broker_name)
1067 {
1068  bool reset_next = FALSE;
1069  int i, j, k, as_index, br_index;
1072  T_SHM_PROXY *proxy_p = NULL;
1074  T_SHARD_INFO *shard_info_p;
1075 
1076  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
1077  if (shm_br == NULL)
1078  {
1080  return -1;
1081  }
1082 
1083  br_index = -1;
1084  for (i = 0; i < shm_br->num_broker; i++)
1085  {
1086  if (strcmp (shm_br->br_info[i].name, broker_name) == 0)
1087  {
1088  if (shm_br->br_info[i].service_flag == OFF)
1089  {
1090  sprintf (admin_err_msg, "Broker[%s] is not running", broker_name);
1091  uw_shm_detach (shm_br);
1092  return -1;
1093  }
1094  else
1095  {
1096  br_index = i;
1097  }
1098  break;
1099  }
1100  }
1101 
1102  if (br_index < 0)
1103  {
1104  sprintf (admin_err_msg, "Cannot find broker [%s]", broker_name);
1105  uw_shm_detach (shm_br);
1106  return -1;
1107  }
1108 
1109  shm_as_p =
1111  if (shm_as_p == NULL)
1112  {
1114  uw_shm_detach (shm_br);
1115  return -1;
1116  }
1118 
1119  if (shm_br->br_info[br_index].shard_flag == ON)
1120  {
1121  proxy_p = (T_SHM_PROXY *) uw_shm_open (shm_br->br_info[br_index].proxy_shm_id, SHM_PROXY, SHM_MODE_ADMIN);
1122 
1123  if (proxy_p == NULL)
1124  {
1126  uw_shm_detach (shm_br);
1127  uw_shm_detach (shm_as_p);
1128  return -1;
1129  }
1130 
1131  for (j = 0; j < proxy_p->num_proxy; j++)
1132  {
1133  proxy_info_p = shard_shm_find_proxy_info (proxy_p, j);
1134 
1135  for (k = 0; k < proxy_info_p->num_shard_conn; k++)
1136  {
1137  shard_info_p = shard_shm_find_shard_info (proxy_info_p, k);
1138 
1139  as_index = shard_info_p->num_appl_server / 2;
1140  as_index = MAX (1, as_index);
1141 
1142  for (i = 0; i < as_index; i++)
1143  {
1144  shm_as_p->as_info[i + shard_info_p->as_info_index_base].reset_flag = TRUE;
1145  }
1146 
1147  while (1)
1148  {
1149  for (i = 0; i < as_index; i++)
1150  {
1151  if (shm_as_p->as_info[i + shard_info_p->as_info_index_base].reset_flag == FALSE)
1152  {
1153  reset_next = TRUE;
1154  break;
1155  }
1156  SLEEP_MILISEC (0, 10);
1157  }
1158 
1159  if (reset_next)
1160  {
1161  break;
1162  }
1163  }
1164 
1165  for (i = as_index; i < shard_info_p->num_appl_server; i++)
1166  {
1167  shm_as_p->as_info[i + shard_info_p->as_info_index_base].reset_flag = TRUE;
1168  }
1169  }
1170  }
1171  uw_shm_detach (proxy_p);
1172  }
1173  else
1174  {
1175  int limit_appl_index = shm_br->br_info[br_index].appl_server_max_num;
1176 
1177  if (limit_appl_index > APPL_SERVER_NUM_LIMIT)
1178  {
1179  limit_appl_index = APPL_SERVER_NUM_LIMIT;
1180  }
1181 
1182  for (i = 0; i < limit_appl_index; i++)
1183  {
1184  shm_as_p->as_info[i].reset_flag = TRUE;
1185  }
1186  }
1187 
1188  uw_shm_detach (shm_as_p);
1189  uw_shm_detach (shm_br);
1190  return 0;
1191 }
1192 
1193 int
1194 admin_info_cmd (int master_shm_id)
1195 {
1197 
1198  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_MONITOR);
1199  if (shm_br == NULL)
1200  {
1202  return -1;
1203  }
1204 
1205  broker_config_dump (stdout, shm_br->br_info, shm_br->num_broker, master_shm_id);
1206 
1207  uw_shm_detach (shm_br);
1208  return 0;
1209 }
1210 
1211 static bool
1212 key_isdigit (const char *value)
1213 {
1214  const char *p = value;
1215 
1216  while (char_isdigit (*p))
1217  {
1218  p++;
1219  }
1220 
1221  if (*p == '\0')
1222  {
1223  return true;
1224  }
1225  else
1226  {
1227  return false;
1228  }
1229 }
1230 
1231 static int
1232 make_sp_value (SP_VALUE * value_p, char *shard_key)
1233 {
1234  int length = (int) strlen (shard_key);
1235  char *end;
1236 
1237  if (key_isdigit (shard_key))
1238  {
1239  errno = 0;
1240  value_p->integer = strtoll (shard_key, &end, 10);
1241  if (errno == ERANGE || *end != '\0')
1242  {
1243  return -1;
1244  }
1245 
1246  value_p->type = VT_INTEGER;
1247  }
1248  else
1249  {
1250  value_p->string.value = (char *) malloc (sizeof (char) * (length + 1));
1251  if (value_p->string.value == NULL)
1252  {
1253  return -1;
1254  }
1255  memcpy (value_p->string.value, shard_key, length);
1256  value_p->type = VT_STRING;
1257  value_p->string.length = length;
1258  value_p->string.value[length] = '\0';
1259  }
1260 
1261  return 0;
1262 }
1263 
1264 static void
1266 {
1267  printf ("shard_getid -b <broker-name> [-f] shard-key\n");
1268  printf ("\t-b shard broker name\n");
1269  printf ("\t-f full information\n");
1270 }
1271 
1272 int
1273 admin_getid_cmd (int master_shm_id, int argc, const char **argv)
1274 {
1275  int i, error, optchar;
1276  int br_index, buf_len;
1277  int appl_server_shm_id;
1278  int shard_key_id;
1279  bool full_info_flag = false;
1280  const char *shard_key;
1281  const char *key_column;
1282  char buf[LINE_MAX];
1283  char line_buf[LINE_MAX];
1284  char broker_name[BROKER_NAME_LEN] = { 0 };
1289  T_SHARD_KEY *key_p = NULL;
1290  T_SHARD_KEY_RANGE *range_p = NULL;
1291  SP_VALUE value;
1292 
1293  if (argc == 3 && strcmp (argv[2], "--version") == 0)
1294  {
1295  fprintf (stderr, "VERSION %s\n", makestring (BUILD_NUMBER));
1296  return 0;
1297  }
1298 
1299  while ((optchar = getopt (argc, (char *const *) argv, "b:fh?")) != EOF)
1300  {
1301  switch (optchar)
1302  {
1303  case 'b':
1304  strncpy (broker_name, optarg, NAME_MAX);
1305  break;
1306  case 'f':
1307  full_info_flag = true;
1308  break;
1309  case 'h':
1310  case '?':
1311  print_usage ();
1312  return 0;
1313  break;
1314  }
1315  }
1316 
1317  if (argc < 5)
1318  {
1319  print_usage ();
1320  goto getid_error;
1321  }
1322 
1323  shard_key = argv[argc - 1];
1324 
1325  if (strcmp (broker_name, "") == 0)
1326  {
1327  sprintf (admin_err_msg, "Broker name is null.\n");
1328  print_usage ();
1329  goto getid_error;
1330  }
1331 
1332  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
1333  if (shm_br == NULL)
1334  {
1335  sprintf (admin_err_msg, "Failed to open master shared memory.\n");
1336  goto getid_error;
1337  }
1338 
1339  br_index = -1;
1340  for (i = 0; i < shm_br->num_broker; i++)
1341  {
1342  if (strcmp (shm_br->br_info[i].name, broker_name) == 0)
1343  {
1344  if (shm_br->br_info[i].service_flag == OFF)
1345  {
1346  sprintf (admin_err_msg, "Broker [%s] is not running.\n", broker_name);
1347  goto getid_error;
1348  }
1349  else
1350  {
1351  br_index = i;
1352  }
1353  break;
1354  }
1355  }
1356 
1357  if (br_index < 0)
1358  {
1359  sprintf (admin_err_msg, "Cannot find shard broker [%s].\n", broker_name);
1360  goto getid_error;
1361  }
1362 
1363  br_info_p = &(shm_br->br_info[br_index]);
1364 
1365  if (br_info_p->shard_flag == OFF)
1366  {
1367  uw_shm_detach (shm_br);
1368  return 0;
1369  }
1370 
1371  appl_server_shm_id = br_info_p->appl_server_shm_id;
1372 
1373  shm_proxy_p = (T_SHM_PROXY *) uw_shm_open (br_info_p->proxy_shm_id, SHM_PROXY, SHM_MODE_ADMIN);
1374 
1375  if (shm_proxy_p == NULL)
1376  {
1377  sprintf (admin_err_msg, "Failed to get shm proxy info.\n");
1378  goto getid_error;
1379  }
1380 
1381  shm_key_p = shard_metadata_get_key (shm_proxy_p);
1382  if (shm_key_p == NULL)
1383  {
1384  sprintf (admin_err_msg, "Failed to get shm metadata shard key info.\n");
1385  goto getid_error;
1386  }
1387 
1388  shm_conn_p = shard_metadata_get_conn (shm_proxy_p);
1389  if (shm_conn_p == NULL)
1390  {
1391  sprintf (admin_err_msg, "Failed to get shm metadata connection info.\n");
1392  goto getid_error;
1393  }
1394 
1395  error = register_fn_get_shard_key ();
1396  if (error)
1397  {
1398  sprintf (admin_err_msg, "Failed to register shard hashing function.\n");
1399  goto getid_error;
1400  }
1401 
1402  error = make_sp_value (&value, (char *) shard_key);
1403  if (error)
1404  {
1405  sprintf (admin_err_msg, "Failed to make shard key value.\n");
1406  goto getid_error;
1407  }
1408 
1409  key_p = (T_SHARD_KEY *) (&(shm_key_p->shard_key[0]));
1410  key_column = key_p->key_column;
1411 
1412  shard_key_id = proxy_find_shard_id_by_hint_value (&value, key_column);
1413  if (shard_key_id < 0)
1414  {
1415  sprintf (admin_err_msg, "Failed to find shard key id.\n");
1416  goto getid_error;
1417  }
1418 
1419  range_p = shard_metadata_find_shard_range (shm_key_p, (char *) key_column, shard_key_id);
1420  if (range_p == NULL)
1421  {
1422  sprintf (admin_err_msg, "Unable to find shm shard range. (key:%s, key_id:%d).\n", key_column, shard_key_id);
1423  goto getid_error;
1424  }
1425 
1426  /* SHARD ID INFORMATION */
1427  buf_len = 0;
1428  buf_len += sprintf (buf + buf_len, "%% %s\n", broker_name);
1429  buf_len += sprintf (buf + buf_len, " SHARD_ID : %d, ", range_p->shard_id);
1430  buf_len += sprintf (buf + buf_len, "SHARD_KEY : %s", shard_key);
1431  if (full_info_flag == true)
1432  {
1433  buf_len += sprintf (buf + buf_len, ", KEY_COLUMN : %s", key_column);
1434  }
1435  buf_len += sprintf (buf + buf_len, "\n");
1436  printf ("%s", buf);
1437 
1438  /* SHARD KEY CONFIG */
1439  if (full_info_flag == true)
1440  {
1441  buf_len = 0;
1442  buf_len += sprintf (buf + buf_len, " MODULAR : %d, ", shm_proxy_p->shard_key_modular);
1443  buf_len +=
1444  sprintf (buf + buf_len, "LIBRARY_NAME : %s, ",
1445  (shm_proxy_p->shard_key_library_name[0] == 0) ? "NOT DEFINED" : shm_proxy_p->shard_key_library_name);
1446  buf_len +=
1447  sprintf (buf + buf_len, "FUNCTION_NAME : %s ",
1448  (shm_proxy_p->shard_key_function_name[0] == 0) ? "NOT DEFINED" : shm_proxy_p->shard_key_function_name);
1449  buf_len += sprintf (buf + buf_len, "\n");
1450  printf ("%s", buf);
1451  }
1452 
1453  /* RANGE STATISTICS */
1454  if (full_info_flag == true)
1455  {
1456  buf_len = 0;
1457  buf_len += sprintf (buf + buf_len, " RANGE STATISTICS : %s\n", key_p->key_column);
1458  printf ("%s", buf);
1459 
1460  buf_len = 0;
1461  buf_len += sprintf (buf + buf_len, "%5s ~ ", "MIN");
1462  buf_len += sprintf (buf + buf_len, "%5s : ", "MAX");
1463  buf_len += sprintf (buf + buf_len, "%10s", "SHARD");
1464  for (i = 0; i < buf_len; i++)
1465  {
1466  line_buf[i] = '-';
1467  }
1468  line_buf[i] = '\0';
1469  printf ("\t%s\n", buf);
1470  printf ("\t%s\n", line_buf);
1471 
1472  buf_len = 0;
1473  buf_len += sprintf (buf + buf_len, "\t%5d ~ %5d : %10d\n", range_p->min, range_p->max, range_p->shard_id);
1474  printf ("%s\n", buf);
1475  }
1476 
1477  /* CONNECTION INFOMATION */
1478  if (full_info_flag == true)
1479  {
1480  buf_len = 0;
1481  buf_len += sprintf (buf + buf_len, " SHARD CONNECTION : \n");
1482  printf ("%s", buf);
1483 
1484  buf_len = 0;
1485  buf_len += sprintf (buf + buf_len, "%8s ", "SHARD_ID");
1486  buf_len += sprintf (buf + buf_len, "%16s ", "DB NAME");
1487  buf_len += sprintf (buf + buf_len, "%24s ", "CONNECTION_INFO");
1488  for (i = 0; i < buf_len; i++)
1489  {
1490  line_buf[i] = '-';
1491  }
1492  line_buf[i] = '\0';
1493  printf ("\t%s\n", buf);
1494  printf ("\t%s\n", line_buf);
1495 
1496  for (i = 0; i < shm_conn_p->num_shard_conn; i++)
1497  {
1498  if (range_p->shard_id == shm_conn_p->shard_conn[i].shard_id)
1499  {
1500  buf_len = 0;
1501  buf_len += sprintf (buf + buf_len, "%8d ", shm_conn_p->shard_conn[i].shard_id);
1502  buf_len += sprintf (buf + buf_len, "%16s ", shm_conn_p->shard_conn[i].db_name);
1503  buf_len += sprintf (buf + buf_len, "%24s ", shm_conn_p->shard_conn[i].db_conn_info);
1504  printf ("\t%s\n", buf);
1505  }
1506  }
1507  }
1508 
1509  uw_shm_detach (shm_proxy_p);
1510  uw_shm_detach (shm_br);
1511 
1512  return 0;
1513 
1514 getid_error:
1515  if (shm_br)
1516  {
1517  uw_shm_detach (shm_br);
1518  }
1519  if (shm_proxy_p)
1520  {
1521  uw_shm_detach (shm_proxy_p);
1522  }
1523 
1524  return -1;
1525 }
1526 
1527 int
1528 admin_conf_change (int master_shm_id, const char *br_name, const char *conf_name, const char *conf_value, int as_number)
1529 {
1530  int i, br_index;
1534  T_SHM_PROXY *shm_proxy_p = NULL;
1535  char path_org[BROKER_PATH_MAX] = { 0, };
1536  char path_new[BROKER_PATH_MAX] = { 0, };
1537 
1538  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
1539  if (shm_br == NULL)
1540  {
1541  sprintf (admin_err_msg, "Broker is not started.");
1542  goto set_conf_error;
1543  }
1544 
1545  br_index = -1;
1546  for (i = 0; i < shm_br->num_broker; i++)
1547  {
1548  if (strcasecmp (br_name, shm_br->br_info[i].name) == 0)
1549  {
1550  br_index = i;
1551  break;
1552  }
1553  }
1554  if (br_index < 0)
1555  {
1556  sprintf (admin_err_msg, "Cannot find Broker [%s]", br_name);
1557  goto set_conf_error;
1558  }
1559 
1560  if (shm_br->br_info[br_index].service_flag == OFF)
1561  {
1562  sprintf (admin_err_msg, "Broker [%s] is not running.", br_name);
1563  goto set_conf_error;
1564  }
1565 
1566  br_info_p = &(shm_br->br_info[br_index]);
1568 
1569  if (shm_as_p == NULL)
1570  {
1572  goto set_conf_error;
1573  }
1575 
1576  if (br_info_p->shard_flag == ON)
1577  {
1578  shm_proxy_p = (T_SHM_PROXY *) uw_shm_open (br_info_p->proxy_shm_id, SHM_PROXY, SHM_MODE_ADMIN);
1579 
1580  if (shm_proxy_p == NULL)
1581  {
1583  goto set_conf_error;
1584  }
1585  }
1586 
1587  if (strcasecmp (conf_name, "SQL_LOG") == 0)
1588  {
1589  char sql_log_mode;
1590 
1591  sql_log_mode = conf_get_value_sql_log_mode (conf_value);
1592  if (sql_log_mode < 0)
1593  {
1594  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1595  goto set_conf_error;
1596  }
1597 
1598  if (br_info_p->shard_flag == ON)
1599  {
1600  br_info_p->sql_log_mode = sql_log_mode;
1601  shm_as_p->sql_log_mode = sql_log_mode;
1602 
1603  if (shard_shm_set_param_as_in_proxy (shm_proxy_p, conf_name, conf_value, ALL_PROXY, ALL_SHARD, ALL_AS) < 0)
1604  {
1605  goto set_conf_error;
1606  }
1607  }
1608  else
1609  {
1610  if (as_number <= 0)
1611  {
1612  shm_br->br_info[br_index].sql_log_mode = sql_log_mode;
1613  shm_as_p->sql_log_mode = sql_log_mode;
1614  for (i = 0; i < shm_br->br_info[br_index].appl_server_max_num; i++)
1615  {
1616  shm_as_p->as_info[i].cur_sql_log_mode = sql_log_mode;
1618  }
1619  }
1620  else
1621  {
1622  if (as_number > shm_as_p->num_appl_server)
1623  {
1624  sprintf (admin_err_msg, "Invalid cas number : %d", as_number);
1625  goto set_conf_error;
1626  }
1627  shm_as_p->as_info[as_number - 1].cur_sql_log_mode = sql_log_mode;
1628  shm_as_p->as_info[as_number - 1].cas_log_reset = CAS_LOG_RESET_REOPEN;
1629  }
1630  }
1631  }
1632  else if (strcasecmp (conf_name, "SLOW_LOG") == 0)
1633  {
1634  char slow_log_mode;
1635 
1636  slow_log_mode = conf_get_value_table_on_off (conf_value);
1637  if (slow_log_mode < 0)
1638  {
1639  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1640  goto set_conf_error;
1641  }
1642  if (br_info_p->shard_flag == ON)
1643  {
1644  br_info_p->slow_log_mode = slow_log_mode;
1645  shm_as_p->slow_log_mode = slow_log_mode;
1646 
1647  if (shard_shm_set_param_as_in_proxy (shm_proxy_p, conf_name, conf_value, ALL_PROXY, ALL_SHARD, ALL_AS) < 0)
1648  {
1649  goto set_conf_error;
1650  }
1651  }
1652  else
1653  {
1654  if (as_number <= 0)
1655  {
1656  shm_br->br_info[br_index].slow_log_mode = slow_log_mode;
1657  shm_as_p->slow_log_mode = slow_log_mode;
1658  for (i = 0; i < shm_br->br_info[br_index].appl_server_max_num; i++)
1659  {
1660  shm_as_p->as_info[i].cur_slow_log_mode = slow_log_mode;
1662  }
1663  }
1664  else
1665  {
1666  if (as_number > shm_as_p->num_appl_server)
1667  {
1668  sprintf (admin_err_msg, "Invalid cas number : %d", as_number);
1669  goto set_conf_error;
1670  }
1671  shm_as_p->as_info[as_number - 1].cur_slow_log_mode = slow_log_mode;
1672  shm_as_p->as_info[as_number - 1].cas_slow_log_reset = CAS_LOG_RESET_REOPEN;
1673  }
1674  }
1675  }
1676  else if (strcasecmp (conf_name, "ACCESS_MODE") == 0)
1677  {
1678  char access_mode = conf_get_value_access_mode (conf_value);
1679 
1680  if (access_mode == -1)
1681  {
1682  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1683  goto set_conf_error;
1684  }
1685  if (br_info_p->access_mode == access_mode)
1686  {
1687  sprintf (admin_err_msg, "same as previous value : %s", conf_value);
1688  goto set_conf_error;
1689  }
1690  br_info_p->access_mode = access_mode;
1691  shm_as_p->access_mode = access_mode;
1692 
1693  if (br_info_p->shard_flag == ON)
1694  {
1695  if (shard_shm_set_param_as_in_proxy (shm_proxy_p, conf_name, conf_value, ALL_PROXY, ALL_SHARD, ALL_AS) < 0)
1696  {
1697  goto set_conf_error;
1698  }
1699  }
1700  else
1701  {
1702  for (i = 0; i < shm_as_p->num_appl_server && i < APPL_SERVER_NUM_LIMIT; i++)
1703  {
1704  shm_as_p->as_info[i].reset_flag = TRUE;
1705  }
1706  }
1707  }
1708  else if (strcasecmp (conf_name, "CONNECT_ORDER") == 0)
1709  {
1710  int connect_order;
1711 
1712  connect_order = conf_get_value_connect_order (conf_value);
1713  if (connect_order == -1)
1714  {
1715  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1716  goto set_conf_error;
1717  }
1718 
1719  if (br_info_p->connect_order == connect_order)
1720  {
1721  sprintf (admin_err_msg, "same as previous value : %s", conf_value);
1722  goto set_conf_error;
1723  }
1724 
1725  br_info_p->connect_order = connect_order;
1726  shm_as_p->connect_order = connect_order;
1727 
1728  if (br_info_p->shard_flag == ON)
1729  {
1730  if (shard_shm_set_param_as_in_proxy (shm_proxy_p, conf_name, conf_value, ALL_PROXY, ALL_SHARD, ALL_AS) < 0)
1731  {
1732  goto set_conf_error;
1733  }
1734  }
1735  else
1736  {
1737  for (i = 0; i < shm_as_p->num_appl_server && i < APPL_SERVER_NUM_LIMIT; i++)
1738  {
1739  shm_as_p->as_info[i].reset_flag = TRUE;
1740  }
1741  }
1742  }
1743  else if (strcasecmp (conf_name, "MAX_NUM_DELAYED_HOSTS_LOOKUP") == 0)
1744  {
1745  int max_num_delayed_hosts_lookup = 0, result;
1746 
1747  result = parse_int (&max_num_delayed_hosts_lookup, conf_value, 10);
1748 
1749  if (result != 0 || max_num_delayed_hosts_lookup < DEFAULT_MAX_NUM_DELAYED_HOSTS_LOOKUP)
1750  {
1751  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1752  goto set_conf_error;
1753  }
1754 
1755  if (br_info_p->max_num_delayed_hosts_lookup == max_num_delayed_hosts_lookup)
1756  {
1757  sprintf (admin_err_msg, "same as previous value : %s", conf_value);
1758  goto set_conf_error;
1759  }
1760 
1761  br_info_p->max_num_delayed_hosts_lookup = max_num_delayed_hosts_lookup;
1762  shm_as_p->max_num_delayed_hosts_lookup = max_num_delayed_hosts_lookup;
1763  }
1764  else if (strcasecmp (conf_name, "RECONNECT_TIME") == 0)
1765  {
1766  int rctime;
1767 
1768  rctime = (int) ut_time_string_to_sec (conf_value, "sec");
1769  if (rctime < 0)
1770  {
1771  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1772  goto set_conf_error;
1773  }
1774 
1775  br_info_p->cas_rctime = rctime;
1776  shm_as_p->cas_rctime = rctime;
1777  }
1778  else if (strcasecmp (conf_name, "SQL_LOG_MAX_SIZE") == 0)
1779  {
1780  int sql_log_max_size;
1781 
1782  sql_log_max_size = (int) ut_size_string_to_kbyte (conf_value, "K");
1783 
1784  if (sql_log_max_size <= 0)
1785  {
1786  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1787  goto set_conf_error;
1788  }
1789  else if (sql_log_max_size > MAX_SQL_LOG_MAX_SIZE)
1790  {
1791  sprintf (admin_err_msg, "value is out of range : %s", conf_value);
1792  goto set_conf_error;
1793  }
1794  br_info_p->sql_log_max_size = sql_log_max_size;
1795  shm_as_p->sql_log_max_size = sql_log_max_size;
1796  }
1797  else if (strcasecmp (conf_name, "LONG_QUERY_TIME") == 0)
1798  {
1799  float long_query_time;
1800 
1801  long_query_time = (float) ut_time_string_to_sec (conf_value, "sec");
1802 
1803  if (long_query_time < 0)
1804  {
1805  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1806  goto set_conf_error;
1807  }
1808  else if (long_query_time > LONG_QUERY_TIME_LIMIT)
1809  {
1810  sprintf (admin_err_msg, "value is out of range : %s", conf_value);
1811  goto set_conf_error;
1812  }
1813 
1814  br_info_p->long_query_time = (int) (long_query_time * 1000.0);
1815  shm_as_p->long_query_time = (int) (long_query_time * 1000.0);
1816  }
1817  else if (strcasecmp (conf_name, "LONG_TRANSACTION_TIME") == 0)
1818  {
1819  float long_transaction_time;
1820 
1821  long_transaction_time = (float) ut_time_string_to_sec (conf_value, "sec");
1822 
1823  if (long_transaction_time < 0)
1824  {
1825  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1826  goto set_conf_error;
1827  }
1828  else if (long_transaction_time > LONG_TRANSACTION_TIME_LIMIT)
1829  {
1830  sprintf (admin_err_msg, "value is out of range : %s", conf_value);
1831  goto set_conf_error;
1832  }
1833 
1834  br_info_p->long_transaction_time = (int) (long_transaction_time * 1000.0);
1835  shm_as_p->long_transaction_time = (int) (long_transaction_time * 1000.0);
1836  }
1837  else if (strcasecmp (conf_name, "APPL_SERVER_MAX_SIZE") == 0)
1838  {
1839  int max_size;
1840 
1841  max_size = (int) ut_size_string_to_kbyte (conf_value, "M");
1842 
1843  if (max_size < 0)
1844  {
1845  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1846  goto set_conf_error;
1847  }
1848 
1849  if (max_size > 0 && max_size > (shm_br->br_info[br_index].appl_server_hard_limit))
1850  {
1851  sprintf (admin_err_msg,
1852  "CONFIGURATION WARNING - the APPL_SERVER_MAX_SIZE (%dM)"
1853  " is greater than the APPL_SERVER_MAX_SIZE_HARD_LIMIT (%dM)", max_size / ONE_K,
1854  shm_as_p->appl_server_hard_limit / ONE_K);
1855  }
1856 
1857  br_info_p->appl_server_max_size = max_size;
1858  shm_as_p->appl_server_max_size = max_size;
1859  }
1860  else if (strcasecmp (conf_name, "APPL_SERVER_MAX_SIZE_HARD_LIMIT") == 0)
1861  {
1862  int hard_limit;
1863  int max_hard_limit;
1864 
1865  hard_limit = (int) ut_size_string_to_kbyte (conf_value, "M");
1866 
1867  max_hard_limit = INT_MAX;
1868  if (hard_limit <= 0)
1869  {
1870  sprintf (admin_err_msg, "APPL_SERVER_MAX_SIZE_HARD_LIMIT must be between 1 and %d", max_hard_limit / ONE_K);
1871  goto set_conf_error;
1872  }
1873 
1874  if (hard_limit < shm_br->br_info[br_index].appl_server_max_size)
1875  {
1876  sprintf (admin_err_msg,
1877  "CONFIGURATION WARNING - the APPL_SERVER_MAX_SIZE_HARD_LIMIT (%dM) "
1878  "is smaller than the APPL_SERVER_MAX_SIZE (%dM)", hard_limit / ONE_K,
1879  shm_as_p->appl_server_max_size / ONE_K);
1880  }
1881 
1882  br_info_p->appl_server_hard_limit = hard_limit;
1883  shm_as_p->appl_server_hard_limit = hard_limit;
1884  }
1885  else if (strcasecmp (conf_name, "LOG_BACKUP") == 0)
1886  {
1887  int log_backup;
1888 
1889  log_backup = conf_get_value_table_on_off (conf_value);
1890  if (log_backup < 0)
1891  {
1892  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1893  goto set_conf_error;
1894  }
1895  br_info_p->log_backup = log_backup;
1896  }
1897  else if (strcasecmp (conf_name, "TIME_TO_KILL") == 0)
1898  {
1899  int time_to_kill;
1900 
1901  time_to_kill = (int) ut_time_string_to_sec (conf_value, "sec");
1902  if (time_to_kill <= 0)
1903  {
1904  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1905  goto set_conf_error;
1906  }
1907  br_info_p->time_to_kill = time_to_kill;
1908  }
1909  else if (strcasecmp (conf_name, "ACCESS_LOG") == 0)
1910  {
1911  int access_log_flag;
1912 
1913  access_log_flag = conf_get_value_table_on_off (conf_value);
1914  if (access_log_flag < 0)
1915  {
1916  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1917  goto set_conf_error;
1918  }
1919  br_info_p->access_log = access_log_flag;
1920  shm_as_p->access_log = access_log_flag;
1921  }
1922  else if (strcasecmp (conf_name, "ACCESS_LOG_MAX_SIZE") == 0)
1923  {
1924  int size;
1925 
1926  /*
1927  * Use "KB" as unit, because MAX_ACCESS_LOG_MAX_SIZE uses this unit.
1928  * the range of the config value should be verified to avoid the invalid setting.
1929  */
1930  size = (int) ut_size_string_to_kbyte (conf_value, "K");
1931 
1932  if (size < 0)
1933  {
1934  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1935  goto set_conf_error;
1936  }
1937  else if (size > MAX_ACCESS_LOG_MAX_SIZE)
1938  {
1939  sprintf (admin_err_msg, "value is out of range : %s", conf_value);
1940  goto set_conf_error;
1941  }
1942 
1943 
1944  br_info_p->access_log_max_size = size;
1945  shm_as_p->access_log_max_size = size;
1946  }
1947  else if (strcasecmp (conf_name, "KEEP_CONNECTION") == 0)
1948  {
1949  int keep_con;
1950 
1951  keep_con = conf_get_value_keep_con (conf_value);
1952  if (keep_con < 0)
1953  {
1954  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1955  goto set_conf_error;
1956  }
1957  br_info_p->keep_connection = keep_con;
1958  shm_as_p->keep_connection = keep_con;
1959  }
1960  else if (strcasecmp (conf_name, "CACHE_USER_INFO") == 0)
1961  {
1962  int val;
1963 
1964  val = conf_get_value_table_on_off (conf_value);
1965  if (val < 0)
1966  {
1967  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1968  goto set_conf_error;
1969  }
1970  br_info_p->cache_user_info = val;
1971  shm_as_p->cache_user_info = val;
1972  }
1973  else if (strcasecmp (conf_name, "SQL_LOG2") == 0)
1974  {
1975  int val, result;
1976 
1977  result = parse_int (&val, conf_value, 10);
1978  if (result != 0 || val < SQL_LOG2_NONE || val > SQL_LOG2_MAX)
1979  {
1980  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1981  goto set_conf_error;
1982  }
1983  br_info_p->sql_log2 = val;
1984  shm_as_p->sql_log2 = val;
1985  }
1986  else if (strcasecmp (conf_name, "STATEMENT_POOLING") == 0)
1987  {
1988  int val;
1989 
1990  val = conf_get_value_table_on_off (conf_value);
1991  if (val < 0)
1992  {
1993  sprintf (admin_err_msg, "invalid value : %s", conf_value);
1994  goto set_conf_error;
1995  }
1996  br_info_p->statement_pooling = val;
1997  shm_as_p->statement_pooling = val;
1998  }
1999  else if (strcasecmp (conf_name, "JDBC_CACHE") == 0)
2000  {
2001  int val;
2002 
2003  val = conf_get_value_table_on_off (conf_value);
2004  if (val < 0)
2005  {
2006  sprintf (admin_err_msg, "invalid value : %s", conf_value);
2007  goto set_conf_error;
2008  }
2009  br_info_p->jdbc_cache = val;
2010  shm_as_p->jdbc_cache = val;
2011  }
2012  else if (strcasecmp (conf_name, "JDBC_CACHE_HINT_ONLY") == 0)
2013  {
2014  int val;
2015 
2016  val = conf_get_value_table_on_off (conf_value);
2017  if (val < 0)
2018  {
2019  sprintf (admin_err_msg, "invalid value : %s", conf_value);
2020  goto set_conf_error;
2021  }
2022  br_info_p->jdbc_cache_only_hint = val;
2023  shm_as_p->jdbc_cache_only_hint = val;
2024  }
2025  else if (strcasecmp (conf_name, "JDBC_CACHE_LIFE_TIME") == 0)
2026  {
2027  int val;
2028 
2029  val = atoi (conf_value);
2030  br_info_p->jdbc_cache_life_time = val;
2031  shm_as_p->jdbc_cache_life_time = val;
2032  }
2033  else if (strcasecmp (conf_name, "CCI_PCONNECT") == 0)
2034  {
2035  int val;
2036 
2037  val = conf_get_value_table_on_off (conf_value);
2038  if (val < 0)
2039  {
2040  sprintf (admin_err_msg, "invalid value : %s", conf_value);
2041  goto set_conf_error;
2042  }
2043  br_info_p->cci_pconnect = val;
2044  shm_as_p->cci_pconnect = val;
2045  }
2046  else if (strcasecmp (conf_name, "MAX_QUERY_TIMEOUT") == 0)
2047  {
2048  int val;
2049 
2050  val = (int) ut_time_string_to_sec (conf_value, "sec");
2051 
2052  if (val < 0)
2053  {
2054  sprintf (admin_err_msg, "invalid value: %s", conf_value);
2055  goto set_conf_error;
2056  }
2057  else if (val > MAX_QUERY_TIMEOUT_LIMIT)
2058  {
2059  sprintf (admin_err_msg, "value is out of range : %s", conf_value);
2060  goto set_conf_error;
2061  }
2062  br_info_p->query_timeout = val;
2063  shm_as_p->query_timeout = val;
2064  }
2065  else if (strcasecmp (conf_name, "MYSQL_READ_TIMEOUT") == 0)
2066  {
2067  int val;
2068 
2069  val = (int) ut_time_string_to_sec (conf_value, "sec");
2070 
2071  if (val < 0)
2072  {
2073  sprintf (admin_err_msg, "invalid value: %s", conf_value);
2074  goto set_conf_error;
2075  }
2076  else if (val > MAX_QUERY_TIMEOUT_LIMIT)
2077  {
2078  sprintf (admin_err_msg, "value is out of range : %s", conf_value);
2079  goto set_conf_error;
2080  }
2081  br_info_p->mysql_read_timeout = val;
2082  shm_as_p->mysql_read_timeout = val;
2083  }
2084  else if (strcasecmp (conf_name, "MYSQL_KEEPALIVE_INTERVAL") == 0)
2085  {
2086  int val;
2087 
2088  val = (int) ut_time_string_to_sec (conf_value, "sec");
2089 
2090  if (val < MIN_MYSQL_KEEPALIVE_INTERVAL)
2091  {
2092  sprintf (admin_err_msg, "invalid value: %s", conf_value);
2093  goto set_conf_error;
2094  }
2095  br_info_p->mysql_keepalive_interval = val;
2096  shm_as_p->mysql_keepalive_interval = val;
2097  }
2098  else if (strcasecmp (conf_name, "SHARD_PROXY_LOG") == 0)
2099  {
2100  char proxy_log_mode;
2101 
2102  if (br_info_p->shard_flag == OFF)
2103  {
2104  sprintf (admin_err_msg, "%s is only supported on shard", conf_name);
2105  goto set_conf_error;
2106  }
2107 
2108  assert (shm_proxy_p != NULL);
2109 
2110  proxy_log_mode = conf_get_value_proxy_log_mode (conf_value);
2111  if (proxy_log_mode < 0)
2112  {
2113  sprintf (admin_err_msg, "invalid value : %s", conf_value);
2114  goto set_conf_error;
2115  }
2116 
2117  br_info_p->proxy_log_mode = proxy_log_mode;
2118 
2119  if (shard_shm_set_param_proxy (shm_proxy_p, conf_name, conf_value, ALL_PROXY) < 0)
2120  {
2121  goto set_conf_error;
2122  }
2123  }
2124  else if (strcasecmp (conf_name, "SHARD_PROXY_LOG_MAX_SIZE") == 0)
2125  {
2126  int proxy_log_max_size;
2127 
2128  if (br_info_p->shard_flag == OFF)
2129  {
2130  sprintf (admin_err_msg, "%s is only supported on shard", conf_name);
2131  goto set_conf_error;
2132  }
2133 
2134  proxy_log_max_size = (int) ut_size_string_to_kbyte (conf_value, "K");
2135 
2136  if (proxy_log_max_size <= 0)
2137  {
2138  sprintf (admin_err_msg, "invalid value : %s", conf_value);
2139  goto set_conf_error;
2140  }
2141  else if (proxy_log_max_size > MAX_PROXY_LOG_MAX_SIZE)
2142  {
2143  sprintf (admin_err_msg, "value is out of range : %s", conf_value);
2144  goto set_conf_error;
2145  }
2146  br_info_p->proxy_log_max_size = proxy_log_max_size;
2147  shm_as_p->proxy_log_max_size = proxy_log_max_size;
2148  }
2149  else if (strcasecmp (conf_name, "TRIGGER_ACTION") == 0)
2150  {
2151  int old_val, val;
2152 
2153  val = conf_get_value_table_on_off (conf_value);
2154  if (val < 0)
2155  {
2156  sprintf (admin_err_msg, "invalid value : %s", conf_value);
2157  goto set_conf_error;
2158  }
2159 
2160  old_val = br_info_p->trigger_action_flag;
2161 
2162  br_info_p->trigger_action_flag = val;
2163  shm_as_p->trigger_action_flag = val;
2164 
2165  if (br_info_p->shard_flag == ON)
2166  {
2167  if (shard_shm_set_param_as_in_proxy (shm_proxy_p, conf_name, conf_value, ALL_PROXY, ALL_SHARD, ALL_AS) < 0)
2168  {
2169  br_info_p->trigger_action_flag = old_val;
2170  shm_as_p->trigger_action_flag = old_val;
2171  goto set_conf_error;
2172  }
2173  }
2174  else
2175  {
2176  for (i = 0; i < shm_as_p->num_appl_server && i < APPL_SERVER_NUM_LIMIT; i++)
2177  {
2178  shm_as_p->as_info[i].reset_flag = TRUE;
2179  }
2180  }
2181  }
2182  else if (strcasecmp (conf_name, "PREFERRED_HOSTS") == 0)
2183  {
2184  char *host_name = (char *) conf_value;
2185  size_t host_name_len = 0;
2186 
2187  host_name_len = strlen (host_name);
2188 
2189  if (host_name_len >= BROKER_INFO_NAME_MAX || host_name_len >= SHM_APPL_SERVER_NAME_MAX)
2190  {
2191  sprintf (admin_err_msg, "The length of the host name is too long.");
2192  goto set_conf_error;
2193  }
2194 
2195  if (strncasecmp (br_info_p->preferred_hosts, host_name, host_name_len) == 0)
2196  {
2197  sprintf (admin_err_msg, "same as previous value : %s", host_name);
2198  goto set_conf_error;
2199  }
2200 
2201  strcpy (br_info_p->preferred_hosts, host_name);
2202  strcpy (shm_as_p->preferred_hosts, host_name);
2203  }
2204  else if (strcasecmp (conf_name, "MAX_PREPARED_STMT_COUNT") == 0)
2205  {
2206  int err_code = 0;
2207  int stmt_cnt = 0;
2208 
2209  err_code = parse_int (&stmt_cnt, conf_value, 10);
2210  if (err_code < 0)
2211  {
2212  sprintf (admin_err_msg, "invalid value : %s", conf_value);
2213  goto set_conf_error;
2214  }
2215 
2216  if (stmt_cnt < 1)
2217  {
2218  sprintf (admin_err_msg, "value is out of range : %s", conf_value);
2219  goto set_conf_error;
2220  }
2221 
2222  if (br_info_p->max_prepared_stmt_count == stmt_cnt)
2223  {
2224  sprintf (admin_err_msg, "same as previous value : %s", conf_value);
2225  goto set_conf_error;
2226  }
2227 
2228  if (br_info_p->max_prepared_stmt_count > stmt_cnt)
2229  {
2230  sprintf (admin_err_msg, "cannot be decreased below the previous value '%d' : %s",
2231  br_info_p->max_prepared_stmt_count, conf_value);
2232  goto set_conf_error;
2233  }
2234 
2235  br_info_p->max_prepared_stmt_count = stmt_cnt;
2236  shm_as_p->max_prepared_stmt_count = stmt_cnt;
2237  }
2238  else if (strcasecmp (conf_name, "SESSION_TIMEOUT") == 0)
2239  {
2240  int session_timeout = 0;
2241 
2242  session_timeout = (int) ut_time_string_to_sec ((char *) conf_value, "sec");
2243  if (session_timeout < 0)
2244  {
2245  sprintf (admin_err_msg, "invalid value : %s", conf_value);
2246  goto set_conf_error;
2247  }
2248 
2249  if (br_info_p->session_timeout == session_timeout)
2250  {
2251  sprintf (admin_err_msg, "same as previous value : %s", conf_value);
2252  goto set_conf_error;
2253  }
2254 
2255  br_info_p->session_timeout = session_timeout;
2256  shm_as_p->session_timeout = session_timeout;
2257  }
2258  else if (strcasecmp (conf_name, "ERROR_LOG_DIR") == 0)
2259  {
2260  char *err_log_dir = (char *) conf_value;
2261  size_t err_log_dir_len = 0;
2262 
2263  err_log_dir_len = strlen (err_log_dir);
2264 
2265  if (err_log_dir_len >= CONF_LOG_FILE_LEN)
2266  {
2267  sprintf (admin_err_msg, "The length of ERROR_LOG_DIR is too long.");
2268  goto set_conf_error;
2269  }
2270 
2271  ut_cd_root_dir (); /* change the working directory to $CUBRID */
2272 
2273  memset (path_org, 0x00, BROKER_PATH_MAX);
2274  memset (path_new, 0x00, BROKER_PATH_MAX);
2275 
2276  MAKE_FILEPATH (path_org, br_info_p->err_log_dir, BROKER_PATH_MAX);
2277  MAKE_FILEPATH (path_new, err_log_dir, BROKER_PATH_MAX);
2278 
2279 #if defined(WINDOWS)
2280  if (strcasecmp (path_org, path_new) == 0)
2281 #else
2282  if (strcmp (path_org, path_new) == 0)
2283 #endif
2284  {
2285  sprintf (admin_err_msg, "same as previous value : %s", err_log_dir);
2286  goto set_conf_error;
2287  }
2288 
2289  broker_create_dir (path_new);
2290  if (access (path_new, F_OK) < 0)
2291  {
2292  sprintf (admin_err_msg, "cannot access the path : %s", path_new);
2293  goto set_conf_error;
2294  }
2295 
2296  ut_cd_work_dir (); /* change the working directory to $CUBRID/bin */
2297 
2298  strcpy (br_info_p->err_log_dir, path_new);
2299  strcpy (shm_as_p->err_log_dir, path_new);
2300 
2301  for (i = 0; i < shm_as_p->num_appl_server && i < APPL_SERVER_NUM_LIMIT; i++)
2302  {
2304  }
2305  }
2306  else if (strcasecmp (conf_name, "LOG_DIR") == 0)
2307  {
2308  char *log_dir = (char *) conf_value;
2309  size_t log_dir_len = 0;
2310 
2311  log_dir_len = strlen (log_dir);
2312 
2313  if (log_dir_len >= CONF_LOG_FILE_LEN)
2314  {
2315  sprintf (admin_err_msg, "The length of LOG_DIR is too long.");
2316  goto set_conf_error;
2317  }
2318 
2319  ut_cd_root_dir (); /* change the working directory to $CUBRID */
2320 
2321  memset (path_org, 0x00, BROKER_PATH_MAX);
2322  memset (path_new, 0x00, BROKER_PATH_MAX);
2323 
2324  MAKE_FILEPATH (path_org, br_info_p->log_dir, BROKER_PATH_MAX);
2325  MAKE_FILEPATH (path_new, log_dir, BROKER_PATH_MAX);
2326 
2327 #if defined(WINDOWS)
2328  if (strcasecmp (path_org, path_new) == 0)
2329 #else
2330  if (strcmp (path_org, path_new) == 0)
2331 #endif
2332  {
2333  sprintf (admin_err_msg, "same as previous value : %s", log_dir);
2334  goto set_conf_error;
2335  }
2336 
2337  broker_create_dir (path_new);
2338  if (access (path_new, F_OK) < 0)
2339  {
2340  sprintf (admin_err_msg, "cannot access the path : %s", path_new);
2341  goto set_conf_error;
2342  }
2343 
2344  ut_cd_work_dir (); /* change the working directory to $CUBRID/bin */
2345 
2346  strcpy (br_info_p->log_dir, path_new);
2347  strcpy (shm_as_p->log_dir, path_new);
2348 
2349  for (i = 0; i < shm_as_p->num_appl_server && i < APPL_SERVER_NUM_LIMIT; i++)
2350  {
2352  }
2353  }
2354  else if (strcasecmp (conf_name, "SLOW_LOG_DIR") == 0)
2355  {
2356  char *slow_log_dir = (char *) conf_value;
2357  size_t slow_log_dir_len = 0;
2358 
2359  slow_log_dir_len = strlen (slow_log_dir);
2360 
2361  if (slow_log_dir_len >= CONF_LOG_FILE_LEN)
2362  {
2363  sprintf (admin_err_msg, "The length of SLOW_LOG_DIR is too long.");
2364  goto set_conf_error;
2365  }
2366 
2367  ut_cd_root_dir (); /* change the working directory to $CUBRID */
2368 
2369  memset (path_org, 0x00, BROKER_PATH_MAX);
2370  memset (path_new, 0x00, BROKER_PATH_MAX);
2371 
2372  MAKE_FILEPATH (path_org, br_info_p->slow_log_dir, BROKER_PATH_MAX);
2373  MAKE_FILEPATH (path_new, slow_log_dir, BROKER_PATH_MAX);
2374 
2375 #if defined(WINDOWS)
2376  if (strcasecmp (path_org, path_new) == 0)
2377 #else
2378  if (strcmp (path_org, path_new) == 0)
2379 #endif
2380  {
2381  sprintf (admin_err_msg, "same as previous value : %s", slow_log_dir);
2382  goto set_conf_error;
2383  }
2384 
2385  broker_create_dir (path_new);
2386  if (access (path_new, F_OK) < 0)
2387  {
2388  sprintf (admin_err_msg, "cannot access the path : %s", path_new);
2389  goto set_conf_error;
2390  }
2391 
2392  ut_cd_work_dir (); /* change the working directory to $CUBRID/bin */
2393 
2394  strcpy (br_info_p->slow_log_dir, path_new);
2395  strcpy (shm_as_p->slow_log_dir, path_new);
2396 
2397  for (i = 0; i < shm_as_p->num_appl_server && i < APPL_SERVER_NUM_LIMIT; i++)
2398  {
2400  }
2401  }
2402  else if (strcasecmp (conf_name, "ENABLE_MONITOR_SERVER") == 0)
2403  {
2404  int monitor_server_flag;
2405 
2406  monitor_server_flag = conf_get_value_table_on_off (conf_value);
2407  if (monitor_server_flag < 0)
2408  {
2409  sprintf (admin_err_msg, "invalid value : %s", conf_value);
2410  goto set_conf_error;
2411  }
2412  br_info_p->monitor_server_flag = monitor_server_flag;
2413  shm_as_p->monitor_server_flag = monitor_server_flag;
2414  }
2415  else
2416  {
2417  sprintf (admin_err_msg, "unknown keyword %s", conf_name);
2418  goto set_conf_error;
2419  }
2420 
2421  if (shm_proxy_p)
2422  {
2423  uw_shm_detach (shm_proxy_p);
2424  }
2425  if (shm_as_p)
2426  {
2427  uw_shm_detach (shm_as_p);
2428  }
2429  if (shm_br)
2430  {
2431  uw_shm_detach (shm_br);
2432  }
2433  return 0;
2434 
2435 set_conf_error:
2436  if (shm_proxy_p)
2437  {
2438  uw_shm_detach (shm_proxy_p);
2439  }
2440  if (shm_as_p)
2441  {
2442  uw_shm_detach (shm_as_p);
2443  }
2444  if (shm_br)
2445  {
2446  uw_shm_detach (shm_br);
2447  }
2448  return -1;
2449 }
2450 
2451 int
2452 admin_del_cas_log (int master_shmid, const char *broker, int asid)
2453 {
2456  int i, br_index;
2457  int appl_shm_key;
2458 
2459  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shmid, SHM_BROKER, SHM_MODE_ADMIN);
2460  if (shm_br == NULL)
2461  {
2462  goto error;
2463  }
2464 
2465  br_index = -1;
2466  for (i = 0; i < shm_br->num_broker; i++)
2467  {
2468  if (strcasecmp (broker, shm_br->br_info[i].name) == 0)
2469  {
2470  appl_shm_key = shm_br->br_info[i].appl_server_shm_id;
2471  br_index = i;
2472  break;
2473  }
2474  }
2475  if (br_index < 0)
2476  {
2477  goto error;
2478  }
2479 
2480  shm_appl = (T_SHM_APPL_SERVER *) uw_shm_open (appl_shm_key, SHM_APPL_SERVER, SHM_MODE_ADMIN);
2481  if (shm_appl == NULL)
2482  goto error;
2483 
2484  if (asid < 1 || asid > shm_br->br_info[br_index].appl_server_max_num)
2485  goto error;
2486  asid--;
2487 
2488  if (shm_appl->as_info[asid].service_flag != SERVICE_ON
2489  || (IS_NOT_APPL_SERVER_TYPE_CAS (shm_br->br_info[br_index].appl_server)))
2490  {
2491  goto error;
2492  }
2493 
2494  shm_appl->as_info[asid].cas_log_reset = CAS_LOG_RESET_REMOVE;
2495 
2496  uw_shm_detach (shm_appl);
2497  uw_shm_detach (shm_br);
2498  return 0;
2499 
2500 error:
2501  if (shm_appl)
2502  uw_shm_detach (shm_appl);
2503  if (shm_br)
2504  uw_shm_detach (shm_br);
2505  return -1;
2506 }
2507 
2508 void
2510 {
2511  int i, j;
2512  char *p;
2513  const char *clt_envs[] = { SID_ENV_STR,
2523  NULL
2524  };
2525 
2526  for (i = 0; environ[i] != NULL; i++)
2527  {
2528  p = strchr (environ[i], '=');
2529  if (p == NULL)
2530  {
2531  environ[i] = (char *) "DUMMY_ENV=VISION_THREE";
2532  continue;
2533  }
2534  for (j = 0; clt_envs[j] != NULL; j++)
2535  {
2536  if (strncmp (environ[i], clt_envs[j], strlen (clt_envs[j])) == 0)
2537  {
2538  environ[i] = (char *) "DUMMY_ENV=VISION_THREE";
2539  break;
2540  }
2541  }
2542  }
2543 }
2544 
2545 int
2546 admin_acl_status_cmd (int master_shm_id, const char *broker_name)
2547 {
2548  int i, j, k, m;
2549  int br_index;
2552  char line_buf[LINE_MAX];
2553  char str[32];
2554  int len = 0;
2555 
2556  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_MONITOR);
2557 
2558  if (shm_br == NULL)
2559  {
2561  return -1;
2562  }
2563 
2564  br_index = -1;
2565  if (broker_name != NULL)
2566  {
2567  for (i = 0; i < shm_br->num_broker; i++)
2568  {
2569  if (strcmp (shm_br->br_info[i].name, broker_name) == 0)
2570  {
2571  br_index = i;
2572  break;
2573  }
2574  }
2575  if (br_index == -1)
2576  {
2577  sprintf (admin_err_msg, "Cannot find broker [%s]\n", broker_name);
2578  uw_shm_detach (shm_br);
2579  return -1;
2580  }
2581  }
2582 
2583  fprintf (stdout, "ACCESS_CONTROL=%s\n", (shm_br->access_control) ? "ON" : "OFF");
2584  fprintf (stdout, "ACCESS_CONTROL_FILE=%s\n\n", shm_br->access_control_file);
2585 
2586  if (shm_br->access_control == false || shm_br->access_control_file[0] == '\0')
2587  {
2588  uw_shm_detach (shm_br);
2589  return 0;
2590  }
2591 
2592  if (br_index < 0)
2593  {
2594  for (i = 0; i < shm_br->num_broker; i++)
2595  {
2596  if (shm_br->br_info[i].service_flag == OFF)
2597  {
2598  continue;
2599  }
2600 
2601  shm_appl =
2604  if (shm_appl == NULL)
2605  {
2607  uw_shm_detach (shm_br);
2608  return -1;
2609  }
2610 
2611  fprintf (stdout, "[%%%s]\n", shm_appl->broker_name);
2612 
2613  for (j = 0; j < shm_appl->num_access_info; j++)
2614  {
2615  fprintf (stdout, "%s:%s:%s\n", shm_appl->access_info[j].dbname, shm_appl->access_info[j].dbuser,
2616  shm_appl->access_info[j].ip_files);
2617 
2618  len = 0;
2619  len += sprintf (line_buf + len, "%16s ", "CLIENT IP");
2620  len += sprintf (line_buf + len, "%25s", "LAST ACCESS TIME");
2621  fprintf (stdout, "%s\n", line_buf);
2622 
2623  for (k = 0; k < len; k++)
2624  {
2625  line_buf[k] = '=';
2626  }
2627  line_buf[k] = '\0';
2628  fprintf (stdout, "%s\n", line_buf);
2629 
2630  for (k = 0; k < shm_appl->access_info[j].ip_info.num_list; k++)
2631  {
2632  int address_index = k * IP_BYTE_COUNT;
2633 
2634  len = 0;
2635  for (m = 0; m < shm_appl->access_info[j].ip_info.address_list[address_index]; m++)
2636  {
2637  len +=
2638  sprintf (str + len, "%d%s",
2639  shm_appl->access_info[j].ip_info.address_list[address_index + m + 1],
2640  ((m != 3) ? "." : ""));
2641  }
2642 
2643  if (m != 4)
2644  {
2645  len += sprintf (str + len, "*");
2646  }
2647 
2648  len = sprintf (line_buf, "%16.16s ", str);
2649 
2650  if (shm_appl->access_info[j].ip_info.last_access_time[k] != 0)
2651  {
2652  struct tm cur_tm;
2653  localtime_r (&shm_appl->access_info[j].ip_info.last_access_time[k], &cur_tm);
2654  cur_tm.tm_year += 1900;
2655 
2656  sprintf (str, "%02d-%02d-%02d %02d:%02d:%02d", cur_tm.tm_year, cur_tm.tm_mon + 1, cur_tm.tm_mday,
2657  cur_tm.tm_hour, cur_tm.tm_min, cur_tm.tm_sec);
2658  len += sprintf (line_buf + len, "%25.25s", str);
2659  }
2660 
2661  fprintf (stdout, "%s\n", line_buf);
2662  }
2663  fprintf (stdout, "\n");
2664  }
2665  fprintf (stdout, "\n");
2666  uw_shm_detach (shm_appl);
2667  }
2668  }
2669  else
2670  {
2671  shm_appl =
2674  if (shm_appl == NULL)
2675  {
2677  uw_shm_detach (shm_br);
2678  return -1;
2679  }
2680 
2681  fprintf (stdout, "[%%%s]\n", shm_appl->broker_name);
2682 
2683  for (j = 0; j < shm_appl->num_access_info; j++)
2684  {
2685  fprintf (stdout, "%s:%s:%s\n", shm_appl->access_info[j].dbname, shm_appl->access_info[j].dbuser,
2686  shm_appl->access_info[j].ip_files);
2687 
2688  len = 0;
2689  len += sprintf (line_buf + len, "%16s ", "CLIENT IP");
2690  len += sprintf (line_buf + len, "%25s", "LAST ACCESS TIME");
2691  fprintf (stdout, "%s\n", line_buf);
2692 
2693  for (k = 0; k < len; k++)
2694  {
2695  line_buf[k] = '=';
2696  }
2697  line_buf[k] = '\0';
2698  fprintf (stdout, "%s\n", line_buf);
2699 
2700  for (k = 0; k < shm_appl->access_info[j].ip_info.num_list; k++)
2701  {
2702  int address_index = k * IP_BYTE_COUNT;
2703 
2704  len = 0;
2705  for (m = 0; m < shm_appl->access_info[j].ip_info.address_list[address_index]; m++)
2706  {
2707  len +=
2708  sprintf (str + len, "%d%s", shm_appl->access_info[j].ip_info.address_list[address_index + m + 1],
2709  ((m != 3) ? "." : ""));
2710  }
2711 
2712  if (m != 4)
2713  {
2714  len += sprintf (str + len, "*");
2715  }
2716 
2717  len = sprintf (line_buf, "%16.16s ", str);
2718 
2719  if (shm_appl->access_info[j].ip_info.last_access_time[k] != 0)
2720  {
2721  struct tm cur_tm;
2722  localtime_r (&shm_appl->access_info[j].ip_info.last_access_time[k], &cur_tm);
2723  cur_tm.tm_year += 1900;
2724 
2725  sprintf (str, "%02d-%02d-%02d %02d:%02d:%02d", cur_tm.tm_year, cur_tm.tm_mon + 1, cur_tm.tm_mday,
2726  cur_tm.tm_hour, cur_tm.tm_min, cur_tm.tm_sec);
2727  len += sprintf (line_buf + len, "%25.25s", str);
2728  }
2729 
2730  fprintf (stdout, "%s\n", line_buf);
2731  }
2732  fprintf (stdout, "\n");
2733  }
2734  fprintf (stdout, "\n");
2735  uw_shm_detach (shm_appl);
2736  }
2737 
2738  uw_shm_detach (shm_br);
2739  return 0;
2740 }
2741 
2742 int
2743 admin_acl_reload_cmd (int master_shm_id, const char *broker_name)
2744 {
2745  int i;
2746  int br_index;
2749  char *access_file_name;
2750 
2751  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
2752 
2753  if (shm_br == NULL)
2754  {
2756  return -1;
2757  }
2758 
2759  br_index = -1;
2760  if (broker_name != NULL)
2761  {
2762  for (i = 0; i < shm_br->num_broker; i++)
2763  {
2764  if (strcmp (shm_br->br_info[i].name, broker_name) == 0)
2765  {
2766  br_index = i;
2767  break;
2768  }
2769  }
2770  if (br_index == -1)
2771  {
2772  sprintf (admin_err_msg, "Cannot find broker [%s]\n", broker_name);
2773  uw_shm_detach (shm_br);
2774  return -1;
2775  }
2776  }
2777 
2778  if (shm_br->access_control == false || shm_br->access_control_file[0] == '\0')
2779  {
2780  uw_shm_detach (shm_br);
2781  return 0;
2782  }
2783 
2785  access_file_name = get_cubrid_file_ptr (FID_ACCESS_CONTROL_FILE);
2786 
2787  if (br_index < 0)
2788  {
2789  for (i = 0; i < shm_br->num_broker; i++)
2790  {
2791  if (shm_br->br_info[i].service_flag == OFF)
2792  {
2793  continue;
2794  }
2795 
2796  shm_appl =
2798  if (shm_appl == NULL)
2799  {
2801  uw_shm_detach (shm_br);
2802  return -1;
2803  }
2804  if (access_control_read_config_file (shm_appl, access_file_name, admin_err_msg) != 0)
2805  {
2806  uw_shm_detach (shm_appl);
2807  uw_shm_detach (shm_br);
2808  return -1;
2809  }
2810  uw_shm_detach (shm_appl);
2811  }
2812  }
2813  else
2814  {
2815  shm_appl =
2817  SHM_MODE_ADMIN);
2818  if (shm_appl == NULL)
2819  {
2821  uw_shm_detach (shm_br);
2822  return -1;
2823  }
2824 
2825  if (access_control_read_config_file (shm_appl, access_file_name, admin_err_msg) != 0)
2826  {
2827  uw_shm_detach (shm_appl);
2828  uw_shm_detach (shm_br);
2829  return -1;
2830  }
2831 
2832  uw_shm_detach (shm_appl);
2833  }
2834 
2835  uw_shm_detach (shm_br);
2836  return 0;
2837 }
2838 
2839 static int
2840 br_activate (T_BROKER_INFO * br_info, int master_shm_id, T_SHM_BROKER * shm_br)
2841 {
2842  int pid, i, res = 0;
2844  T_APPL_SERVER_INFO *as_info_p = NULL;
2845  char **env = NULL;
2846  int env_num = 0;
2847  char port_str[BROKER_PATH_MAX];
2848  char master_shm_key_str[32];
2849  const char *broker_exe_name;
2850  int broker_check_loop_count = 30;
2851  T_SHM_PROXY *shm_proxy_p = NULL;
2852 
2853  if (br_info->shard_flag == ON)
2854  {
2855 
2856  shm_proxy_p = (T_SHM_PROXY *) uw_shm_open (br_info->proxy_shm_id, SHM_PROXY, SHM_MODE_ADMIN);
2857 
2858  if (shm_proxy_p == NULL)
2859  {
2860  sprintf (admin_err_msg, "%s: cannot open shared memory", br_info->name);
2861  res = -1;
2862  goto end;
2863  }
2864  }
2865 
2866  br_info->err_code = UW_ER_NO_ERROR + 1;
2867  br_info->os_err_code = 0;
2868  br_info->num_busy_count = 0;
2869  br_info->reject_client_count = 0;
2870 
2872  if (shm_appl == NULL)
2873  {
2874  sprintf (admin_err_msg, "%s: cannot open shared memory", br_info->name);
2875  res = -1;
2876  goto end;
2877  }
2879 
2880 #if defined(WINDOWS)
2881  shm_appl->use_pdh_flag = FALSE;
2882  br_info->pdh_workset = 0;
2883  br_info->pdh_pct_cpu = 0;
2884 #endif /* WINDOWS */
2885 
2886  env = make_env (br_info->source_env, &env_num);
2887 
2888 #if !defined(WINDOWS)
2889  if (br_info->shard_flag == ON)
2890  {
2891  unlink (shm_appl->port_name);
2892  }
2893  signal (SIGCHLD, SIG_IGN);
2894 #endif /* !WINDOWS */
2895 
2896 #if !defined(WINDOWS)
2897  if ((pid = fork ()) < 0)
2898  {
2899  strcpy (admin_err_msg, "fork error");
2900  res = -1;
2901  goto end;
2902  }
2903 #endif /* WINDOWS */
2904 
2905  br_info->ready_to_service = false;
2906 #if !defined(WINDOWS)
2907  if (pid == 0)
2908  {
2909  signal (SIGCHLD, SIG_DFL);
2910 #if defined(V3_ADMIN_D)
2911  if (admin_clt_sock_fd > 0)
2912  CLOSE_SOCKET (admin_clt_sock_fd);
2913  if (admin_srv_sock_fd > 0)
2914  CLOSE_SOCKET (admin_srv_sock_fd);
2915 #endif /* V3_ADMIN_D */
2916 #endif /* WINDOWS */
2917 
2918  if (env != NULL)
2919  {
2920  for (i = 0; i < env_num; i++)
2921  putenv (env[i]);
2922  }
2923 
2924  sprintf (port_str, "%s=%d", PORT_NUMBER_ENV_STR, br_info->port);
2925  putenv (port_str);
2926  sprintf (master_shm_key_str, "%s=%d", MASTER_SHM_KEY_ENV_STR, master_shm_id);
2927  putenv (master_shm_key_str);
2928 
2929  if (IS_APPL_SERVER_TYPE_CAS (br_info->appl_server))
2930  {
2931  broker_exe_name = NAME_CAS_BROKER;
2932  }
2933  else
2934  {
2935  broker_exe_name = NAME_BROKER;
2936  }
2937 
2938 #if defined(WINDOWS)
2939  if (IS_APPL_SERVER_TYPE_CAS (br_info->appl_server) && br_info->appl_server_port < 0)
2940  broker_exe_name = NAME_CAS_BROKER2;
2941 #endif /* WINDOWS */
2942 
2943 #if !defined(WINDOWS)
2944  uw_shm_detach (shm_appl);
2945  uw_shm_detach (shm_br);
2946 #endif /* !WINDOWS */
2947 
2948 #if defined(WINDOWS)
2949  pid = run_child (broker_exe_name);
2950 #else /* WINDOWS */
2951  if (execle (broker_exe_name, broker_exe_name, NULL, environ) < 0)
2952  {
2953  perror (broker_exe_name);
2954  exit (0);
2955  }
2956  exit (0);
2957  }
2958 
2959 #endif /* WINDOWS */
2960  if (br_info->shard_flag == ON)
2961  {
2962  if (proxy_activate (br_info, shm_proxy_p, shm_appl, env, env_num) < 0)
2963  {
2964  res = -1;
2965  goto end;
2966  }
2967  }
2968 
2969  SLEEP_MILISEC (0, 200);
2970 
2971  br_info->pid = pid;
2972 
2973 #if defined(WINDOWS)
2974  shm_appl->as_port = br_info->appl_server_port;
2975 #endif /* WINDOWS */
2976 
2977  if (br_info->shard_flag == ON)
2978  {
2979  for (i = 0; i < br_info->appl_server_max_num; i++)
2980  {
2981  as_info_p = &shm_appl->as_info[i];
2982  if (as_info_p->advance_activate_flag)
2983  {
2984  as_activate (shm_br, br_info, shm_appl, as_info_p, i, env, env_num);
2985  }
2986  }
2987 
2988  for (i = 0; i < br_info->appl_server_max_num; i++)
2989  {
2990  as_info_p = &shm_appl->as_info[i];
2991  if (as_info_p->advance_activate_flag)
2992  {
2993  if (ut_is_appl_server_ready (as_info_p->pid, &as_info_p->service_ready_flag) == false)
2994  {
2995  sprintf (admin_err_msg, "%s: failed to run appl server. \n", br_info->name);
2996  res = -1;
2997  goto end;
2998  }
2999  }
3000  }
3001  }
3002  else
3003  {
3004  for (i = 0; i < shm_appl->num_appl_server && i < APPL_SERVER_NUM_LIMIT; i++)
3005  {
3006  as_activate (shm_br, br_info, shm_appl, &shm_appl->as_info[i], i, env, env_num);
3007  }
3008  for (; i < br_info->appl_server_max_num; i++)
3009  {
3010  CON_STATUS_LOCK_INIT (&(shm_appl->as_info[i]));
3011  }
3012  }
3013 
3014  br_info->ready_to_service = true;
3015  br_info->service_flag = ON;
3016 
3017  for (i = 0; i < broker_check_loop_count; i++)
3018  {
3019  if (br_info->err_code > 0)
3020  {
3021  SLEEP_MILISEC (0, 100);
3022  }
3023  else
3024  {
3025  if (br_info->err_code < 0)
3026  {
3027  sprintf (admin_err_msg, "%s: %s", br_info->name,
3028  uw_get_error_message (br_info->err_code, br_info->os_err_code));
3029  res = -1;
3030  }
3031  break;
3032  }
3033  }
3034 
3035  if (i == broker_check_loop_count)
3036  {
3037  sprintf (admin_err_msg, "%s: unknown error", br_info->name);
3038  res = -1;
3039  }
3040 
3041 end:
3042  if (shm_appl)
3043  {
3044  uw_shm_detach (shm_appl);
3045  }
3046  if (shm_proxy_p)
3047  {
3048  uw_shm_detach (shm_proxy_p);
3049  }
3050  if (env)
3051  {
3052  free_env (env, env_num);
3053  }
3054 
3055  return res;
3056 }
3057 
3058 static int
3060 {
3061  int res = 0;
3062  int as_index;
3064  time_t cur_time = time (NULL);
3065  struct tm ct;
3066  int proxy_index;
3067  T_SHM_PROXY *shm_proxy_p = NULL;
3069 #if defined(WINDOWS)
3070  char acl_sem_name[BROKER_NAME_LEN];
3071 #endif /* WINDOWS */
3072 
3073  if (localtime_r (&cur_time, &ct) == NULL)
3074  {
3075  res = -1;
3076  goto end;
3077  }
3078  ct.tm_year += 1900;
3079 
3080  if (br_info->pid)
3081  {
3082  ut_kill_broker_process (br_info->pid, br_info->name);
3083 
3084  br_info->pid = 0;
3085 
3086  SLEEP_MILISEC (1, 0);
3087  }
3088 
3090 
3091  if (shm_appl == NULL)
3092  {
3094  res = -1;
3095  goto end;
3096  }
3097 
3098  if (br_info->shard_flag == ON)
3099  {
3100 
3101  shm_proxy_p = (T_SHM_PROXY *) uw_shm_open (br_info->proxy_shm_id, SHM_PROXY, SHM_MODE_ADMIN);
3102  if (shm_proxy_p == NULL)
3103  {
3105  res = -1;
3106  goto end;
3107  }
3108 
3109  for (proxy_index = 0; proxy_index < shm_proxy_p->num_proxy; proxy_index++)
3110  {
3111  proxy_info_p = shard_shm_find_proxy_info (shm_proxy_p, proxy_index);
3112 
3113  proxy_inactivate (br_info, proxy_info_p);
3114  }
3115  }
3116 
3117  for (as_index = 0; as_index < br_info->appl_server_max_num; as_index++)
3118  {
3119  as_inactivate (&shm_appl->as_info[as_index], br_info->name, shm_appl->shard_flag);
3120  }
3121 
3122  if (br_info->log_backup == ON)
3123  {
3125  }
3126  else
3127  {
3128  unlink (br_info->error_log_file);
3129  }
3130 
3131  br_info->num_busy_count = 0;
3132  br_info->service_flag = OFF;
3133 
3134 #if defined (WINDOWS)
3135  MAKE_ACL_SEM_NAME (acl_sem_name, shm_appl->broker_name);
3136  uw_sem_destroy (acl_sem_name);
3137 #else
3138  uw_sem_destroy (&shm_appl->acl_sem);
3139 #endif
3140 
3141 end:
3142  if (shm_appl)
3143  {
3144  uw_shm_detach (shm_appl);
3145  }
3146  if (shm_proxy_p)
3147  {
3148  uw_shm_detach (shm_proxy_p);
3149  }
3150  return res;
3151 }
3152 
3153 static void
3155  int as_index, char **env, int env_num)
3156 {
3157  int pid;
3158  char appl_server_shm_key_env_str[32];
3159  char appl_name[APPL_SERVER_NAME_MAX_SIZE];
3160  int i;
3161  char as_id_env_str[32];
3162 
3163 #if !defined(WINDOWS)
3164  char process_name[128];
3165  char port_name[BROKER_PATH_MAX];
3166 
3167  if (br_info->shard_flag == OFF)
3168  {
3169  ut_get_as_port_name (port_name, br_info->name, as_index, BROKER_PATH_MAX);
3170  unlink (port_name);
3171  }
3172 #endif /* !WINDOWS */
3173  /* mutex variable initialize */
3174  as_info->mutex_flag[SHM_MUTEX_BROKER] = FALSE;
3175  as_info->mutex_flag[SHM_MUTEX_ADMIN] = FALSE;
3176  as_info->mutex_turn = SHM_MUTEX_BROKER;
3177  CON_STATUS_LOCK_INIT (as_info);
3178 
3179  as_info->num_request = 0;
3180  as_info->uts_status = UTS_STATUS_START;
3181  as_info->reset_flag = FALSE;
3182  as_info->clt_appl_name[0] = '\0';
3183  as_info->clt_req_path_info[0] = '\0';
3184  as_info->cur_sql_log_mode = shm_appl->sql_log_mode;
3185  as_info->cur_slow_log_mode = shm_appl->slow_log_mode;
3186 
3187  memset (&as_info->cas_clt_ip[0], 0x0, sizeof (as_info->cas_clt_ip));
3188  as_info->cas_clt_port = 0;
3189  as_info->driver_version[0] = '\0';
3190 
3191 #if defined(WINDOWS)
3192  as_info->pdh_pid = 0;
3193  as_info->pdh_workset = 0;
3194  as_info->pdh_pct_cpu = 0;
3195 #endif /* WINDOWS */
3196 
3197  as_info->service_ready_flag = FALSE;
3198 
3199 #if defined(WINDOWS)
3200  pid = 0;
3201 #else /* WINDOWS */
3202  pid = fork ();
3203  if (pid < 0)
3204  {
3205  perror ("fork");
3206  }
3207 #endif /* !WINDOWS */
3208 
3209  if (pid == 0)
3210  {
3211  if (env != NULL)
3212  {
3213  for (i = 0; i < env_num; i++)
3214  putenv (env[i]);
3215  }
3216 
3217  sprintf (appl_server_shm_key_env_str, "%s=%d", APPL_SERVER_SHM_KEY_STR, br_info->appl_server_shm_id);
3218  putenv (appl_server_shm_key_env_str);
3219 
3220  snprintf (as_id_env_str, sizeof (as_id_env_str), "%s=%d", AS_ID_ENV_STR, as_index);
3221  putenv (as_id_env_str);
3222 
3223  strcpy (appl_name, shm_appl->appl_server_name);
3224 
3225 
3226 #if !defined(WINDOWS)
3227 
3228  if (br_info->shard_flag == ON)
3229  {
3230  snprintf (process_name, sizeof (process_name) - 1, "%s_%s_%d_%d_%d", shm_appl->broker_name, appl_name,
3231  as_info->proxy_id + 1, as_info->shard_id, as_info->shard_cas_id + 1);
3232  }
3233  else if (br_info->appl_server == APPL_SERVER_CAS_ORACLE)
3234  {
3235  snprintf (process_name, sizeof (process_name) - 1, "%s", appl_name);
3236  }
3237  else
3238  {
3239  snprintf (process_name, sizeof (process_name) - 1, "%s_%s_%d", br_info->name, appl_name, as_index + 1);
3240  }
3241 
3242  uw_shm_detach (shm_appl);
3243  uw_shm_detach (shm_br);
3244 #endif /* !WINDOWS */
3245 
3246 #if defined(WINDOWS)
3247  pid = run_child (appl_name);
3248 #else /* WINDOWS */
3249  if (execle (appl_name, process_name, NULL, environ) < 0)
3250  {
3251  perror (appl_name);
3252  }
3253  exit (0);
3254 #endif /* WINDOWS */
3255  }
3256 
3257  if (br_info->shard_flag == OFF)
3258  {
3259  (void) ut_is_appl_server_ready (pid, &as_info->service_ready_flag);
3260  }
3261 
3262  as_info->pid = pid;
3263  as_info->last_access_time = time (NULL);
3264  as_info->transaction_start_time = (time_t) 0;
3265  as_info->psize_time = time (NULL);
3266  as_info->psize = getsize (as_info->pid);
3267 
3268  if (br_info->shard_flag == ON)
3269  {
3270  as_info->uts_status = UTS_STATUS_CON_WAIT;
3271  }
3272  else
3273  {
3274  as_info->uts_status = UTS_STATUS_IDLE;
3275  }
3276 
3277  as_info->service_flag = SERVICE_ON;
3278 }
3279 
3280 static void
3281 as_inactivate (T_APPL_SERVER_INFO * as_info_p, char *broker_name, int shard_flag)
3282 {
3283  if (as_info_p->pid <= 0)
3284  {
3285  return;
3286  }
3287 
3288  ut_kill_as_process (as_info_p->pid, broker_name, as_info_p->as_id, shard_flag);
3289 
3290  as_info_p->pid = 0;
3291  as_info_p->service_flag = SERVICE_OFF;
3292  as_info_p->service_ready_flag = FALSE;
3293 
3294  /* initialize con / uts status */
3295  as_info_p->uts_status = UTS_STATUS_IDLE;
3296  as_info_p->con_status = CON_STATUS_CLOSE;
3297 
3298  CON_STATUS_LOCK_DESTROY (as_info_p);
3299 
3300  return;
3301 }
3302 
3303 static int
3305 {
3307  T_SHARD_INFO *shard_info_p;
3308  int proxy_id, shard_id;
3309  int num_proxy;
3310  int res = 0;
3311 
3312  assert (shm_as_p != NULL);
3313  assert (shm_proxy_p != NULL);
3314 
3315  num_proxy = shm_proxy_p->num_proxy;
3316 
3317  assert (num_proxy <= MAX_PROXY_NUM);
3318 
3319  for (proxy_id = 0; proxy_id < num_proxy; proxy_id++)
3320  {
3321  proxy_info_p = shard_shm_find_proxy_info (shm_proxy_p, proxy_id);
3322 
3323  for (shard_id = 0; shard_id < proxy_info_p->num_shard_conn; shard_id++)
3324  {
3325  shard_info_p = shard_shm_find_shard_info (proxy_info_p, shard_id);
3326 
3327  res = check_shard_as_conn (shm_as_p, shard_info_p);
3328 
3329  if (res < 0)
3330  {
3331  sprintf (admin_err_msg,
3332  "failed to connect database. [%s]\n\n"
3333  "please check your $CUBRID/conf/cubrid_broker.conf or database status.\n\n" "[%%%s]\n"
3334  "%-20s = %s\n" "%-20s = %s\n", shm_as_p->broker_name, shm_as_p->broker_name, "SHARD_DB_NAME",
3335  shm_as_p->shard_conn_info[shard_id].db_name, "SHARD_DB_USER",
3336  shm_as_p->shard_conn_info[shard_id].db_user);
3337 
3338  return -1;
3339  }
3340  }
3341  }
3342 
3343  return 0;
3344 }
3345 
3346 static int
3348 {
3349  int i;
3350  int as_id;
3351 
3352  for (i = 0; i < SERVICE_READY_WAIT_COUNT; i++)
3353  {
3354  for (as_id = 0; as_id < shard_info_p->min_appl_server; as_id++)
3355  {
3356  if (shm_as_p->as_info[as_id + shard_info_p->as_info_index_base].uts_status != UTS_STATUS_CON_WAIT)
3357  {
3358  return 0;
3359  }
3360  }
3361 
3362  SLEEP_MILISEC (0, 10);
3363  }
3364 
3365  return -1;
3366 }
3367 
3368 static int
3370  int env_num)
3371 {
3372  int i;
3374 
3375  for (i = 0; i < shm_proxy_p->num_proxy; i++)
3376  {
3377  proxy_info_p = shard_shm_find_proxy_info (shm_proxy_p, i);
3378 
3379  snprintf (proxy_info_p->access_log_file, CONF_LOG_FILE_LEN - 1, "%s/%s_%d.access", CUBRID_BASE_DIR,
3380  br_info_p->name, i);
3381  dir_repath (proxy_info_p->access_log_file, CONF_LOG_FILE_LEN);
3382 
3383  proxy_info_p->cur_proxy_log_mode = br_info_p->proxy_log_mode;
3384 
3385  if (proxy_activate_internal (br_info_p->proxy_shm_id, shm_as_p, shm_proxy_p, i, env, env_num) < 0)
3386  {
3387  return -1;
3388  }
3389  }
3390  return 0;
3391 }
3392 
3393 static int
3395  char **env, int env_num)
3396 {
3397  int pid = 0, i;
3398  const char *proxy_exe_name = NAME_PROXY;
3399  char proxy_shm_id_env_str[32];
3400  char proxy_id_env_str[32];
3401 
3402 #if !defined (WINDOWS)
3403  char process_name[128];
3404 #endif
3405 
3407  T_SHARD_INFO *shard_info_p = NULL;
3408 
3409  proxy_info_p = shard_shm_find_proxy_info (shm_proxy_p, proxy_id);
3410  if (proxy_info_p == NULL)
3411  {
3412  return -1;
3413  }
3414 
3415  proxy_info_p->cur_client = 0;
3416 
3417  shard_info_p = shard_shm_find_shard_info (proxy_info_p, 0);
3418  if (shard_info_p == NULL)
3419  {
3420  return -1;
3421  }
3422 
3423  /* max_context should be GE max_client */
3424  if (proxy_info_p->max_context < proxy_info_p->max_client)
3425  {
3426  sprintf (admin_err_msg,
3427  "max_client %d is greater than %d [%s]\n\n" "please check your $CUBRID/conf/cubrid_broker.conf\n\n"
3428  "[%%%s]\n" "%-20s = %d\n" "%-20s = %d * %d\n", proxy_info_p->max_client, proxy_info_p->max_context,
3429  shm_as_p->broker_name, shm_as_p->broker_name, "SHARD_MAX_CLIENTS", proxy_info_p->max_client,
3430  "MAX_NUM_APPL_SERVER", shard_info_p->max_appl_server, proxy_info_p->max_shard);
3431  return -1;
3432  }
3433 
3434  ut_get_proxy_port_name (proxy_info_p->port_name, shm_as_p->broker_name, proxy_info_p->proxy_id, SHM_PROXY_NAME_MAX);
3435 
3436 #if !defined(WINDOWS)
3437  unlink (proxy_info_p->port_name);
3438 
3439  if ((pid = fork ()) < 0)
3440  {
3441  strcpy (admin_err_msg, "fork error");
3442 
3443  return -1;
3444  }
3445 #endif /* WINDOWS */
3446 
3447  if (pid == 0)
3448  {
3449 #if !defined(WINDOWS)
3450  signal (SIGCHLD, SIG_DFL);
3451 #endif /* !WINDOWS */
3452 
3453  if (env != NULL)
3454  {
3455  for (i = 0; i < env_num; i++)
3456  {
3457  putenv (env[i]);
3458  }
3459  }
3460  snprintf (proxy_shm_id_env_str, sizeof (proxy_shm_id_env_str), "%s=%d", PROXY_SHM_KEY_STR, proxy_shm_id);
3461  snprintf (proxy_id_env_str, sizeof (proxy_id_env_str), "%s=%d", PROXY_ID_ENV_STR, proxy_id);
3462 
3463  putenv (proxy_shm_id_env_str);
3464  putenv (proxy_id_env_str);
3465 
3466 #if !defined(WINDOWS)
3467  snprintf (process_name, sizeof (process_name) - 1, "%s_%s_%d", shm_as_p->broker_name, proxy_exe_name,
3468  proxy_id + 1);
3469 #endif /* !WINDOWS */
3470 
3471 
3472 #if defined(WINDOWS)
3473  pid = run_child (proxy_exe_name);
3474  }
3475 #else /* WINDOWS */
3476  if (execle (proxy_exe_name, process_name, NULL, environ) < 0)
3477  {
3478  perror (process_name);
3479  exit (0);
3480  }
3481  exit (0);
3482  }
3483 
3484 #endif /* WINDOWS */
3485 
3486  SLEEP_MILISEC (0, 200);
3487 
3488  proxy_info_p->pid = pid;
3489 
3490  return 0;
3491 }
3492 
3493 static void
3495 {
3496  if (proxy_info_p->pid > 0)
3497  {
3498  ut_kill_proxy_process (proxy_info_p->pid, br_info_p->name, proxy_info_p->proxy_id);
3499  }
3500  proxy_info_p->pid = 0;
3501  proxy_info_p->cur_client = 0;
3502 
3503  /* SHARD TODO : backup or remove access log file */
3504 
3505  return;
3506 }
3507 
3508 static void
3509 free_env (char **env, int env_num)
3510 {
3511  int i;
3512 
3513  if (env == NULL)
3514  {
3515  return;
3516  }
3517 
3518  for (i = 0; i < env_num; i++)
3519  {
3520  FREE_MEM (env[i]);
3521  }
3522  FREE_MEM (env);
3523 }
3524 
3525 static char **
3526 make_env (char *env_file, int *env_num)
3527 {
3528  char **env = NULL;
3529  int num, read_num;
3530  FILE *env_fp;
3531  char read_buf[BUFSIZ], col1[128], col2[128];
3532 
3533  *env_num = 0;
3534 
3535  if (env_file[0] == '\0')
3536  return NULL;
3537 
3538  env_fp = fopen (env_file, "r");
3539  if (env_fp == NULL)
3540  return NULL;
3541 
3542  num = 0;
3543 
3544  while (fgets (read_buf, BUFSIZ, env_fp) != NULL)
3545  {
3546  if (read_buf[0] == '#')
3547  continue;
3548  read_num = sscanf (read_buf, "%127s%127s", col1, col2);
3549  if (read_num != 2)
3550  continue;
3551 
3552  if (env == NULL)
3553  env = (char **) malloc (sizeof (char *));
3554  else
3555  env = (char **) realloc (env, sizeof (char *) * (num + 1));
3556  if (env == NULL)
3557  break;
3558 
3559  env[num] = (char *) malloc (strlen (col1) + strlen (col2) + 2);
3560  if (env[num] == NULL)
3561  {
3562  for (num--; num >= 0; num--)
3563  FREE_MEM (env[num]);
3564  FREE_MEM (env);
3565  env = NULL;
3566  break;
3567  }
3568 
3569  sprintf (env[num], "%s=%s", col1, col2);
3570  num++;
3571  }
3572 
3573  fclose (env_fp);
3574 
3575  *env_num = num;
3576  return env;
3577 }
3578 
3579 #if !defined(WINDOWS)
3580 #if defined (ENABLE_UNUSED_FUNCTION)
3581 static int
3582 get_cubrid_version ()
3583 {
3584  FILE *fp;
3585  char res_file[16];
3586  char cmd[32];
3587  int version = 0;
3588 
3589  strcpy (res_file, "ux_ver.uc_tmp");
3590  unlink (res_file);
3591 
3592  sprintf (cmd, "cubrid_rel > %s", res_file);
3593  system (cmd);
3594 
3595  fp = fopen (res_file, "r");
3596  if (fp != NULL)
3597  {
3598  char buf[1024];
3599  char *p;
3600  int major, minor;
3601  size_t n;
3602 
3603  n = fread (buf, 1, sizeof (buf) - 1, fp);
3604  if (n > 0 && n < sizeof (buf))
3605  {
3606  buf[n] = '\0';
3607  p = strstr (buf, "Release");
3608  if (p != NULL)
3609  {
3610  p += 7;
3611  if (sscanf (p, "%d%*c%d", &major, &minor) == 2)
3612  {
3613  version = MAKE_VERSION (major, minor);
3614  }
3615  }
3616  }
3617  fclose (fp);
3618  }
3619  unlink (res_file);
3620 
3621  return version;
3622 }
3623 #endif /* ENABLE_UNUSED_FUNCTION */
3624 #endif /* !WINDOWS */
3625 
3626 static void
3627 rename_error_log_file_name (char *error_log_file, struct tm *ct)
3628 {
3629  char cmd_buf[BUFSIZ];
3630 
3631  sprintf (cmd_buf, "%s.%02d%02d%02d.%02d%02d", error_log_file, ct->tm_year, ct->tm_mon + 1, ct->tm_mday, ct->tm_hour,
3632  ct->tm_min);
3633  rename (error_log_file, cmd_buf);
3634 }
3635 
3636 static int
3637 shard_shm_set_param_proxy (T_SHM_PROXY * proxy_p, const char *param_name, const char *param_value, int proxy_id)
3638 {
3639  int proxy_index;
3641 
3642  if (proxy_id < 0)
3643  {
3644  for (proxy_index = 0; proxy_index < proxy_p->num_proxy; proxy_index++)
3645  {
3646  proxy_info_p = shard_shm_find_proxy_info (proxy_p, proxy_index);
3647 
3648  if (shard_shm_set_param_proxy_internal (proxy_info_p, param_name, param_value) < 0)
3649  {
3650  return -1;
3651  }
3652  }
3653  }
3654  else
3655  {
3656  proxy_info_p = shard_shm_find_proxy_info (proxy_p, proxy_id);
3657 
3658  if (proxy_info_p == NULL)
3659  {
3660  sprintf (admin_err_msg, "Cannot find proxy info\n");
3661  return -1;
3662  }
3663 
3664  if (shard_shm_set_param_proxy_internal (proxy_info_p, param_name, param_value) < 0)
3665  {
3666  return -1;
3667  }
3668  }
3669 
3670  return 0;
3671 }
3672 
3673 static int
3674 shard_shm_set_param_proxy_internal (T_PROXY_INFO * proxy_info_p, const char *param_name, const char *param_value)
3675 {
3676  if (strcasecmp (param_name, "SHARD_PROXY_LOG") == 0)
3677  {
3678  char proxy_log_mode;
3679 
3680  proxy_log_mode = conf_get_value_proxy_log_mode (param_value);
3681 
3682  if (proxy_log_mode < 0)
3683  {
3684  sprintf (admin_err_msg, "invalid value : %s", param_value);
3685  return -1;
3686  }
3687 
3688  proxy_info_p->cur_proxy_log_mode = proxy_log_mode;
3689  }
3690 
3691  return 0;
3692 }
3693 
3694 #if defined (ENABLE_UNUSED_FUNCTION)
3695 static int
3696 shard_shm_set_param_shard (T_PROXY_INFO * proxy_info_p, const char *param_name, const char *param_value, int shard_id)
3697 {
3698  int i;
3700  T_SHARD_CONN_INFO *shard_conn_info_p = NULL;
3701 
3703  if (shm_as_p == NULL)
3704  {
3705  return -1;
3706  }
3707 
3708  if (shard_id < 0)
3709  {
3710  for (i = 0; i < proxy_info_p->num_shard_conn; i++)
3711  {
3712  shard_conn_info_p = &shm_as_p->shard_conn_info[i];
3713 
3714  shard_shm_set_param_shard_internal (shard_conn_info_p, param_name, param_value);
3715  }
3716  }
3717  else if (shard_id < proxy_info_p->num_shard_conn)
3718  {
3719  shard_conn_info_p = &shm_as_p->shard_conn_info[shard_id];
3720 
3721  shard_shm_set_param_shard_internal (shard_conn_info_p, param_name, param_value);
3722  }
3723  else
3724  {
3725  uw_shm_detach (shm_as_p);
3726  return -1;
3727  }
3728  uw_shm_detach (shm_as_p);
3729 
3730  return 0;
3731 }
3732 
3733 static int
3734 shard_shm_set_param_shard_internal (T_SHARD_CONN_INFO * shard_conn_info_p, const char *param_name,
3735  const char *param_value)
3736 {
3737  if (strcasecmp (param_name, "SHARD_DB_USER") == 0)
3738  {
3739  strncpy (shard_conn_info_p->db_user, param_value, sizeof (shard_conn_info_p->db_user) - 1);
3740  }
3741  else if (strcasecmp (param_name, "SHARD_DB_PASSWORD") == 0)
3742  {
3743  strncpy (shard_conn_info_p->db_password, param_value, sizeof (shard_conn_info_p->db_password) - 1);
3744  }
3745 
3746  return 0;
3747 }
3748 
3749 static int
3750 shard_shm_set_param_shard_in_proxy (T_SHM_PROXY * proxy_p, const char *param_name, const char *param_value,
3751  int proxy_id, int shard_id)
3752 {
3753  int proxy_index;
3754  T_PROXY_INFO *proxy_info_p = NULL;
3755 
3756  if (proxy_id < 0)
3757  {
3758  for (proxy_index = 0; proxy_index < proxy_p->num_proxy; proxy_index++)
3759  {
3760  proxy_info_p = shard_shm_find_proxy_info (proxy_p, proxy_index);
3761 
3762  if (shard_shm_set_param_shard (proxy_info_p, param_name, param_value, shard_id) < 0)
3763  {
3764  return -1;
3765  }
3766  }
3767  }
3768  else
3769  {
3770  proxy_info_p = shard_shm_find_proxy_info (proxy_p, proxy_id);
3771 
3772  if (proxy_info_p == NULL)
3773  {
3774  sprintf (admin_err_msg, "Cannot find proxy info\n");
3775  return -1;
3776  }
3777 
3778  if (shard_shm_set_param_shard (proxy_info_p, param_name, param_value, shard_id) < 0)
3779  {
3780  return -1;
3781  }
3782  }
3783 
3784  return 0;
3785 }
3786 #endif /* ENABLE_UNUSED_FUNCTION */
3787 
3788 static int
3789 shard_shm_set_param_as (T_PROXY_INFO * proxy_info_p, T_SHARD_INFO * shard_info_p, const char *param_name,
3790  const char *param_value, int as_number)
3791 {
3792  int i;
3794 
3796 
3797  if (as_number < 0)
3798  {
3799  for (i = 0; i < shard_info_p->max_appl_server; i++)
3800  {
3802  (&shm_as_p->as_info[i + shard_info_p->as_info_index_base], param_name, param_value) < 0)
3803  {
3804  uw_shm_detach (shm_as_p);
3805  return -1;
3806  }
3807  }
3808  }
3809  else
3810  {
3812  (&shm_as_p->as_info[as_number + shard_info_p->as_info_index_base], param_name, param_value) < 0)
3813  {
3814  uw_shm_detach (shm_as_p);
3815  return -1;
3816  }
3817  }
3818 
3819  uw_shm_detach (shm_as_p);
3820  return 0;
3821 }
3822 
3823 static int
3824 shard_shm_set_param_as_internal (T_APPL_SERVER_INFO * as_info, const char *param_name, const char *param_value)
3825 {
3826  if (strcasecmp (param_name, "SQL_LOG") == 0)
3827  {
3828  char sql_log_mode;
3829 
3830  sql_log_mode = conf_get_value_sql_log_mode (param_value);
3831 
3832  if (sql_log_mode < 0)
3833  {
3834  sprintf (admin_err_msg, "invalid value : %s", param_value);
3835  return -1;
3836  }
3837 
3838  as_info->cur_sql_log_mode = sql_log_mode;
3840  }
3841  else if (strcasecmp (param_name, "SLOW_LOG") == 0)
3842  {
3843  char slow_log_mode;
3844 
3845  slow_log_mode = conf_get_value_table_on_off (param_value);
3846 
3847  if (slow_log_mode < 0)
3848  {
3849  sprintf (admin_err_msg, "invalid value : %s", param_value);
3850  return -1;
3851  }
3852 
3853  as_info->cur_slow_log_mode = slow_log_mode;
3855  }
3856  else if (strcasecmp (param_name, "ACCESS_MODE") == 0 || strcasecmp (param_name, "CONNECT_ORDER") == 0
3857  || strcasecmp (param_name, "TRIGGER_ACTION") == 0)
3858  {
3859  as_info->reset_flag = TRUE;
3860  }
3861 
3862  return 0;
3863 }
3864 
3865 
3866 static int
3867 shard_shm_set_param_as_in_shard (T_PROXY_INFO * proxy_info_p, const char *param_name, const char *param_value,
3868  int shard_id, int as_number)
3869 {
3870  int shard_index;
3871  T_SHARD_INFO *shard_info_p = NULL;
3872 
3873  if (shard_id < 0)
3874  {
3875  for (shard_index = 0; shard_index < proxy_info_p->num_shard_conn; shard_index++)
3876  {
3877  shard_info_p = shard_shm_find_shard_info (proxy_info_p, shard_index);
3878 
3879  if (shard_shm_set_param_as (proxy_info_p, shard_info_p, param_name, param_value, as_number) < 0)
3880  {
3881  return -1;
3882  }
3883  }
3884  }
3885  else
3886  {
3887  shard_info_p = shard_shm_find_shard_info (proxy_info_p, shard_id);
3888 
3889  if (shard_info_p == NULL)
3890  {
3891  sprintf (admin_err_msg, "Cannot find shard info\n");
3892  return -1;
3893  }
3894 
3895  if (shard_shm_set_param_as (proxy_info_p, shard_info_p, param_name, param_value, as_number) < 0)
3896  {
3897  return -1;
3898  }
3899  }
3900 
3901  return 0;
3902 }
3903 
3904 static int
3905 shard_shm_set_param_as_in_proxy (T_SHM_PROXY * proxy_p, const char *param_name, const char *param_value, int proxy_id,
3906  int shard_id, int as_number)
3907 {
3908  int proxy_index;
3909  T_PROXY_INFO *proxy_info_p = NULL;
3910 
3911  if (proxy_id < 0)
3912  {
3913  for (proxy_index = 0; proxy_index < proxy_p->num_proxy; proxy_index++)
3914  {
3915  proxy_info_p = shard_shm_find_proxy_info (proxy_p, proxy_index);
3916 
3917  if (shard_shm_set_param_as_in_shard (proxy_info_p, param_name, param_value, shard_id, as_number) < 0)
3918  {
3919  return -1;
3920  }
3921  }
3922  }
3923  else
3924  {
3925  proxy_info_p = shard_shm_find_proxy_info (proxy_p, proxy_id);
3926 
3927  if (proxy_info_p == NULL)
3928  {
3929  sprintf (admin_err_msg, "Cannot find proxy info\n");
3930  return -1;
3931  }
3932 
3933  if (shard_shm_set_param_as_in_shard (proxy_info_p, param_name, param_value, shard_id, as_number) < 0)
3934  {
3935  return -1;
3936  }
3937  }
3938 
3939  return 0;
3940 }
3941 
3942 static int
3944 {
3945 #if defined(LINUX)
3946  int error = 0;
3947  unsigned int required_fd_num = 0;
3948  T_PROXY_INFO *proxy_info_p = NULL;
3949  T_SHARD_INFO *shard_info_p = NULL;
3950  struct rlimit sys_limit;
3951 
3952  proxy_info_p = shard_shm_find_proxy_info (proxy_p, 0);
3953  if (proxy_info_p == NULL)
3954  {
3955  sprintf (admin_err_msg, "Cannot find proxy info.\n");
3956  return -1;
3957  }
3958 
3959  shard_info_p = shard_shm_find_shard_info (proxy_info_p, 0);
3960  if (shard_info_p == NULL)
3961  {
3962  sprintf (admin_err_msg, "Cannot find shard info.\n");
3963  return -1;
3964  }
3965 
3966  required_fd_num += proxy_info_p->max_context;
3967  required_fd_num += proxy_info_p->max_shard * shard_info_p->max_appl_server;
3968  required_fd_num += PROXY_RESERVED_FD;
3969 
3970  error = getrlimit (RLIMIT_NOFILE, &sys_limit);
3971  if (error < 0)
3972  {
3973  sprintf (admin_err_msg, "Fail to get system limit.\n");
3974  return -1;
3975  }
3976 
3977  if (sys_limit.rlim_cur < required_fd_num)
3978  {
3979  sprintf (admin_err_msg, "%s (current : %d, required : %d)\n",
3980  "Maximum file descriptor number is less than the required value.", (int) sys_limit.rlim_cur,
3981  required_fd_num);
3982  return -1;
3983  }
3984 
3985  if (sys_limit.rlim_max < required_fd_num)
3986  {
3987  sprintf (admin_err_msg, "%s (current : %d, required : %d)\n",
3988  "Maximum file descriptor number is less than the required value.", (int) sys_limit.rlim_max,
3989  required_fd_num);
3990  return -1;
3991  }
3992 #endif /* LINUX */
3993  return 0;
3994 }
3995 
3996 static void
3998 {
3999  char env_str[128];
4000  char upper_broker_name[BROKER_NAME_LEN];
4001  char *p = NULL;
4002 
4003  get_upper_str (upper_broker_name, BROKER_NAME_LEN, br_info_p->name);
4004 
4005  snprintf (env_str, sizeof (env_str), "%s_SHARD_DB_PASSWORD", upper_broker_name);
4006 
4007  p = getenv (env_str);
4008  if (p != NULL)
4009  {
4010  strncpy (br_info_p->shard_db_password, p, sizeof (br_info_p->shard_db_password) - 1);
4011  }
4012 
4013  return;
4014 }
4015 
4016 static void
4017 get_upper_str (char *upper_str, int len, char *value)
4018 {
4019  int i;
4020 
4021  for (i = 0; i < len - 1; i++)
4022  {
4023  upper_str[i] = (char) toupper (value[i]);
4024  }
4025  upper_str[i] = '\0';
4026 
4027  return;
4028 }
int proxy_shm_id
Definition: shard_proxy.c:46
#define SLEEP_MILISEC(sec, msec)
Definition: util_func.h:40
void ut_cd_work_dir(void)
Definition: broker_util.c:335
char trigger_action_flag
int long_transaction_time
static void get_shard_db_password(T_BROKER_INFO *br_info_p)
char access_log_file[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:492
unsigned char address_list[ACL_MAX_IP_COUNT *IP_BYTE_COUNT]
Definition: broker_shm.h:202
char jdbc_cache_only_hint
static int make_sp_value(SP_VALUE *value_p, char *shard_key)
char database_name[SRV_CON_DBNAME_SIZE]
Definition: broker_shm.h:352
char * trim(char *str)
Definition: porting.c:2260
DllImport char * optarg
#define TRUE
Definition: broker_admin.c:49
static int shard_shm_check_max_file_open_limit(T_BROKER_INFO *br_info, T_SHM_PROXY *proxy_p)
T_SHM_PROXY * shm_proxy_p
char shard_key_library_name[SHM_PROXY_NAME_MAX]
Definition: broker_shm.h:538
#define PATH_INFO_ENV_STR
static int shard_shm_set_param_as_in_shard(T_PROXY_INFO *proxy_info_p, const char *param_name, const char *param_value, int shard_id, int as_number)
T_BROKER_INFO br_info[1]
Definition: broker_shm.h:661
int access_control_read_config_file(T_SHM_APPL_SERVER *shm_appl, char *filename, char *admin_err_msg)
Definition: broker_acl.c:112
#define SHM_APPL_SERVER_NAME_MAX
Definition: broker_shm.h:141
double ut_time_string_to_sec(const char *time_str, const char *default_unit)
Definition: broker_util.c:643
int max_prepared_stmt_count
Definition: broker_shm.h:623
char db_name[MAX_DBNAME_LENGTH]
Definition: broker_shm.h:219
T_SHARD_INFO * shard_shm_find_shard_info(T_PROXY_INFO *proxy_info_p, int shard_id)
Definition: shard_shm.c:433
int getopt(int, char *const *, const char *)
int admin_start_cmd(T_BROKER_INFO *br_info, int br_num, int master_shm_id, bool acl_flag, char *acl_file)
int uw_get_error_code(void)
Definition: broker_error.c:83
T_SHARD_CONN shard_conn[MAX_SHARD_CONN]
Definition: broker_shm.h:286
#define SHM_BROKER
Definition: broker_shm.h:64
int argc
Definition: dynamic_load.c:951
INT64 integer
Definition: shard_parser.h:114
T_PROXY_INFO * shard_shm_find_proxy_info(T_SHM_PROXY *proxy_p, int proxy_id)
Definition: shard_shm.c:419
char port_name[SHM_APPL_SERVER_NAME_MAX]
Definition: broker_shm.h:601
int parse_int(int *ret_p, const char *str_p, int base)
Definition: porting.c:2290
unsigned char cas_clt_ip[4]
Definition: broker_shm.h:323
#define MAKE_FILEPATH(dest, src, dest_len)
Definition: broker_util.h:49
#define BROKER_PATH_MAX
Definition: broker_config.h:91
#define SHM_OPEN_ERR_MSG(BUF, ERRCODE, OSERRCODE)
bool ut_is_appl_server_ready(int pid, char *ready_flag)
Definition: broker_util.c:498
time_t last_access_time
Definition: broker_shm.h:317
int uw_get_os_error_code(void)
Definition: broker_error.c:89
int max_num_delayed_hosts_lookup
char broker_name[BROKER_NAME_LEN]
Definition: cas.c:148
int admin_conf_change(int master_shm_id, const char *br_name, const char *conf_name, const char *conf_value, int as_number)
static T_BROKER_INFO * br_info_p
Definition: broker.c:312
int admin_add_cmd(int master_shm_id, const char *broker)
#define SHM_PROXY
Definition: broker_shm.h:65
#define CAS_LOG_RESET_REOPEN
Definition: broker_shm.h:122
int conf_get_value_access_mode(const char *value)
#define MASTER_SHM_KEY_ENV_STR
char slow_log_dir[CONF_LOG_FILE_LEN]
char ** environ
IP_INFO ip_info
Definition: broker_shm.h:213
T_SHARD_KEY_RANGE * shard_metadata_find_shard_range(T_SHM_SHARD_KEY *shm_key_p, const char *key, unsigned int hash_res)
#define NAME_BROKER
int mysql_keepalive_interval
#define CLT_APPL_NAME_ENV_STR
#define BROKER_INFO_NAME_MAX
ACCESS_INFO access_info[ACL_MAX_ITEM_COUNT]
Definition: broker_shm.h:635
#define NAME_CAS_BROKER
T_SHM_SHARD_CONN * shard_metadata_get_conn(T_SHM_PROXY *shm_proxy_p)
static int broker_create_dir(const char *new_dir)
#define SHM_MUTEX_BROKER
Definition: broker_shm.h:68
#define APPL_SERVER_SHM_KEY_STR
#define UTS_STATUS_START
Definition: broker_shm.h:48
char * value
Definition: shard_parser.h:110
#define CAS_LOG_RESET_REMOVE
Definition: broker_shm.h:123
static int check_shard_as_conn(T_SHM_APPL_SERVER *shm_as_p, T_SHARD_INFO *shard_info_p)
void ut_cd_root_dir(void)
Definition: broker_util.c:343
#define DEFAULT_MAX_NUM_DELAYED_HOSTS_LOOKUP
Definition: broker_config.h:85
#define UTS_STATUS_BUSY
Definition: broker_shm.h:45
#define CONTENT_LENGTH_ENV_STR
#define LONG_QUERY_TIME_LIMIT
Definition: broker_shm.h:164
int appl_server_hard_limit
char broker_name[BROKER_NAME_LEN]
Definition: broker_shm.h:588
#define MAKE_VERSION(MAJOR, MINOR)
int access_control_set_shm(T_SHM_APPL_SERVER *shm_as_p, T_BROKER_INFO *br_info_p, T_SHM_BROKER *shm_br, char *admin_err_msg)
Definition: broker_acl.c:53
int max_appl_server
Definition: broker_shm.h:416
static int shard_shm_set_param_as_internal(T_APPL_SERVER_INFO *as_info, const char *param_name, const char *param_value)
int appl_server_hard_limit
Definition: broker_shm.h:612
char db_user[SRV_CON_DBUSER_SIZE]
Definition: broker_shm.h:221
#define UTS_STATUS_IDLE
Definition: broker_shm.h:46
char jdbc_cache_only_hint
Definition: broker_shm.h:570
#define PORT_NUMBER_ENV_STR
int admin_info_cmd(int master_shm_id)
static void as_inactivate(T_APPL_SERVER_INFO *as_info_p, char *broker_name, int shard_flag)
char * get_cubrid_file(T_CUBRID_FILE_ID fid, char *buf, size_t len)
#define ALL_SHARD
#define APPL_SERVER_CAS_ORACLE
Definition: broker_config.h:35
int jdbc_cache_life_time
int min_appl_server
Definition: broker_shm.h:415
#define MAX_BROKER_NUM
Definition: broker_config.h:50
char db_password[SRV_CON_DBPASSWD_SIZE]
Definition: broker_shm.h:222
unsigned short cas_clt_port
Definition: broker_shm.h:324
int ut_kill_as_process(int pid, char *broker_name, int as_index, int shard_flag)
Definition: broker_util.c:260
#define NUM_OF_DIGITS(NUMBER)
#define UTS_STATUS_CON_WAIT
Definition: broker_shm.h:52
static int proxy_activate(T_BROKER_INFO *br_info_p, T_SHM_PROXY *shm_proxy_p, T_SHM_APPL_SERVER *shm_as_p, char **env, int env_num)
#define assert(x)
#define CON_STATUS_LOCK_INIT(AS_INFO)
Definition: broker_shm.h:100
#define MAX_ACCESS_LOG_MAX_SIZE
Definition: broker_config.h:84
#define NAME_PROXY
char log_dir[CONF_LOG_FILE_LEN]
int admin_acl_reload_cmd(int master_shm_id, const char *broker_name)
int mysql_keepalive_interval
Definition: broker_shm.h:616
static bool key_isdigit(const char *value)
SP_VALUE_TYPE type
Definition: shard_parser.h:106
int proxy_id
Definition: shard_proxy.c:45
const char * uw_get_error_message(int error_code, int os_error_code)
Definition: broker_error.c:109
int as_info_index_base
Definition: broker_shm.h:422
#define MAX_QUERY_TIMEOUT_LIMIT
Definition: broker_shm.h:163
#define PROXY_ID_ENV_STR
int num_shard_conn
Definition: broker_shm.h:514
char monitor_server_flag
void uw_shm_detach(void *p)
Definition: broker_shm.c:700
char clt_appl_name[APPL_NAME_LENGTH]
Definition: broker_shm.h:332
T_SHM_SHARD_KEY * shm_key_p
Definition: shard_proxy.c:51
#define SQL_LOG2_MAX
Definition: cas_sql_log2.h:32
#define DELIMITER_ENV_STR
#define SID_ENV_STR
#define LONG_TRANSACTION_TIME_LIMIT
Definition: broker_shm.h:165
#define REQUEST_METHOD_ENV_STR
int uw_shm_destroy(int shm_key)
Definition: broker_shm.c:391
char * envvar_bindir_file(char *path, size_t size, const char *filename)
time_t transaction_start_time
Definition: broker_shm.h:318
#define ALL_AS
int max_prepared_stmt_count
int char_isdigit(int c)
Definition: chartype.c:73
double ut_size_string_to_kbyte(const char *size_str, const char *default_unit)
Definition: broker_util.c:584
#define QUERY_STRING_ENV_STR
#define NULL
Definition: freelistheap.h:34
int appl_server_shm_id
Definition: broker_shm.h:516
#define SHM_PROXY_NAME_MAX
Definition: broker_shm.h:140
static int br_inactivate(T_BROKER_INFO *)
#define BROKER_NAME_LEN
Definition: broker_config.h:87
pid_t pid
Definition: dynamic_load.c:955
#define MIN_MYSQL_KEEPALIVE_INTERVAL
Definition: broker_shm.h:173
char db_conn_info[MAX_CONN_INFO_LENGTH]
Definition: broker_shm.h:279
char auto_add_appl_server
char clt_req_path_info[APPL_NAME_LENGTH]
Definition: broker_shm.h:333
#define FREE_MEM(PTR)
Definition: cas_common.h:58
#define MAX_PROXY_LOG_MAX_SIZE
Definition: broker_config.h:98
char trigger_action_flag
Definition: broker_shm.h:579
T_SHM_SHARD_KEY * shard_metadata_get_key(T_SHM_PROXY *shm_proxy_p)
int admin_reset_cmd(int master_shm_id, const char *broker_name)
uid_t owner_uid
Definition: broker_shm.h:656
int proxy_find_shard_id_by_hint_value(SP_VALUE *value_p, const char *key_column)
#define CUBRID_BASE_DIR
char shard_key_function_name[SHM_PROXY_NAME_MAX]
Definition: broker_shm.h:539
static T_SHM_APPL_SERVER * shm_appl
Definition: broker.c:311
static char ** make_env(char *env_file, int *env_num)
char err_log_dir[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:587
int conf_get_value_table_on_off(const char *value)
#define CON_STATUS_LOCK_DESTROY(AS_INFO)
Definition: broker_shm.h:103
char database_host[CUB_MAXHOSTNAMELEN]
Definition: broker_shm.h:353
#define SHM_MUTEX_ADMIN
Definition: broker_shm.h:69
char preferred_hosts[BROKER_INFO_NAME_MAX]
static T_SHM_BROKER * shm_br
Definition: broker.c:310
char admin_err_msg[ADMIN_ERR_MSG_SIZE]
T_PROXY_INFO * proxy_info_p
Definition: shard_proxy.c:48
int conf_get_value_proxy_log_mode(const char *value)
static void error(const char *msg)
Definition: gencat.c:331
static int shard_shm_set_param_proxy(T_SHM_PROXY *proxy_p, const char *param_name, const char *param_value, int proxy_id)
#define OUT_FILE_NAME_ENV_STR
int appl_server_max_size
static int br_index
Definition: broker.c:315
#define PROXY_RESERVED_FD
Definition: broker_shm.h:160
#define IS_APPL_SERVER_TYPE_CAS(x)
Definition: broker_config.h:39
char dbname[ACL_MAX_DBNAME_LENGTH]
Definition: broker_shm.h:210
#define snprintf_dots_truncate(dest, max_len,...)
Definition: porting.h:323
int max_num_delayed_hosts_lookup
Definition: broker_shm.h:578
time_t last_connect_time
Definition: broker_shm.h:357
char shard_db_password[SRV_CON_DBPASSWD_SIZE]
T_SHARD_KEY shard_key[MAX_SHARD_KEY]
Definition: broker_shm.h:270
bool monitor_server_flag
Definition: broker_shm.h:630
int conf_get_value_keep_con(const char *value)
static int br_activate(T_BROKER_INFO *br_info, int master_shm_id, T_SHM_BROKER *shm_br)
int conf_get_value_connect_order(const char *value)
static int proxy_activate_internal(int proxy_shm_id, T_SHM_APPL_SERVER *shm_as_p, T_SHM_PROXY *shm_proxy_p, int proxy_id, char **env, int env_num)
int num_list
Definition: broker_shm.h:204
char preferred_hosts[SHM_APPL_SERVER_NAME_MAX]
Definition: broker_shm.h:590
static void get_upper_str(char *upper_str, int len, char *value)
#define UW_ER_NO_ERROR
Definition: broker_error.h:31
const char ** argv
Definition: dynamic_load.c:952
#define strlen(s1)
Definition: intl_support.c:43
static int shard_shm_set_param_proxy_internal(T_PROXY_INFO *proxy_info_p, const char *param_name, const char *param_value)
static int shard_shm_set_param_as(T_PROXY_INFO *proxy_info_p, T_SHARD_INFO *shard_info_p, const char *param_name, const char *param_value, int as_number)
#define PROXY_SHM_KEY_STR
void dir_repath(char *path, size_t path_len)
static int check_shard_conn(T_SHM_APPL_SERVER *shm_as_p, T_SHM_PROXY *shm_proxy_p)
static void print_usage(void)
#define MAX_PROXY_NUM
Definition: broker_shm.h:135
void ut_get_proxy_port_name(char *port_name, char *broker_name, int proxy_id, int len)
Definition: broker_util.c:556
char key_column[SHARD_KEY_COLUMN_LEN]
Definition: broker_shm.h:261
char name[BROKER_NAME_LEN]
#define FALSE
Definition: broker_admin.c:50
T_APPL_SERVER_INFO * as_info
Definition: cas.c:153
#define CLOSE_SOCKET(X)
Definition: cas_common.h:85
#define IS_NOT_APPL_SERVER_TYPE_CAS(x)
Definition: broker_config.h:42
int admin_on_cmd(int master_shm_id, const char *broker_name)
char error_log_file[CONF_LOG_FILE_LEN]
char appl_server_name[APPL_SERVER_NAME_MAX_SIZE]
Definition: broker_shm.h:589
char driver_version[SRV_CON_VER_STR_MAX_SIZE]
Definition: broker_shm.h:305
T_SHM_APPL_SERVER * broker_shm_initialize_shm_as(T_BROKER_INFO *br_info_p, T_SHM_PROXY *shm_proxy_p)
Definition: broker_shm.c:471
struct sp_value::@40 string
static int shard_shm_set_param_as_in_proxy(T_SHM_PROXY *proxy_p, const char *param_name, const char *param_value, int proxy_id, int shard_id, int as_number)
int shard_key_modular
Definition: broker_shm.h:537
int admin_del_cas_log(int master_shmid, const char *broker, int asid)
void ut_get_as_port_name(char *port_name, char *broker_name, int as_id, int len)
Definition: broker_util.c:570
T_APPL_SERVER_INFO as_info[APPL_SERVER_NUM_LIMIT]
Definition: broker_shm.h:641
#define ONE_K
Definition: porting.h:62
int num_appl_server
Definition: broker_shm.h:417
char statement_pooling
int admin_stop_cmd(int master_shm_id)
int i
Definition: dynamic_load.c:954
#define ADMIN_ERR_MSG_SIZE
int register_fn_get_shard_key(void)
char port_name[SHM_PROXY_NAME_MAX]
Definition: broker_shm.h:488
#define CONF_LOG_FILE_LEN
Definition: broker_config.h:52
T_SHM_BROKER * broker_shm_initialize_shm_broker(int master_shm_id, T_BROKER_INFO *br_info, int br_num, int acl_flag, char *acl_file)
Definition: broker_shm.c:416
int getsize(int pid)
int appl_server_shm_id
Definition: shard_proxy.c:42
#define SLEEP_SEC(X)
Definition: cas_common.h:109
void set_cubrid_file(T_CUBRID_FILE_ID fid, char *value)
#define APPL_SERVER_NAME_MAX_SIZE
Definition: broker_shm.h:120
int admin_acl_status_cmd(int master_shm_id, const char *broker_name)
bool access_control
Definition: broker_shm.h:660
#define REMOTE_ADDR_ENV_STR
char source_env[CONF_LOG_FILE_LEN]
#define SESSION_REQUEST_ENV_STR
char * get_cubrid_file_ptr(T_CUBRID_FILE_ID fid)
T_SHM_APPL_SERVER * shm_as_p
Definition: shard_proxy.c:43
void * uw_shm_open(int shm_key, int which_shm, T_SHM_MODE shm_mode)
Definition: broker_shm.c:139
#define MAX_SQL_LOG_MAX_SIZE
Definition: broker_config.h:83
char dbuser[ACL_MAX_DBUSER_LENGTH]
Definition: broker_shm.h:211
int conf_get_value_sql_log_mode(const char *value)
static char shard_db_password_env_str[MAX_BROKER_NUM][128]
char slow_log_dir[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:586
static bool full_info_flag
void broker_config_dump(FILE *fp, const T_BROKER_INFO *br_info, int num_broker, int br_shm_id)
#define makestring(x)
T_SHM_SHARD_CONN * shm_conn_p
Definition: shard_proxy.c:52
int ut_kill_broker_process(int pid, char *broker_name)
Definition: broker_util.c:224
#define MEMBER_SIZE(TYPE, MEMBER)
#define AS_ID_ENV_STR
char log_dir[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:585
int admin_drop_cmd(int master_shm_id, const char *broker)
T_SHARD_CONN_INFO shard_conn_info[SHARD_INFO_SIZE_LIMIT]
Definition: broker_shm.h:639
static void rename_error_log_file_name(char *error_log_file, struct tm *ct)
char err_log_dir[CONF_LOG_FILE_LEN]
int ut_kill_proxy_process(int pid, char *broker_name, int proxy_id)
Definition: broker_util.c:242
char access_control_file[SHM_BROKER_PATH_MAX]
Definition: broker_shm.h:659
static void as_activate(T_SHM_BROKER *shm_br, T_BROKER_INFO *br_info, T_SHM_APPL_SERVER *shm_as_p, T_APPL_SERVER_INFO *as_info_p, int as_idex, char **env, int env_num)
time_t last_access_time[ACL_MAX_IP_COUNT]
Definition: broker_shm.h:203
#define IP_BYTE_COUNT
Definition: broker_shm.h:129
const char ** p
Definition: dynamic_load.c:945
int admin_restart_cmd(int master_shm_id, const char *broker, int as_index)
int admin_getid_cmd(int master_shm_id, int argc, const char **argv)
static void proxy_inactivate(T_BROKER_INFO *br_info_p, T_PROXY_INFO *proxy_info_p)
char ip_files[LINE_MAX+1]
Definition: broker_shm.h:212
int uw_sem_destroy(sem_t *sem)
Definition: broker_shm.c:919
#define ALL_PROXY
static void free_env(char **env, int env_num)
char db_name[MAX_DBNAME_LENGTH]
Definition: broker_shm.h:278
void admin_init_env()
#define APPL_SERVER_NUM_LIMIT
Definition: broker_shm.h:137
#define SERVICE_READY_WAIT_COUNT
Definition: broker_util.h:47
T_SHM_PROXY * shard_shm_initialize_shm_proxy(T_BROKER_INFO *br_info_p)
Definition: shard_shm.c:261
int admin_off_cmd(int master_shm_id, const char *broker_name)
int cur_proxy_log_mode
Definition: broker_shm.h:464
#define SHM_APPL_SERVER
Definition: broker_shm.h:63