CUBRID Engine  latest
shard_shm.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  * shard_metadata.c -
22  */
23 
24 #ident "$Id$"
25 
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <time.h>
30 #include <sys/types.h>
31 #include <sys/stat.h>
32 #include <assert.h>
33 
34 #include "dbi.h"
35 
36 #include "cas_common.h"
37 #include "broker_env_def.h"
38 #include "broker_filename.h"
39 #include "broker_shm.h"
40 #include "broker_admin_pub.h"
41 #include "shard_metadata.h"
42 #include "shard_shm.h"
43 
44 #define BLANK_3 " "
45 #define BLANK_6 " "
46 #define BLANK_9 " "
47 
48 #define LINE_70 "========================================" \
49  "========================================"
50 
52 
53 static void shard_shm_init_key_stat (T_SHM_SHARD_KEY_STAT * key_stat_p, T_SHARD_KEY * shard_key);
54 static void shard_shm_init_shard_stat (T_SHM_SHARD_CONN_STAT * shard_stat_p, T_SHARD_CONN * shard_conn);
55 #if defined(LINUX)
56 static int shard_shm_get_max_context (int max_client);
57 #else /* LINUX */
58 static int shard_shm_get_max_context (int max_num_appl_server);
59 #endif /* !LINUX */
60 
61 #if defined(UNDEFINED)
62 void
63 shard_shm_set_shm_as (T_SHM_APPL_SERVER * shm_as_p, T_BROKER_INFO * br_info_p)
64 {
65  char **env = NULL;
66  int env_num;
67 
68  assert (shm_as_p);
69  assert (br_info_p);
70 
71  shm_as_p->cci_default_autocommit = br_info_p->cci_default_autocommit;
72  shm_as_p->suspend_mode = SUSPEND_NONE;
73  shm_as_p->job_queue_size = br_info_p->job_queue_size;
74  shm_as_p->job_queue[0].id = 0; /* initialize max heap */
75  shm_as_p->max_prepared_stmt_count = br_info_p->max_prepared_stmt_count;
76  strcpy (shm_as_p->log_dir, br_info_p->log_dir);
77  strcpy (shm_as_p->slow_log_dir, br_info_p->slow_log_dir);
78  strcpy (shm_as_p->err_log_dir, br_info_p->err_log_dir);
79  strcpy (shm_as_p->broker_name, br_info_p->name);
80 
81 #if defined(WINDOWS)
82  shm_as_p->use_pdh_flag = FALSE;
83  br_info_p->pdh_workset = 0;
84  br_info_p->pdh_pct_cpu = 0;
85 #endif /* WINDOWS */
86 
87  env = make_env (br_info_p->source_env, &env_num);
88  strncpy (shm_as_p->appl_server_name, get_appl_server_name (br_info_p->appl_server, env, env_num),
90  shm_as_p->appl_server_name[APPL_SERVER_NAME_MAX_SIZE - 1] = '\0';
91 
92  shm_as_p->num_appl_server = br_info_p->appl_server_num;
93  shm_as_p->sql_log_mode = br_info_p->sql_log_mode;
94  shm_as_p->sql_log_max_size = br_info_p->sql_log_max_size;
95  shm_as_p->long_query_time = br_info_p->long_query_time;
96  shm_as_p->long_transaction_time = br_info_p->long_transaction_time;
97  shm_as_p->appl_server_max_size = br_info_p->appl_server_max_size;
98  shm_as_p->appl_server_hard_limit = br_info_p->appl_server_hard_limit;
99  shm_as_p->session_timeout = br_info_p->session_timeout;
100  shm_as_p->sql_log2 = br_info_p->sql_log2;
101  shm_as_p->slow_log_mode = br_info_p->slow_log_mode;
102 #if defined(WINDOWS)
103  shm_as_p->as_port = br_info_p->appl_server_port;
104 #endif /* WINDOWS */
105  shm_as_p->query_timeout = br_info_p->query_timeout;
106  shm_as_p->max_string_length = br_info_p->max_string_length;
107  shm_as_p->stripped_column_name = br_info_p->stripped_column_name;
108  shm_as_p->keep_connection = br_info_p->keep_connection;
109  shm_as_p->cache_user_info = br_info_p->cache_user_info;
110  shm_as_p->statement_pooling = br_info_p->statement_pooling;
111  shm_as_p->access_mode = br_info_p->access_mode;
112  shm_as_p->cci_pconnect = br_info_p->cci_pconnect;
113  shm_as_p->access_log = br_info_p->access_log;
114 
115  shm_as_p->jdbc_cache = br_info_p->jdbc_cache;
116  shm_as_p->jdbc_cache_only_hint = br_info_p->jdbc_cache_only_hint;
117  shm_as_p->jdbc_cache_life_time = br_info_p->jdbc_cache_life_time;
118 
119  strcpy (shm_as_p->preferred_hosts, br_info_p->preferred_hosts);
120  strncpy (shm_as_p->source_env, br_info_p->source_env, sizeof (shm_as_p->source_env) - 1);
121  strncpy (shm_as_p->error_log_file, br_info_p->error_log_file, sizeof (shm_as_p->error_log_file) - 1);
122  strncpy (shm_as_p->proxy_log_dir, br_info_p->proxy_log_dir, sizeof (shm_as_p->proxy_log_dir) - 1);
123 
124  shm_as_p->proxy_log_max_size = br_info_p->proxy_log_max_size;
125 
126  free_env (env, env_num);
127  return;
128 }
129 
130 void
131 shard_shm_set_as_info (T_APPL_SERVER_INFO * as_info_p, T_BROKER_INFO * br_info_p)
132 {
133  /* SHARD TODO : will delete, duplicated code shard_as_activate() */
134 #if 0
135  char port_name[BROKER_PATH_MAX], dirname[BROKER_PATH_MAX];
136 #if !defined(WINDOWS)
137  char process_name[128];
138 #endif /* !WINDOWS */
139 
140  get_cubrid_file (FID_SOCK_DIR, dirname);
141  snprintf (port_name, sizeof (port_name) - 1, "%s/%s.%d", dirname, br_info_p->name, as_index);
142 
143 #if !defined(WINDOWS)
144  unlink (port_name);
145 #endif /* !WINDOWS */
146 #endif
147 
148  /* broker/broker_admin_pub.c" 2750 lines */
149 
150  /* mutex variable initialize */
151  as_info_p->mutex_flag[SHM_MUTEX_BROKER] = FALSE;
152  as_info_p->mutex_flag[SHM_MUTEX_ADMIN] = FALSE;
153  as_info_p->mutex_turn = SHM_MUTEX_BROKER;
154  CON_STATUS_LOCK_INIT (as_info_p);
155 
156  /* SHARD TODO : will delete, duplicated code shard_as_activate() */
157 #if 0
158  as_info_p->num_request = 0;
159  as_info_p->session_id = 0;
160  as_info_p->uts_status = UTS_STATUS_START;
161  as_info_p->reset_flag = FALSE;
162  as_info_p->clt_appl_name[0] = '\0';
163  as_info_p->clt_req_path_info[0] = '\0';
164  as_info_p->clt_ip_addr[0] = '\0';
165 #if 0
166  as_info_p->cur_sql_log_mode = shm_appl->sql_log_mode;
167 #else
168  as_info_p->cur_sql_log_mode = 0;
169 #endif
170 
171 #if defined(WINDOWS)
172  as_info_p->pdh_pid = 0;
173  as_info_p->pdh_workset = 0;
174  as_info_p->pdh_pct_cpu = 0;
175 #endif /* WINDOWS */
176 
177 
178  as_info_p->service_ready_flag = FALSE;
179 #endif
180 
181  /* FORK AND EXECUTE */
182 
183 
184  /* SHARD TODO : will delete, duplicated code shard_as_activate() */
185 #if 0
186  SERVICE_READY_WAIT (as_info_p->service_ready_flag);
187 
188  as_info_p->pid = pid;
189  as_info_p->last_access_time = time (NULL);
190  as_info_p->psize_time = time (NULL);
191  as_info_p->psize = getsize (as_info_p->pid);
192  as_info_p->uts_status = UTS_STATUS_IDLE;
193  as_info_p->service_flag = SERVICE_OFF;
194 #endif
195 
196  as_info_p->database_name[0] = '\0';
197  as_info_p->database_host[0] = '\0';
198 
199  return;
200 }
201 
203 shard_shm_as_initialize (T_BROKER_INFO * br_info_p, T_SHM_PROXY * shm_proxy_p)
204 {
205  int shm_size = 0;
206  int i;
207  T_SHM_APPL_SERVER *shm_as_p = NULL;
208  T_APPL_SERVER_INFO *as_info_p = NULL;
209 
210  shm_size = sizeof (T_SHM_APPL_SERVER);
211  shm_as_p = (T_SHM_APPL_SERVER *) uw_shm_create (br_info_p->appl_server_shm_id, shm_size, SHM_APPL_SERVER);
212 
213  if (shm_as_p == NULL)
214  {
215  return NULL;
216  }
217 
218  shard_shm_set_shm_as (shm_as_p, br_info_p);
219 
220  shard_shm_set_shard_conn_info (shm_as_p, shm_proxy_p);
221 
222  for (i = 0; i < br_info_p->appl_server_max_num; i++)
223  {
224  as_info_p = &(shm_as_p->as_info[i]);
225  memset (as_info_p, 0, sizeof (*as_info_p));
226  shard_shm_set_as_info (as_info_p, br_info_p);
227  }
228 
229  return shm_as_p;
230 }
231 #endif /* UNDEFINED */
232 
233 static void
235 {
236  assert (shm_proxy_p);
237  assert (br_info_p);
238 
239  shm_proxy_p->num_proxy = br_info_p->num_proxy;
240 
241  shm_proxy_p->max_client = (br_info_p->max_client / br_info_p->num_proxy);
242  if (shm_proxy_p->max_client == 0)
243  {
244  shm_proxy_p->max_client = 1;
245  }
246 #if defined(LINUX)
247  shm_proxy_p->max_context = shard_shm_get_max_context (br_info_p->max_client / br_info_p->num_proxy);
248 #else /* LINUX */
249  shm_proxy_p->max_context = shard_shm_get_max_context (br_info_p->appl_server_max_num / br_info_p->num_proxy);
250 #endif /* !LINUX */
251 
252  /* SHARD SHARD_KEY_ID */
253  shm_proxy_p->shard_key_modular = br_info_p->shard_key_modular;
256 
257  return;
258 }
259 
260 T_SHM_PROXY *
262 {
263  int res;
264  int shm_proxy_size;
265 
266  int max_context;
267  int num_shard;
268  int num_key;
269  int num_proxy;
270 
271  int appl_server_min_num, appl_server_max_num;
272 
273  int i, j;
274 
277  T_SHM_SHARD_KEY_STAT *key_stat_p;
278  T_SHM_SHARD_CONN_STAT *shard_stat_p;
279  T_SHARD_INFO *shard_info_p;
280  T_CLIENT_INFO *client_info_p;
281 
284  T_SHARD_CONN *conn_p;
285 
286 #if defined(LINUX)
287  max_context = shard_shm_get_max_context (br_info_p->max_client / br_info_p->num_proxy);
288 #else /* LINUX */
289  max_context = shard_shm_get_max_context (br_info_p->appl_server_max_num / br_info_p->num_proxy);
290 #endif /* !LINUX */
291 
292  shm_proxy_size = sizeof (T_SHM_PROXY);
293 
294  shm_proxy_p = (T_SHM_PROXY *) uw_shm_create (br_info_p->proxy_shm_id, shm_proxy_size, SHM_PROXY);
295  if (shm_proxy_p == NULL)
296  {
297  return NULL;
298  }
299 
300  shard_shm_set_shm_proxy (shm_proxy_p, br_info_p);
301 
302  num_proxy = shm_proxy_p->num_proxy;
303 
304  res = shard_metadata_initialize (br_info_p, shm_proxy_p);
305  if (res < 0)
306  {
307  goto init_shm_proxy_error;
308  }
309 
310  shm_conn_p = shard_metadata_get_conn (shm_proxy_p);
311 
312  num_shard = shm_conn_p->num_shard_conn;
313  if (num_shard <= 0)
314  {
315  goto init_shm_proxy_error;
316  }
317 
318  shm_key_p = shard_metadata_get_key (shm_proxy_p);
319 
320  num_key = shm_key_p->num_shard_key;
321  if (num_key <= 0)
322  {
323  goto init_shm_proxy_error;
324  }
325 
326  appl_server_min_num = (br_info_p->appl_server_min_num / num_proxy / num_shard);
327  if (appl_server_min_num < 1)
328  {
329  fprintf (stderr, "shorted MIN_NUM_APPL_SERVER. " "it need %d at least\n", num_proxy * num_shard);
330  goto init_shm_proxy_error;
331  }
332 
333  appl_server_max_num = (br_info_p->appl_server_max_num / num_proxy / num_shard);
334  if (appl_server_max_num < 1)
335  {
336  fprintf (stderr, "shorted MAX_NUM_APPL_SERVER. " "it need %d at least\n", num_proxy * num_shard);
337  goto init_shm_proxy_error;
338  }
339 
340  br_info_p->appl_server_min_num = appl_server_min_num * num_proxy * num_shard;
341  br_info_p->appl_server_max_num = appl_server_max_num * num_proxy * num_shard;
342  br_info_p->appl_server_num = br_info_p->appl_server_min_num;
343 
344 
345  for (i = 0; i < num_proxy; i++)
346  {
347  /*
348  * SHARD TODO : what to do when min_num_proxy is different
349  * from max_num_proxy ?
350  */
351  proxy_info_p = shard_shm_find_proxy_info (shm_proxy_p, i);
352  memset (proxy_info_p, 0, sizeof (T_PROXY_INFO));
353 
354  proxy_info_p->proxy_id = i;
355  proxy_info_p->pid = -1;
356  proxy_info_p->service_flag = SERVICE_ON;
357  proxy_info_p->status = PROXY_STATUS_START;
358  proxy_info_p->max_shard = num_shard;
359  proxy_info_p->max_client = shm_proxy_p->max_client;
360  proxy_info_p->cur_client = 0;
361  proxy_info_p->max_context = shm_proxy_p->max_context;
362  proxy_info_p->max_prepared_stmt_count = br_info_p->proxy_max_prepared_stmt_count;
363  proxy_info_p->ignore_shard_hint = br_info_p->ignore_shard_hint;
364  proxy_info_p->wait_timeout = br_info_p->proxy_timeout;
365  proxy_info_p->proxy_log_reset = 0;
366  proxy_info_p->proxy_access_log_reset = 0;
367 
368  proxy_info_p->appl_server = br_info_p->appl_server;
369 
370  proxy_info_p->num_shard_key = num_key;
371  proxy_info_p->num_shard_conn = num_shard;
372 
373  proxy_info_p->appl_server_shm_id = br_info_p->appl_server_shm_id;
374 
375  for (j = 0; j < num_key; j++)
376  {
377  key_stat_p = &proxy_info_p->key_stat[j];
378  shard_shm_init_key_stat (key_stat_p, &(shm_proxy_p->shm_shard_key.shard_key[j]));
379  }
380 
381  for (j = 0; j < num_shard; j++)
382  {
383  shard_stat_p = &proxy_info_p->shard_stat[j];
384  shard_shm_init_shard_stat (shard_stat_p, &(shm_proxy_p->shm_shard_conn.shard_conn[j]));
385  }
386 
387  for (j = 0; j < max_context; j++)
388  {
389  client_info_p = &proxy_info_p->client_info[j];
390  shard_shm_init_client_info (client_info_p);
391  }
392 
393  for (j = 0; j < num_shard; j++)
394  {
395  shard_info_p = &proxy_info_p->shard_info[j];
396  conn_p = &(shm_conn_p->shard_conn[j]);
397 
398  shard_info_p->shard_id = conn_p->shard_id;
399 
400  shard_info_p->min_appl_server = appl_server_min_num;
401  shard_info_p->max_appl_server = appl_server_max_num;
402  shard_info_p->num_appl_server = shard_info_p->min_appl_server;
403 
404  shard_info_p->as_info_index_base = ((i * num_shard + j) * appl_server_max_num);
405  }
406  }
407 
408  /* SHARD TODO : will delete */
409 
410  return shm_proxy_p;
411 
412 init_shm_proxy_error:
413  uw_shm_destroy (br_info_p->proxy_shm_id);
414 
415  return NULL;
416 }
417 
418 T_PROXY_INFO *
420 {
422 
423  assert (proxy_p);
424  if (proxy_id >= 0 && proxy_id < proxy_p->num_proxy)
425  {
426  proxy_info_p = &proxy_p->proxy_info[proxy_id];
427  }
428 
429  return proxy_info_p;
430 }
431 
432 T_SHARD_INFO *
434 {
435  T_SHARD_INFO *shard_info_p = NULL;
436 
437  assert (proxy_info_p);
438 
439  if (shard_id >= 0 && shard_id < proxy_info_p->num_shard_conn)
440  {
441  shard_info_p = &proxy_info_p->shard_info[shard_id];
442  }
443 
444  return shard_info_p;
445 }
446 
449 {
450  T_CLIENT_INFO *client_info_p = NULL;
451 
452  assert (proxy_info_p);
453 
454  if (idx >= 0 && idx < CLIENT_INFO_SIZE_LIMIT)
455  {
456  client_info_p = &proxy_info_p->client_info[idx];
457  }
458 
459  return (client_info_p);
460 }
461 
464 {
465  T_SHM_SHARD_CONN_STAT *shard_stat_p = NULL;
466 
467  assert (proxy_info_p);
468 
469  if (idx >= 0 && idx < proxy_info_p->num_shard_conn)
470  {
471  shard_stat_p = &proxy_info_p->shard_stat[idx];
472  }
473 
474  return (shard_stat_p);
475 }
476 
479 {
480  T_SHM_SHARD_KEY_STAT *key_stat_p = NULL;
481 
482  assert (proxy_info_p);
483 
484  if (idx >= 0 && idx < proxy_info_p->num_shard_key)
485  {
486  key_stat_p = &proxy_info_p->key_stat[idx];
487  }
488 
489  return (key_stat_p);
490 }
491 
492 static void
494 {
495  struct tm *at_tm_p = NULL;
496  struct tm *ct_tm_p = NULL;
497  char last_access_time[128];
498  char last_connect_time[128];
499 
500  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "NUM_REQUEST", as_info_p->num_request);
501  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "PID", as_info_p->pid);
502  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "SERVICE_FLAG", as_info_p->service_flag);
503  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "RESET_FLAG", as_info_p->reset_flag);
504  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "UTS_STATUS", as_info_p->uts_status);
505  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "CAS_CLIENT_TYPE", as_info_p->cas_client_type);
506  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "SERVICE_READY_FLAG", as_info_p->service_ready_flag);
507  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "CON_STATUS", as_info_p->con_status);
508  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "CUR_KEEP_CON", as_info_p->cur_keep_con);
509  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "CUR_SQL_LOG_MODE", as_info_p->cur_sql_log_mode);
510  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "CUR_STATEMENT_POOLING", as_info_p->cur_statement_pooling);
511  if (as_info_p->last_access_time)
512  {
513  at_tm_p = localtime (&as_info_p->last_access_time);
514  if (at_tm_p == NULL)
515  {
516  return;
517  }
518  sprintf (last_access_time, "%d/%02d/%02d %02d:%02d:%02d", at_tm_p->tm_year + 1900, at_tm_p->tm_mon + 1,
519  at_tm_p->tm_mday, at_tm_p->tm_hour, at_tm_p->tm_min, at_tm_p->tm_sec);
520  fprintf (fp, BLANK_9 "%-30s = %-30s \n", "LAST_ACCESS_TIME", last_access_time);
521  }
522  fprintf (fp, BLANK_9 "%-30s = %-30lld \n", "NUM_REQUESTS_RECEIVED", (long long int) as_info_p->num_requests_received);
523  fprintf (fp, BLANK_9 "%-30s = %-30lld \n", "NUM_TRANSACTIONS_PROCESSED",
524  (long long int) as_info_p->num_transactions_processed);
525  fprintf (fp, BLANK_9 "%-30s = %-30lld \n", "NUM_QUERIES_PROCESSED", (long long int) as_info_p->num_queries_processed);
526  fprintf (fp, BLANK_9 "%-30s = %-30lld \n", "NUM_LONG_QUERIES", (long long int) as_info_p->num_long_queries);
527  fprintf (fp, BLANK_9 "%-30s = %-30lld \n", "NUM_LONG_TRANSACTIONS", (long long int) as_info_p->num_long_transactions);
528  fprintf (fp, BLANK_9 "%-30s = %-30lld \n", "NUM_ERROR_QUERIES", (long long int) as_info_p->num_error_queries);
529  fprintf (fp, BLANK_9 "%-30s = %-30d \n", "AUTO_COMMIT_MODE", as_info_p->auto_commit_mode);
530  fprintf (fp, BLANK_9 "%-30s = %-30s \n", "DATABASE_NAME", as_info_p->database_name);
531  fprintf (fp, BLANK_9 "%-30s = %-30s \n", "DATABASE_HOST", as_info_p->database_host);
532  fprintf (fp, BLANK_9 "%-30s = %-30s \n", "DATABASE_USER", as_info_p->database_user);
533  if (as_info_p->last_connect_time)
534  {
535  ct_tm_p = localtime (&as_info_p->last_connect_time);
536  if (ct_tm_p == NULL)
537  {
538  return;
539  }
540  sprintf (last_connect_time, "%d/%02d/%02d %02d:%02d:%02d", ct_tm_p->tm_year + 1900, ct_tm_p->tm_mon + 1,
541  ct_tm_p->tm_mday, ct_tm_p->tm_hour, ct_tm_p->tm_min, ct_tm_p->tm_sec);
542  fprintf (fp, BLANK_9 "%-30s = %-30s \n", "LAST_CONNECT_TIME", last_connect_time);
543  }
544 }
545 
546 static void
547 shard_shm_dump_shard (FILE * fp, T_SHARD_INFO * shard_info_p, T_SHM_APPL_SERVER * shm_as_p)
548 {
549  int i = 0;
550 
551  assert (shard_info_p);
552  assert (shm_as_p);
553 
554  fprintf (fp, BLANK_6 "%-30s = %-30d \n", "SHARD_ID", shard_info_p->shard_id);
555  fprintf (fp, BLANK_6 "%-30s = %-30d \n", "MIN_APPL_SERVER", shard_info_p->min_appl_server);
556  fprintf (fp, BLANK_6 "%-30s = %-30d \n", "MAX_APPL_SERVER", shard_info_p->max_appl_server);
557  fprintf (fp, BLANK_6 "%-30s = %-30d \n", "NUM_APPL_SERVER", shard_info_p->num_appl_server);
558  fprintf (fp, BLANK_6 "%-30s = %-30llu \n", "WAITER_COUNT", (long long unsigned int) shard_info_p->waiter_count);
559 
560  for (i = 0; i < shard_info_p->max_appl_server; i++)
561  {
562  fprintf (fp, "\n");
563  fprintf (fp, BLANK_9 "<CAS %d>\n", i);
564  fprintf (fp, BLANK_9 "%s\n", LINE_70);
565  shard_shm_dump_shard_appl_server (fp, &(shm_as_p->as_info[i + shard_info_p->as_info_index_base]));
566  }
567 
568  return;
569 }
570 
571 static void
573 {
574  int shard_index;
575  T_SHARD_INFO *shard_info_p;
577 
578  assert (proxy_info_p);
579 
581 
582  fprintf (fp, BLANK_3 "%-30s = %-30d \n", "PROXY_ID", proxy_info_p->proxy_id);
583  fprintf (fp, BLANK_3 "%-30s = %-30d \n", "PID", proxy_info_p->pid);
584  fprintf (fp, BLANK_3 "%-30s = %-30d \n", "STATUS", proxy_info_p->status);
585 
586  fprintf (fp, BLANK_3 "%-30s = %-30s \n", "PORT_NAME", proxy_info_p->port_name);
587  fprintf (fp, BLANK_3 "%-30s = %-30d \n", "MAX_SHARD", proxy_info_p->max_shard);
588  fprintf (fp, BLANK_3 "%-30s = %-30s \n", "ACCESS_LOG_FILE", proxy_info_p->access_log_file);
589 
590  for (shard_index = 0; shard_index < proxy_info_p->num_shard_conn; shard_index++)
591  {
592  shard_info_p = shard_shm_find_shard_info (proxy_info_p, shard_index);
593 
594  fprintf (fp, "\n");
595  fprintf (fp, BLANK_6 "<SHARD %d>\n", shard_index);
596  fprintf (fp, BLANK_6 "%s\n", LINE_70);
597  shard_shm_dump_shard (fp, shard_info_p, shm_as_p);
598  }
599 
600  if (shm_as_p)
601  {
602  uw_shm_detach (shm_as_p);
603  }
604 
605  return;
606 }
607 
608 static void
609 shard_shm_dump_proxy (FILE * fp, T_SHM_PROXY * shm_proxy_p)
610 {
611  int proxy_index;
613 
614  assert (fp);
615  assert (shm_proxy_p);
616 
617  fprintf (fp, "\n");
618  fprintf (fp, "<PROXY COMMON>\n");
619  fprintf (fp, "%-30s = %-30d \n", "NUM_PROXY", shm_proxy_p->num_proxy);
620  fprintf (fp, "%-30s = %-30d \n", "MAX_CLIENT", shm_proxy_p->max_client);
621  fprintf (fp, "%-30s = %-30d \n", "MAX_CONTEXT", shm_proxy_p->max_context);
622 
623  fprintf (fp, "%-30s = %-30d \n", "SHARD_KEY_MODULE", shm_proxy_p->shard_key_modular);
624  fprintf (fp, "%-30s = %-30s \n", "SHARD_KEY_LIBRARY_NAME", shm_proxy_p->shard_key_library_name);
625  fprintf (fp, "%-30s = %-30s \n", "SHARD_KEY_FUNCTION_NAME", shm_proxy_p->shard_key_function_name);
626 
627  for (proxy_index = 0; proxy_index < shm_proxy_p->num_proxy; proxy_index++)
628  {
629  proxy_info_p = shard_shm_find_proxy_info (shm_proxy_p, proxy_index);
630 
631  fprintf (fp, "\n");
632  fprintf (fp, BLANK_3 "<PROXY %d>\n", proxy_index);
633  fprintf (fp, BLANK_3 "%s\n", LINE_70);
634  shard_shm_dump_proxy_info (fp, proxy_info_p);
635  }
636 
637  return;
638 }
639 
640 void
642 {
643  assert (fp);
644  assert (shm_proxy_p);
645 
646  shard_shm_dump_proxy (fp, shm_proxy_p);
647  return;
648 }
649 
650 void
651 shard_shm_dump_appl_server (FILE * fp, int shmid)
652 {
653  T_SHM_PROXY *shm_proxy_p = NULL;
654 
655  shm_proxy_p = (T_SHM_PROXY *) uw_shm_open (shmid, SHM_PROXY, SHM_MODE_MONITOR);
656 
657  if (shm_proxy_p == NULL)
658  {
659  SHARD_ERR ("failed to uw_shm_open(shmid:%x). \n", shmid);
660  return;
661  }
662 
663  shard_shm_dump_appl_server_internal (fp, shm_proxy_p);
664 
665  uw_shm_detach (shm_proxy_p);
666 
667  return;
668 }
669 
671 shard_shm_get_as_info (T_PROXY_INFO * proxy_info_p, T_SHM_APPL_SERVER * shm_as_p, int shard_id, int as_id)
672 {
673  T_SHARD_INFO *shard_info_p = NULL;
674  T_APPL_SERVER_INFO *as_info_p = NULL;
675 
676  assert (as_id >= 0);
677 
678  shard_info_p = shard_shm_find_shard_info (proxy_info_p, shard_id);
679 
680  if (shard_info_p != NULL)
681  {
682  as_info_p = &shm_as_p->as_info[shard_info_p->as_info_index_base + as_id];
683  }
684 
685  return as_info_p;
686 }
687 
688 bool
690  unsigned int ip_addr, char *driver_info, char *driver_version)
691 {
692  T_APPL_SERVER_INFO *as_info_p = NULL;
693 
694  as_info_p = shard_shm_get_as_info (proxy_info_p, shm_as_p, shard_id, as_id);
695  if (as_info_p == NULL)
696  {
697  return false;
698  }
699 
700  memcpy (&as_info_p->cas_clt_ip[0], &ip_addr, sizeof (as_info_p->cas_clt_ip));
701  if (driver_info)
702  {
703  as_info_p->clt_version = CAS_MAKE_PROTO_VER (driver_info);
704  memcpy (as_info_p->driver_info, driver_info, SRV_CON_CLIENT_INFO_SIZE);
705  }
706  else
707  {
708  as_info_p->clt_version = 0;
709  memset (as_info_p->driver_info, 0, SRV_CON_CLIENT_INFO_SIZE);
710  }
711  if (driver_version)
712  {
713  memcpy (as_info_p->driver_version, driver_version, SRV_CON_VER_STR_MAX_SIZE);
714  }
715  else
716  {
717  as_info_p->driver_version[0] = '\0';
718  }
719 
720  return true;
721 }
722 
723 bool
725  int as_id, T_CLIENT_INFO * client_info_p)
726 {
727  T_APPL_SERVER_INFO *as_info_p = NULL;
728 
729  as_info_p = shard_shm_get_as_info (proxy_info_p, shm_as_p, shard_id, as_id);
730  if (as_info_p == NULL)
731  {
732  return false;
733  }
734 
735  memcpy (&as_info_p->cas_clt_ip[0], &client_info_p->client_ip, sizeof (as_info_p->cas_clt_ip));
736  if (client_info_p->driver_info)
737  {
738  as_info_p->clt_version = CAS_MAKE_PROTO_VER (client_info_p->driver_info);
739  memcpy (as_info_p->driver_info, client_info_p->driver_info, SRV_CON_CLIENT_INFO_SIZE);
740  }
741  else
742  {
743  as_info_p->clt_version = 0;
744  memset (as_info_p->driver_info, 0, SRV_CON_CLIENT_INFO_SIZE);
745  }
746  memcpy (as_info_p->driver_version, client_info_p->driver_version, SRV_CON_VER_STR_MAX_SIZE);
747 
748  as_info_p->isolation_level = client_info_p->isolation_level;
749  as_info_p->lock_timeout = client_info_p->lock_timeout;
750 
751  assert (as_info_p->clt_version != 0);
752  return true;
753 }
754 
755 void
757 {
758  assert (client_info_p);
759 
760  client_info_p->client_id = -1;
761  client_info_p->client_ip = 0;
762  memset (client_info_p->driver_info, 0, SRV_CON_CLIENT_INFO_SIZE);
763  client_info_p->connect_time = 0;
764 
765  client_info_p->func_code = 0;
766  client_info_p->req_time = 0;
767  client_info_p->res_time = 0;
768  client_info_p->isolation_level = CAS_USE_DEFAULT_DB_PARAM;
769  client_info_p->lock_timeout = CAS_USE_DEFAULT_DB_PARAM;
770 }
771 
772 void
774 {
775  assert (client_info_p);
776 
777  client_info_p->func_code = 0;
778  client_info_p->req_time = 0;
779  client_info_p->res_time = 0;
780 }
781 
782 void
783 shard_shm_set_client_info_request (T_CLIENT_INFO * client_info_p, int func_code)
784 {
785  assert (client_info_p);
786 
787  client_info_p->func_code = func_code;
788  client_info_p->req_time = time (NULL);
789  client_info_p->res_time = 0;
790 }
791 
792 void
794 {
795  assert (client_info_p);
796 
797  client_info_p->res_time = time (NULL);
798 }
799 
800 static void
802 {
803  int i;
804  assert (key_stat_p);
805  assert (shard_key);
806 
807  key_stat_p->num_key_range = shard_key->num_key_range;
808 
809  for (i = 0; i < shard_key->num_key_range; i++)
810  {
811  key_stat_p->stat[i].min = shard_key->range[i].min;
812  key_stat_p->stat[i].max = shard_key->range[i].max;
813  key_stat_p->stat[i].shard_id = shard_key->range[i].shard_id;
814 
815  key_stat_p->stat[i].num_range_queries_requested = 0;
816  }
817 }
818 
819 static void
821 {
822  assert (shard_stat_p);
823  assert (shard_conn);
824 
825  shard_stat_p->shard_id = shard_conn->shard_id;
826 
827  shard_stat_p->num_hint_key_queries_requested = 0;
828  shard_stat_p->num_hint_id_queries_requested = 0;
829  shard_stat_p->num_no_hint_queries_requested = 0;
830 }
831 
832 #if defined(LINUX)
833 static int
834 shard_shm_get_max_context (int max_client)
835 {
836  if (max_client <= 0)
837  {
838  max_client = 1;
839  }
840 
841  return (max_client + PROXY_RESERVED_FD);
842 }
843 #else /* LINUX */
844 static int
845 shard_shm_get_max_context (int max_num_appl_server)
846 {
847  int max_context;
848 
849  if (max_num_appl_server <= 0)
850  {
851  max_num_appl_server = 1;
852  }
853 
854  /*
855  * In case, max_num_appl_server < max_num_shard,
856  * shard's max_num_appl_server might be tuned.
857  * so, we need to reserve enough RESERVED_FD.
858  */
859  max_context = (MAX_FD - PROXY_RESERVED_FD - max_num_appl_server /* proxy/cas connection */ );
860 
861  return max_context;
862 }
863 #endif /* !LINUX */
int long_transaction_time
char shard_key_library_name[BROKER_INFO_NAME_MAX]
T_SHM_SHARD_KEY_STAT key_stat[SHARD_KEY_STAT_SIZE_LIMIT]
Definition: broker_shm.h:517
INT64 num_long_transactions
Definition: broker_shm.h:347
char access_log_file[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:492
char jdbc_cache_only_hint
char database_name[SRV_CON_DBNAME_SIZE]
Definition: broker_shm.h:352
char driver_info[SRV_CON_CLIENT_INFO_SIZE]
Definition: broker_shm.h:391
static void shard_shm_dump_proxy(FILE *fp, T_SHM_PROXY *shm_proxy_p)
Definition: shard_shm.c:609
static void shard_shm_set_shm_proxy(T_SHM_PROXY *shm_proxy_p, T_BROKER_INFO *br_info_p)
Definition: shard_shm.c:234
char * dirname(const char *path)
Definition: porting.c:1066
static void shard_shm_init_key_stat(T_SHM_SHARD_KEY_STAT *key_stat_p, T_SHARD_KEY *shard_key)
Definition: shard_shm.c:801
char shard_key_library_name[SHM_PROXY_NAME_MAX]
Definition: broker_shm.h:538
int num_shard_key
Definition: broker_shm.h:513
T_MAX_HEAP_NODE job_queue[JOB_QUEUE_MAX_SIZE+1]
Definition: broker_shm.h:637
#define SRV_CON_CLIENT_INFO_SIZE
Definition: cas_protocol.h:34
char shard_key_function_name[BROKER_INFO_NAME_MAX]
int max_prepared_stmt_count
Definition: broker_shm.h:623
char proxy_log_dir[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:600
T_PROXY_INFO proxy_info[MAX_PROXY_NUM]
Definition: broker_shm.h:545
T_SHARD_INFO * shard_shm_find_shard_info(T_PROXY_INFO *proxy_info_p, int shard_id)
Definition: shard_shm.c:433
INT64 num_no_hint_queries_requested
Definition: broker_shm.h:432
char ignore_shard_hint
Definition: broker_shm.h:483
T_SHARD_CONN shard_conn[MAX_SHARD_CONN]
Definition: broker_shm.h:286
#define BLANK_9
Definition: shard_shm.c:46
char error_log_file[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:599
T_PROXY_INFO * shard_shm_find_proxy_info(T_SHM_PROXY *proxy_p, int proxy_id)
Definition: shard_shm.c:419
unsigned char cas_clt_ip[4]
Definition: broker_shm.h:323
static void shard_shm_dump_shard_appl_server(FILE *fp, T_APPL_SERVER_INFO *as_info_p)
Definition: shard_shm.c:493
#define BROKER_PATH_MAX
Definition: broker_config.h:91
T_BROKER_VERSION clt_version
Definition: broker_shm.h:303
time_t last_access_time
Definition: broker_shm.h:317
static T_BROKER_INFO * br_info_p
Definition: broker.c:312
int max_prepared_stmt_count
Definition: broker_shm.h:482
#define SHARD_ERR(f, a...)
#define SHM_PROXY
Definition: broker_shm.h:65
T_SHARD_KEY_RANGE range[SHARD_KEY_RANGE_MAX]
Definition: broker_shm.h:263
int num_key_range
Definition: broker_shm.h:262
static T_SHM_PROXY * shm_proxy_p
Definition: broker.c:313
char slow_log_dir[CONF_LOG_FILE_LEN]
char proxy_log_dir[CONF_LOG_FILE_LEN]
void shard_shm_init_client_info_request(T_CLIENT_INFO *client_info_p)
Definition: shard_shm.c:773
char database_user[SRV_CON_DBUSER_SIZE]
Definition: broker_shm.h:354
T_SHM_SHARD_CONN * shard_metadata_get_conn(T_SHM_PROXY *shm_proxy_p)
#define SHM_MUTEX_BROKER
Definition: broker_shm.h:68
#define UTS_STATUS_START
Definition: broker_shm.h:48
INT64 num_queries_processed
Definition: broker_shm.h:345
T_SHM_SHARD_CONN_STAT * shard_shm_get_shard_stat(T_PROXY_INFO *proxy_info_p, int idx)
Definition: shard_shm.c:463
T_SHARD_INFO shard_info[SHARD_INFO_SIZE_LIMIT]
Definition: broker_shm.h:520
struct t_shm_proxy T_SHM_PROXY
Definition: broker_shm.h:524
int appl_server_hard_limit
#define CLIENT_INFO_SIZE_LIMIT
char broker_name[BROKER_NAME_LEN]
Definition: broker_shm.h:588
int max_appl_server
Definition: broker_shm.h:416
int appl_server_hard_limit
Definition: broker_shm.h:612
T_APPL_SERVER_INFO * shard_shm_get_as_info(T_PROXY_INFO *proxy_info_p, T_SHM_APPL_SERVER *shm_as_p, int shard_id, int as_id)
Definition: shard_shm.c:671
#define UTS_STATUS_IDLE
Definition: broker_shm.h:46
char jdbc_cache_only_hint
Definition: broker_shm.h:570
int max_client
Definition: broker_shm.h:533
#define SRV_CON_VER_STR_MAX_SIZE
Definition: cas_protocol.h:59
bool shard_shm_set_as_client_info_with_db_param(T_PROXY_INFO *proxy_info_p, T_SHM_APPL_SERVER *shm_as_p, int shard_id, int as_id, T_CLIENT_INFO *client_info_p)
Definition: shard_shm.c:724
char cci_default_autocommit
Definition: broker_shm.h:572
time_t connect_time
Definition: broker_shm.h:390
char * get_cubrid_file(T_CUBRID_FILE_ID fid, char *buf, size_t len)
char cur_statement_pooling
Definition: broker_shm.h:313
T_SHM_SHARD_KEY_RANGE_STAT stat[SHARD_KEY_RANGE_MAX]
Definition: broker_shm.h:450
int max_context
Definition: broker_shm.h:534
time_t req_time
Definition: broker_shm.h:402
int jdbc_cache_life_time
static const char * get_appl_server_name(int appl_server_type)
Definition: broker_shm.c:938
int min_appl_server
Definition: broker_shm.h:415
#define CAS_MAKE_PROTO_VER(DRIVER_INFO)
Definition: cas_protocol.h:307
#define assert(x)
#define CON_STATUS_LOCK_INIT(AS_INFO)
Definition: broker_shm.h:100
char log_dir[CONF_LOG_FILE_LEN]
char driver_info[SRV_CON_CLIENT_INFO_SIZE]
Definition: broker_shm.h:304
void shard_shm_init_client_info(T_CLIENT_INFO *client_info_p)
Definition: shard_shm.c:756
#define MAX_FD
int proxy_id
Definition: shard_proxy.c:45
int as_info_index_base
Definition: broker_shm.h:422
char cci_default_autocommit
int num_shard_conn
Definition: broker_shm.h:514
int isolation_level
Definition: broker_shm.h:406
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
char stripped_column_name
int service_flag
Definition: broker_shm.h:462
#define CAS_USE_DEFAULT_DB_PARAM
Definition: cas_common.h:43
static int shard_shm_get_max_context(int max_num_appl_server)
Definition: shard_shm.c:845
int uw_shm_destroy(int shm_key)
Definition: broker_shm.c:391
char appl_server
Definition: broker_shm.h:470
int max_prepared_stmt_count
#define LINE_70
Definition: shard_shm.c:48
#define NULL
Definition: freelistheap.h:34
#define strncpy_bufsize(buf, str)
Definition: porting.h:340
int appl_server_shm_id
Definition: broker_shm.h:516
pid_t pid
Definition: dynamic_load.c:955
T_CLIENT_INFO * shard_shm_get_client_info(T_PROXY_INFO *proxy_info_p, int idx)
Definition: shard_shm.c:448
char clt_req_path_info[APPL_NAME_LENGTH]
Definition: broker_shm.h:333
char source_env[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:598
char driver_version[SRV_CON_VER_STR_MAX_SIZE]
Definition: broker_shm.h:392
INT64 num_transactions_processed
Definition: broker_shm.h:344
T_SHM_SHARD_CONN_STAT shard_stat[SHARD_CONN_STAT_SIZE_LIMIT]
Definition: broker_shm.h:518
T_SHM_SHARD_KEY * shard_metadata_get_key(T_SHM_PROXY *shm_proxy_p)
INT64 num_hint_key_queries_requested
Definition: broker_shm.h:430
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
char ignore_shard_hint
static char ** make_env(char *env_file, int *env_num)
char err_log_dir[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:587
T_SHM_SHARD_CONN shm_shard_conn
Definition: broker_shm.h:542
char database_host[CUB_MAXHOSTNAMELEN]
Definition: broker_shm.h:353
time_t res_time
Definition: broker_shm.h:403
#define SHM_MUTEX_ADMIN
Definition: broker_shm.h:69
unsigned int session_id
Definition: broker_shm.h:377
char preferred_hosts[BROKER_INFO_NAME_MAX]
T_PROXY_INFO * proxy_info_p
Definition: shard_proxy.c:48
int proxy_access_log_reset
Definition: broker_shm.h:486
T_CLIENT_INFO client_info[CLIENT_INFO_SIZE_LIMIT+PROXY_RESERVED_FD]
Definition: broker_shm.h:521
int appl_server_max_size
void shard_shm_set_client_info_response(T_CLIENT_INFO *client_info_p)
Definition: shard_shm.c:793
int proxy_log_reset
Definition: broker_shm.h:485
#define PROXY_RESERVED_FD
Definition: broker_shm.h:160
#define BLANK_6
Definition: shard_shm.c:45
static void shard_shm_dump_shard(FILE *fp, T_SHARD_INFO *shard_info_p, T_SHM_APPL_SERVER *shm_as_p)
Definition: shard_shm.c:547
time_t last_connect_time
Definition: broker_shm.h:357
T_SHARD_KEY shard_key[MAX_SHARD_KEY]
Definition: broker_shm.h:270
INT64 num_requests_received
Definition: broker_shm.h:343
static void shard_shm_dump_proxy_info(FILE *fp, T_PROXY_INFO *proxy_info_p)
Definition: shard_shm.c:572
INT64 waiter_count
Definition: broker_shm.h:420
int proxy_max_prepared_stmt_count
INT64 num_hint_id_queries_requested
Definition: broker_shm.h:431
char preferred_hosts[SHM_APPL_SERVER_NAME_MAX]
Definition: broker_shm.h:590
T_SHM_SHARD_KEY_STAT * shard_shm_get_key_stat(T_PROXY_INFO *proxy_info_p, int idx)
Definition: shard_shm.c:478
void shard_shm_dump_appl_server(FILE *fp, int shmid)
Definition: shard_shm.c:651
char name[BROKER_NAME_LEN]
bool shard_shm_set_as_client_info(T_PROXY_INFO *proxy_info_p, T_SHM_APPL_SERVER *shm_as_p, int shard_id, int as_id, unsigned int ip_addr, char *driver_info, char *driver_version)
Definition: shard_shm.c:689
#define FALSE
Definition: broker_admin.c:50
#define PROXY_STATUS_START
Definition: broker_shm.h:57
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
int shard_key_modular
Definition: broker_shm.h:537
#define BLANK_3
Definition: shard_shm.c:44
int wait_timeout
Definition: broker_shm.h:479
T_APPL_SERVER_INFO as_info[APPL_SERVER_NUM_LIMIT]
Definition: broker_shm.h:641
int num_appl_server
Definition: broker_shm.h:417
char statement_pooling
int i
Definition: dynamic_load.c:954
char port_name[SHM_PROXY_NAME_MAX]
Definition: broker_shm.h:488
void shard_shm_dump_appl_server_internal(FILE *fp, T_SHM_PROXY *shm_proxy_p)
Definition: shard_shm.c:641
int getsize(int pid)
static void shard_shm_set_shard_conn_info(T_SHM_APPL_SERVER *shm_as_p, T_SHM_PROXY *shm_proxy_p)
Definition: broker_shm.c:655
#define APPL_SERVER_NAME_MAX_SIZE
Definition: broker_shm.h:120
char stripped_column_name
Definition: broker_shm.h:563
char source_env[CONF_LOG_FILE_LEN]
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
T_SHM_SHARD_KEY shm_shard_key
Definition: broker_shm.h:543
char slow_log_dir[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:586
T_SHM_SHARD_CONN * shm_conn_p
Definition: shard_proxy.c:52
char log_dir[CONF_LOG_FILE_LEN]
Definition: broker_shm.h:585
char err_log_dir[CONF_LOG_FILE_LEN]
struct t_shm_appl_server T_SHM_APPL_SERVER
Definition: broker_shm.h:557
static void shard_shm_init_shard_stat(T_SHM_SHARD_CONN_STAT *shard_stat_p, T_SHARD_CONN *shard_conn)
Definition: shard_shm.c:820
static void free_env(char **env, int env_num)
int shard_metadata_initialize(T_BROKER_INFO *br_info, T_SHM_PROXY *shm_proxy_p)
void shard_shm_set_client_info_request(T_CLIENT_INFO *client_info_p, int func_code)
Definition: shard_shm.c:783
T_SHM_PROXY * shard_shm_initialize_shm_proxy(T_BROKER_INFO *br_info_p)
Definition: shard_shm.c:261
void * uw_shm_create(int shm_key, int size, int which_shm)
Definition: broker_shm.c:334
#define SHM_APPL_SERVER
Definition: broker_shm.h:63