CUBRID Engine  latest
connection_cl.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  * connection_cl.c - general interface routines needed to support
22  * the client and server interaction
23  */
24 
25 #ident "$Id$"
26 
27 #include "config.h"
28 
29 #if defined (WINDOWS)
30 #include <io.h>
31 #endif
32 #include <filesystem>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <errno.h>
37 #include <sys/types.h>
38 #include <assert.h>
39 #include <math.h>
40 
41 #if defined(WINDOWS)
42 #include <winsock2.h>
43 #else /* WINDOWS */
44 #include <sys/time.h>
45 #include <sys/ioctl.h>
46 #include <sys/uio.h>
47 #include <sys/socket.h>
48 #include <netinet/in.h>
49 #include <unistd.h>
50 #endif /* WINDOWS */
51 
52 #if defined(_AIX)
53 #include <sys/select.h>
54 #endif /* _AIX */
55 
56 #if defined(SOLARIS)
57 #include <sys/filio.h>
58 #include <netdb.h> /* for MAXHOSTNAMELEN */
59 #endif /* SOLARIS */
60 
61 #include "porting.h"
62 #include "error_manager.h"
63 #include "connection_globals.h"
64 #include "filesys.hpp"
65 #include "filesys_temp.hpp"
66 #include "memory_alloc.h"
67 #include "system_parameter.h"
68 #include "environment_variable.h"
69 #if defined(WINDOWS)
70 #include "wintcp.h"
71 #else /* WINDOWS */
72 #include "tcp.h"
73 #endif /* WINDOWS */
74 #include "connection_list_cl.h"
75 #include "connection_cl.h"
76 #include "master_util.h"
77 
78 #if defined(HPUX)
79 /*
80  * HP uses a monster fd set size (2K) and recommends in sys/types.h
81  * that users reduce the size.
82  */
83 #undef FD_SETSIZE
84 #define FD_SETSIZE 256
85 #endif /* HPUX */
86 
87 #ifdef PACKET_TRACE
88 #define TRACE(string, arg1) \
89  do { \
90  er_log_debug(ARG_FILE_LINE, string, arg1); \
91  } \
92  while (0)
93 #else /* PACKET_TRACE */
94 #define TRACE(string, arg1)
95 #endif /* PACKET_TRACE */
96 
97 /* the queue anchor for all the connection structures */
99 static int css_Client_id = 0;
100 
101 static void css_initialize_conn (CSS_CONN_ENTRY * conn, SOCKET fd);
102 static void css_close_conn (CSS_CONN_ENTRY * conn);
103 static void css_dealloc_conn (CSS_CONN_ENTRY * conn);
104 
105 static int css_read_header (CSS_CONN_ENTRY * conn, NET_HEADER * local_header);
106 static CSS_CONN_ENTRY *css_common_connect (const char *host_name, CSS_CONN_ENTRY * conn, int connect_type,
107  const char *server_name, int server_name_length, int port, int timeout,
108  unsigned short *rid, bool send_magic);
109 static CSS_CONN_ENTRY *css_server_connect (char *host_name, CSS_CONN_ENTRY * conn, char *server_name,
110  unsigned short *rid);
111 static CSS_CONN_ENTRY *css_server_connect_part_two (char *host_name, CSS_CONN_ENTRY * conn, int port_id,
112  unsigned short *rid);
113 static int css_return_queued_data (CSS_CONN_ENTRY * conn, unsigned short request_id, char **buffer, int *buffer_size,
114  int *rc);
115 static int css_return_queued_request (CSS_CONN_ENTRY * conn, unsigned short *rid, int *request, int *buffer_size);
116 
117 /*
118  * css_shutdown_conn () -
119  * return: void
120  * conn(in/out):
121  *
122  * To close down a connection and make sure that the fd gets
123  * set to -1 so we don't try to shutdown the socket more than once.
124  *
125  */
126 void
128 {
129  if (!IS_INVALID_SOCKET (conn->fd))
130  {
131  css_shutdown_socket (conn->fd);
132  conn->fd = INVALID_SOCKET;
133  }
134  conn->status = CONN_CLOSED;
135 }
136 
137 /*
138  * css_initialize_conn () -
139  * return: void
140  * conn(in/out):
141  * fd(in):
142  */
143 static void
145 {
146  conn->request_id = 0;
147  conn->fd = fd;
148  conn->status = CONN_OPEN;
149  conn->client_id = ++css_Client_id;
150  conn->data_queue = NULL;
151  conn->request_queue = NULL;
152  conn->abort_queue = NULL;
153  conn->buffer_queue = NULL;
154  conn->error_queue = NULL;
155  conn->set_tran_index (NULL_TRAN_INDEX);
156  conn->invalidate_snapshot = 1;
157  conn->db_error = 0;
158  conn->cnxn = NULL;
159 }
160 
161 /*
162  * css_make_conn () -
163  * return:
164  * fd(in):
165  */
168 {
169  CSS_CONN_ENTRY *conn;
170 
171  conn = (CSS_CONN_ENTRY *) malloc (sizeof (CSS_CONN_ENTRY));
172  if (conn != NULL)
173  {
174  css_initialize_conn (conn, fd);
175  conn->next = css_Conn_anchor;
176  css_Conn_anchor = conn;
177  }
178  return conn;
179 }
180 
181 /*
182  * css_close_conn () -
183  * return: void
184  * conn(in):
185  */
186 static void
188 {
189  if (conn && !IS_INVALID_SOCKET (conn->fd))
190  {
191  css_shutdown_conn (conn);
192  css_initialize_conn (conn, -1);
193  }
194 }
195 
196 /*
197  * css_dealloc_conn () -
198  * return: void
199  * conn(in/out):
200  */
201 static void
203 {
204  CSS_CONN_ENTRY *p, *previous;
205 
206  for (p = previous = css_Conn_anchor; p; previous = p, p = p->next)
207  {
208  if (p == conn)
209  {
210  if (p == css_Conn_anchor)
211  {
212  css_Conn_anchor = p->next;
213  }
214  else
215  {
216  previous->next = p->next;
217  }
218  break;
219  }
220  }
221 
222  if (p)
223  {
224  free_and_init (conn);
225  }
226 }
227 
228 /*
229  * css_free_conn () -
230  * return: void
231  * conn(in/out):
232  */
233 void
235 {
236  css_close_conn (conn);
237  css_dealloc_conn (conn);
238 }
239 
240 /*
241  * css_find_exception_conn () -
242  * return:
243  */
246 {
247  return NULL;
248 }
249 
250 /*
251  * css_find_conn_from_fd () - find the connection associated with the current socket descriptor
252  * return: conn or NULL
253  * fd(in): Socket fd
254  */
257 {
258  CSS_CONN_ENTRY *p;
259 
260  for (p = css_Conn_anchor; p; p = p->next)
261  {
262  if (p->fd == fd)
263  {
264  return p;
265  }
266  }
267 
268  return NULL;
269 }
270 
271 /*
272  * css_get_request_id () - return the next valid request id
273  * return:
274  * conn(in):
275  */
276 unsigned short
278 {
279  unsigned short old_rid;
280 
281  old_rid = conn->request_id++;
282  if (conn->request_id == 0)
283  {
284  conn->request_id++;
285  }
286 
287  while (conn->request_id != old_rid)
288  {
289  if (css_is_valid_request_id (conn, conn->request_id))
290  {
291  return (conn->request_id);
292  }
293  else
294  {
295  conn->request_id++;
296  if (conn->request_id == 0)
297  {
298  conn->request_id++;
299  }
300  }
301  }
302 
304  return 0;
305 }
306 
307 /*
308  * css_test_for_open_conn () - test to see if the connection is still open
309  * return:
310  * conn(in):
311  */
312 int
314 {
315  return (conn && conn->status == CONN_OPEN);
316 }
317 
318 /*
319  * css_send_close_request () - close an open connection
320  * return:
321  * conn(in):
322  */
323 int
325 {
327  unsigned short flags;
328 
329  if (!conn || conn->status == CONN_CLOSED)
330  {
331  return CONNECTION_CLOSED;
332  }
333 
334  if (conn->status == CONN_OPEN)
335  {
336  header.type = htonl (CLOSE_TYPE);
337  header.transaction_id = htonl (conn->get_tran_index ());
338  flags = 0;
339  if (conn->invalidate_snapshot)
340  {
342  }
343  header.flags = ntohs (flags);
344  header.db_error = htonl (conn->db_error);
345  /* timeout in milli-second in css_net_send() */
346  css_net_send (conn, (char *) &header, sizeof (NET_HEADER), -1);
347  }
348 
350  css_shutdown_conn (conn);
351 
352  return NO_ERRORS;
353 }
354 
355 /*
356  * css_read_header () - read a header from the socket
357  * return:
358  * conn(in):
359  * local_header(in):
360  *
361  * Note: It is a blocking read.
362  */
363 static int
364 css_read_header (CSS_CONN_ENTRY * conn, NET_HEADER * local_header)
365 {
366  int buffer_size;
367  int rc = 0;
368  unsigned short flags = 0;
369 
370  buffer_size = sizeof (NET_HEADER);
371 
372  rc = css_net_read_header (conn->fd, (char *) local_header, &buffer_size, -1);
373  if (rc == NO_ERRORS && ntohl (local_header->type) == CLOSE_TYPE)
374  {
375  css_shutdown_conn (conn);
376  return CONNECTION_CLOSED;
377  }
378 
379  if (rc != NO_ERRORS && rc != RECORD_TRUNCATED)
380  {
381  css_shutdown_conn (conn);
382  return CONNECTION_CLOSED;
383  }
384 
385  conn->set_tran_index (ntohl (local_header->transaction_id));
386  flags = ntohs (local_header->flags);
388  conn->db_error = (int) ntohl (local_header->db_error);
389 
390  return rc;
391 }
392 
393 /*
394  * css_read_one_request () - return a request if one is queued up or on the socket
395  * return:
396  * conn(in):
397  * rid(out):
398  * request(out):
399  * buffer_size(out):
400  *
401  * Note: If no input is available on the socket, it will block until something is available.
402  */
403 int
404 css_read_one_request (CSS_CONN_ENTRY * conn, unsigned short *rid, int *request, int *buffer_size)
405 {
406  int rc;
407  int type;
408  NET_HEADER local_header = DEFAULT_HEADER_DATA;
409 
410  if (conn == NULL || conn->status != CONN_OPEN)
411  {
412  return CONNECTION_CLOSED;
413  }
414 
415  if (css_return_queued_request (conn, rid, request, buffer_size))
416  {
417  return NO_ERRORS;
418  }
419 
420  rc = css_read_header (conn, &local_header);
421  if (rc == NO_ERRORS)
422  {
423  *rid = (unsigned short) ntohl (local_header.request_id);
424  type = ntohl (local_header.type);
425 
426  if (type == COMMAND_TYPE)
427  {
428  *request = (int) (unsigned short) ntohs (local_header.function_code);
429  *buffer_size = (int) ntohl (local_header.buffer_size);
430  return rc;
431  }
432  else
433  {
434  css_queue_unexpected_packet (type, conn, *rid, &local_header, sizeof (NET_HEADER));
435  rc = WRONG_PACKET_TYPE;
436  }
437  }
438 
439  *buffer_size = 0;
440  *rid = 0;
441  *request = 0;
442 
443  return rc;
444 }
445 
446 /*
447  * css_receive_request () - "blocking" read for a new request
448  * return:
449  * conn(in):
450  * rid(out):
451  * request(out):
452  * buffer_size(out):
453  */
454 int
455 css_receive_request (CSS_CONN_ENTRY * conn, unsigned short *rid, int *request, int *buffer_size)
456 {
457  int rc;
458 
459  do
460  {
461  rc = css_read_one_request (conn, rid, request, buffer_size);
462  }
463  while (rc == WRONG_PACKET_TYPE);
464 
465  TRACE ("in css_receive_request, received request: %d\n", *request);
466 
467  return rc;
468 }
469 
470 /*
471  * css_receive_data () - return a data buffer for an associated request
472  * return:
473  * conn(in):
474  * req_id(in):
475  * buffer(out):
476  * buffer_size(out):
477  * timeout(in):
478  *
479  * Note: this is a blocking read.
480  */
481 int
482 css_receive_data (CSS_CONN_ENTRY * conn, unsigned short req_id, char **buffer, int *buffer_size, int timeout)
483 {
485  int header_size;
486  int rc;
487  unsigned int rid;
488  int type;
489  char *buf = NULL;
490  int buf_size = 0;
491 
492  if (conn == NULL || conn->status != CONN_OPEN)
493  {
494  TRACE ("conn->status = %d in css_receive_data\n", conn ? conn->status : 0);
495  return CONNECTION_CLOSED;
496  }
497 
498  assert (buffer && buffer_size);
499 
500  if (css_return_queued_data (conn, req_id, buffer, buffer_size, &rc))
501  {
502  TRACE ("returning queued data of size %d\n", *buffer_size);
503  return rc;
504  }
505 
506 begin:
507  header_size = sizeof (NET_HEADER);
508  rc = css_net_read_header (conn->fd, (char *) &header, &header_size, timeout);
509  if (rc != NO_ERRORS)
510  {
511  return rc;
512  }
513 
514  assert (header_size == sizeof (NET_HEADER)); // to make it sure.
515 
516  rid = ntohl (header.request_id);
517  conn->db_error = (int) ntohl (header.db_error);
518 
519  type = ntohl (header.type);
520  if (type == DATA_TYPE)
521  {
522  conn->set_tran_index (ntohl (header.transaction_id));
523 
524  buf_size = ntohl (header.buffer_size);
525 
526  if (rid == req_id)
527  {
528  buf = (char *) css_return_data_buffer (conn, rid, &buf_size);
529  }
530  else
531  {
532  buf = (char *) css_return_data_buffer (conn, 0, &buf_size);
533  }
534 
535  if (buf != NULL)
536  {
537  rc = css_net_recv (conn->fd, buf, &buf_size, timeout);
538  if (rc == NO_ERRORS || rc == RECORD_TRUNCATED)
539  {
540  if (req_id != rid)
541  {
542  /* We have some data for a different request id */
543  css_queue_unexpected_data_packet (conn, rid, buf, buf_size, rc);
544  goto begin;
545  }
546  }
547  }
548  else if (0 <= buf_size)
549  {
550  // Two cases here:
551  // 1. allocation failure: (buf == NULL && buf_size > 0)
552  // 2. receives size 0 buffer: (buf == NULL && buf_size == 0)
553  // - sender sent size 0 for nil buffer and receiver should consume its size.
554 
555  css_read_remaining_bytes (conn->fd, sizeof (int) + buf_size);
556 
557  if (0 < buf_size)
558  {
559  rc = CANT_ALLOC_BUFFER;
560  }
561 
562  if (req_id != rid)
563  {
564  css_queue_unexpected_data_packet (conn, rid, NULL, 0, rc);
565  goto begin;
566  }
567  }
568 
569  *buffer = buf;
570  *buffer_size = buf_size;
571 
572  return rc;
573  }
574 #if defined(CS_MODE)
575  else if (type == ABORT_TYPE)
576  {
577  /*
578  * if the user registered a buffer, we should return the buffer
579  */
580  *buffer_size = ntohl (header.buffer_size);
581  *buffer = css_return_data_buffer (conn, req_id, buffer_size);
582  assert (*buffer_size == 0);
583 
584  return SERVER_ABORTED;
585  }
586 #endif /* CS_MODE */
587  else
588  {
589  css_queue_unexpected_packet (type, conn, rid, &header, ntohl (header.buffer_size));
590  goto begin;
591  }
592 
593  // unreachable
594  assert (0);
595 }
596 
597 /*
598  * css_receive_error () - return an error buffer for an associated request
599  * return:
600  * conn(in):
601  * req_id(in):
602  * buffer(out):
603  * buffer_size(out):
604  *
605  * Note: this is a blocking read.
606  */
607 int
608 css_receive_error (CSS_CONN_ENTRY * conn, unsigned short req_id, char **buffer, int *buffer_size)
609 {
611  int header_size;
612  int rc;
613  int rid;
614  int type;
615  char *buf = NULL;
616  int buf_size = 0;
617 
618  if (conn == NULL || conn->status != CONN_OPEN)
619  {
620  return CONNECTION_CLOSED;
621  }
622 
623  assert (buffer && buffer_size);
624 
625  if (css_return_queued_error (conn, req_id, buffer, buffer_size, &rc))
626  {
627  return rc;
628  }
629 
630 begin:
631  header_size = sizeof (NET_HEADER);
632  rc = css_net_read_header (conn->fd, (char *) &header, &header_size, -1);
633  if (rc != NO_ERRORS)
634  {
635  return rc;
636  }
637  assert (header_size == sizeof (NET_HEADER));
638 
639  rid = ntohl (header.request_id);
640  conn->db_error = (int) ntohl (header.db_error);
641 
642  type = ntohl (header.type);
643  if (type == ERROR_TYPE)
644  {
645  conn->set_tran_index (ntohl (header.transaction_id));
646 
647  buf_size = ntohl (header.buffer_size);
648  if (buf_size != 0)
649  {
650  buf = (char *) css_return_data_buffer (conn, rid, &buf_size);
651  if (buf != NULL)
652  {
653  rc = css_net_recv (conn->fd, buf, &buf_size, -1);
654  if (rc == NO_ERRORS || rc == RECORD_TRUNCATED)
655  {
656  if (req_id != rid)
657  {
658  /* We have some data for a different request id */
659  css_queue_unexpected_error_packet (conn, rid, buf, buf_size, rc);
660  goto begin;
661  }
662  }
663  }
664  else
665  {
666  /*
667  * allocation error, buffer == NULL
668  * cleanup received message and set error
669  */
670  css_read_remaining_bytes (conn->fd, sizeof (int) + buf_size);
671  rc = CANT_ALLOC_BUFFER;
672  if (req_id != rid)
673  {
674  css_queue_unexpected_error_packet (conn, rid, NULL, 0, rc);
675  goto begin;
676  }
677  }
678 
679  *buffer = buf;
680  *buffer_size = buf_size;
681 
682  return rc;
683  }
684  else
685  {
686  /*
687  * This is the case where data length is zero, but if the
688  * user registered a buffer, we should return the buffer
689  */
690  *buffer_size = ntohl (header.buffer_size);
691  *buffer = css_return_data_buffer (conn, req_id, buffer_size);
692  assert (*buffer_size == 0);
693 
694  return rc;
695  }
696  }
697  else
698  {
699  css_queue_unexpected_packet (type, conn, rid, &header, ntohl (header.buffer_size));
700  goto begin;
701  }
702 
703  // unreachable
704  assert (0);
705 }
706 
707 /*
708  * css_common_connect () - actually try to make a connection to a server
709  * return:
710  * host_name(in):
711  * conn(in/out):
712  * connect_type(in):
713  * server_name(in):
714  * server_name_length(in):
715  * port(in):
716  * timeout(in): timeout in seconds
717  * rid(out):
718  */
719 static CSS_CONN_ENTRY *
720 css_common_connect (const char *host_name, CSS_CONN_ENTRY * conn, int connect_type, const char *server_name,
721  int server_name_length, int port, int timeout, unsigned short *rid, bool send_magic)
722 {
723  SOCKET fd;
724 
725 #if !defined (WINDOWS)
726  if (timeout > 0)
727  {
728  /* timeout in milli-seconds in css_tcp_client_open_with_timeout() */
729  fd = css_tcp_client_open_with_timeout (host_name, port, timeout * 1000);
730  }
731  else
732  {
733  fd = css_tcp_client_open_with_retry (host_name, port, true);
734  }
735 #else /* !WINDOWS */
736  fd = css_tcp_client_open_with_retry (host_name, port, true);
737 #endif /* WINDOWS */
738 
739  if (!IS_INVALID_SOCKET (fd))
740  {
741  conn->fd = fd;
742 
743  if (send_magic == true && css_send_magic (conn) != NO_ERRORS)
744  {
745  return NULL;
746  }
747 
748  if (css_send_request (conn, connect_type, rid, server_name, server_name_length) == NO_ERRORS)
749  {
750  return conn;
751  }
752  }
753 #if !defined (WINDOWS)
754  else if (errno == ETIMEDOUT)
755  {
757  }
758 #endif /* !WINDOWS */
759  else
760  {
762  }
763 
764  return NULL;
765 }
766 
767 /*
768  * css_server_connect () - actually try to make a connection to a server
769  * return:
770  * host_name(in):
771  * conn(in):
772  * server_name(in):
773  * rid(out):
774  */
775 static CSS_CONN_ENTRY *
776 css_server_connect (char *host_name, CSS_CONN_ENTRY * conn, char *server_name, unsigned short *rid)
777 {
778  int length;
779 
780  if (server_name)
781  {
782  length = (int) strlen (server_name) + 1;
783  }
784  else
785  {
786  length = 0;
787  }
788 
789  /* timeout in second in css_common_connect() */
790  return (css_common_connect (host_name, conn, DATA_REQUEST, server_name, length, css_Service_id,
792 }
793 
794 /* New style server connection function that uses an explicit port id */
795 
796 /*
797  * css_server_connect_part_two () -
798  * return:
799  * host_name(in):
800  * conn(in):
801  * port_id(in):
802  * rid(in):
803  */
804 static CSS_CONN_ENTRY *
805 css_server_connect_part_two (char *host_name, CSS_CONN_ENTRY * conn, int port_id, unsigned short *rid)
806 {
807  int reason = -1, buffer_size;
808  char *buffer = NULL;
809  CSS_CONN_ENTRY *return_status;
810  int timeout = -1;
811 
812  return_status = NULL;
813 
815 
816  /* Use css_common_connect with the server's port id, since we already know we'll be connecting to the right server,
817  * don't bother sending the server name.
818  */
819 
820  /* timeout in second in css_common_connect() */
821  if (css_common_connect (host_name, conn, DATA_REQUEST, NULL, 0, port_id, timeout, rid, false) == NULL)
822  {
823  return NULL;
824  }
825 
826  /* now ask for a reply from the server */
827  css_queue_user_data_buffer (conn, *rid, sizeof (int), (char *) &reason);
828  if (css_receive_data (conn, *rid, &buffer, &buffer_size, timeout * 1000) == NO_ERRORS)
829  {
830  if (buffer_size == sizeof (int) && buffer == (char *) &reason)
831  {
832  reason = ntohl (reason);
833  if (reason == SERVER_CONNECTED)
834  {
835  return_status = conn;
836  }
837 
838  /* we shouldn't have to deal with SERVER_STARTED responses here ? */
839  }
840  }
841 
842  if (buffer != NULL && buffer != (char *) &reason)
843  {
844  free_and_init (buffer);
845  }
846 
847  return return_status;
848 }
849 
850 /*
851  * css_connect_to_master_server () - connect to the master from the server
852  * return:
853  * master_port_id(in):
854  * server_name(in):
855  * name_length(in):
856  *
857  * Note: The server name argument is actually a combination of two strings,
858  * the server name and the server version
859  */
861 css_connect_to_master_server (int master_port_id, const char *server_name, int name_length)
862 {
863  char hname[CUB_MAXHOSTNAMELEN];
864  CSS_CONN_ENTRY *conn;
865  unsigned short rid;
866  int response, response_buff;
867  int server_port_id;
868  int connection_protocol;
869 #if !defined(WINDOWS)
870  std::string pname;
871  int datagram_fd, socket_fd;
872 #endif
873 
874  css_Service_id = master_port_id;
875  if (GETHOSTNAME (hname, CUB_MAXHOSTNAMELEN) != 0)
876  {
877  return NULL;
878  }
879 
880  conn = css_make_conn (0);
881  if (conn == NULL)
882  {
884  return NULL;
885  }
886 
887  /* select the connection protocol, for PC's this will always be new */
889 
890  if (css_common_connect (hname, conn, connection_protocol, server_name, name_length, master_port_id, 0, &rid, true)
891  == NULL)
892  {
893  goto fail_end;
894  }
895 
896  if (css_readn (conn->fd, (char *) &response_buff, sizeof (int), -1) != sizeof (int))
897  {
898  goto fail_end;
899  }
900 
901  response = ntohl (response_buff);
902 
903  TRACE ("connect_to_master received %d as response from master\n", response);
904 
905  switch (response)
906  {
908 #if defined(CS_MODE)
909  if (IS_MASTER_CONN_NAME_HA_COPYLOG (server_name))
910  {
912  GET_REAL_MASTER_CONN_NAME (server_name));
913  }
914  else if (IS_MASTER_CONN_NAME_HA_APPLYLOG (server_name))
915  {
917  GET_REAL_MASTER_CONN_NAME (server_name));
918  }
919  else if (IS_MASTER_CONN_NAME_HA_SERVER (server_name))
920  {
922  GET_REAL_MASTER_CONN_NAME (server_name));
923  }
924  else
925 #endif /* CS_MODE */
926  {
928  }
929 
930  goto fail_end;
931 
933  /*
934  * Master requests a new-style connect, must go get our port id and set up our connection socket.
935  * For drivers, we don't need a connection socket and we don't want to allocate a bunch of them.
936  * Let a flag variable control whether or not we actually create one of these.
937  */
939  {
940  server_port_id = -1;
941  }
942  else
943  {
944  server_port_id = css_open_server_connection_socket ();
945  }
946 
947  response = htonl (server_port_id);
948  css_net_send (conn, (char *) &response, sizeof (int), -1);
949 
950  /* this connection remains our only contact with the master */
951  return conn;
952 
954 #if defined(WINDOWS)
955  /* Windows can't handle this style of connection at all */
957 
958  goto fail_end;
959 #else /* WINDOWS */
960  /* send the "pathname" for the datagram */
961  /* be sure to open the datagram first. */
962  pname = std::filesystem::temp_directory_path ();
963  pname += "/csql_tcp_setup_server" + std::to_string (getpid ());
964  (void) unlink (pname.c_str ()); // make sure file is deleted
965 
966  if (!css_tcp_setup_server_datagram (pname.c_str (), &socket_fd))
967  {
968  (void) unlink (pname.c_str ());
970  goto fail_end;
971  }
972  if (css_send_data (conn, rid, pname.c_str (), pname.length () + 1) != NO_ERRORS)
973  {
974  (void) unlink (pname.c_str ());
975  close (socket_fd);
977  goto fail_end;
978  }
979  if (!css_tcp_listen_server_datagram (socket_fd, &datagram_fd))
980  {
981  (void) unlink (pname.c_str ());
982  close (socket_fd);
984  goto fail_end;
985  }
986  // success
987  (void) unlink (pname.c_str ());
988  css_free_conn (conn);
989  close (socket_fd);
990  return (css_make_conn (datagram_fd));
991 #endif /* WINDOWS */
992  }
993 
994 fail_end:
995  css_free_conn (conn);
996  return NULL;
997 }
998 
999 /*
1000  * css_connect_to_cubrid_server () - make a new connection to a server
1001  * return:
1002  * host_name(in):
1003  * server_name(in):
1004  */
1006 css_connect_to_cubrid_server (char *host_name, char *server_name)
1007 {
1008  CSS_CONN_ENTRY *conn;
1009  CSS_QUEUE_ENTRY *buffer_q_entry_p;
1010  int css_err_code;
1011  int reason, port_id;
1012  int size;
1013  int retry_count;
1014  unsigned short rid;
1015  char *buffer = NULL;
1016  char reason_buffer[sizeof (int)];
1017  char *error_area;
1018  int error_length;
1019  int timeout = -1;
1020 
1021  conn = css_make_conn (-1);
1022  if (conn == NULL)
1023  {
1024  return NULL;
1025  }
1026 
1028 
1029  retry_count = 0;
1030  if (css_server_connect (host_name, conn, server_name, &rid) == NULL)
1031  {
1032  goto exit;
1033  }
1034 
1035  css_queue_user_data_buffer (conn, rid, sizeof (int), reason_buffer);
1036 
1037  css_err_code = css_receive_data (conn, rid, &buffer, &size, timeout);
1038  if (css_err_code != NO_ERRORS)
1039  {
1040  goto error_receive_data;
1041  }
1042 
1043  if (buffer != NULL && size == sizeof (int))
1044  {
1045  reason = ntohl (*((int *) buffer));
1046  }
1047  else
1048  {
1049  reason = SERVER_NOT_FOUND;
1050  }
1051 
1052  if (buffer != NULL && buffer != reason_buffer)
1053  {
1054  free_and_init (buffer);
1055  }
1056 
1057  switch (reason)
1058  {
1059  case SERVER_CONNECTED:
1060  return conn;
1061 
1062  case SERVER_STARTED:
1063  if (++retry_count > 20)
1064  {
1065  break;
1066  }
1067  else
1068  {
1069  css_close_conn (conn);
1070  }
1071  break;
1072 
1073  case SERVER_CONNECTED_NEW:
1074  /* new style of connection protocol, get the server port id */
1075  css_queue_user_data_buffer (conn, rid, sizeof (int), reason_buffer);
1076 
1077  css_err_code = css_receive_data (conn, rid, &buffer, &size, timeout);
1078  if (css_err_code != NO_ERRORS)
1079  {
1080  goto error_receive_data;
1081  }
1082  if (buffer != NULL && size == sizeof (int))
1083  {
1084  port_id = ntohl (*((int *) buffer));
1085  css_close_conn (conn);
1086  if (buffer != reason_buffer)
1087  {
1088  free_and_init (buffer);
1089  }
1090 
1091  if (css_server_connect_part_two (host_name, conn, port_id, &rid))
1092  {
1093  return conn;
1094  }
1095  }
1096  break;
1097 
1098  case SERVER_IS_RECOVERING:
1101  error_area = NULL;
1102 
1103  /* TODO: We may need to change protocol to properly receive server error for the cases.
1104  * Receiving error from server might not be completed because server disconnects the temporary connection.
1105  */
1106  css_err_code = css_receive_error (conn, rid, &error_area, &error_length);
1107  if (css_err_code == NO_ERRORS && error_area != NULL)
1108  {
1109  // properly received the server error
1110  er_set_area_error (error_area);
1111  }
1112 
1113  if (error_area != NULL)
1114  {
1115  free_and_init (error_area);
1116  }
1117  break;
1118 
1119  case SERVER_NOT_FOUND:
1120  case SERVER_HANG:
1121  default:
1122  break;
1123  }
1124 
1125  if (buffer != NULL && buffer != reason_buffer)
1126  {
1127  free_and_init (buffer);
1128  }
1129 
1130 exit:
1131  css_free_conn (conn);
1132  return NULL;
1133 
1134 error_receive_data:
1135  /* buffer queue should be freed */
1136  buffer_q_entry_p = css_find_queue_entry (conn->buffer_queue, rid);
1137  if (buffer_q_entry_p != NULL)
1138  {
1139  /* buffer_q_entry_p->buffer is the pointer of reason_buffer */
1140  buffer_q_entry_p->buffer = NULL;
1141  css_queue_remove_header_entry_ptr (&conn->buffer_queue, buffer_q_entry_p);
1142  }
1143 
1144  goto exit;
1145 }
1146 
1147 /*
1148  * css_connect_to_master_for_info () - connect to the master server
1149  * return:
1150  * host_name(in):
1151  * port_id(in):
1152  * rid(out):
1153  *
1154  * Note: This will allow the client to extract information from the master,
1155  * as well as modify runtime parameters.
1156  */
1158 css_connect_to_master_for_info (const char *host_name, int port_id, unsigned short *rid)
1159 {
1160  return (css_connect_to_master_timeout (host_name, port_id, 0, rid));
1161 }
1162 
1163 /*
1164  * css_connect_to_master_timeout () - connect to the master server
1165  * return:
1166  * host_name(in):
1167  * port_id(in):
1168  * timeout(in): timeout in milli-seconds
1169  * rid(out):
1170  *
1171  * Note: This will allow the client to extract information from the master,
1172  * as well as modify runtime parameters.
1173  */
1175 css_connect_to_master_timeout (const char *host_name, int port_id, int timeout, unsigned short *rid)
1176 {
1177  CSS_CONN_ENTRY *conn;
1178  double time = timeout;
1179 
1180  conn = css_make_conn (0);
1181  if (conn == NULL)
1182  {
1183  return NULL;
1184  }
1185 
1186  time = ceil (time / 1000);
1187 
1188  return (css_common_connect (host_name, conn, INFO_REQUEST, NULL, 0, port_id, (int) time, rid, true));
1189 }
1190 
1191 /*
1192  * css_does_master_exist () -
1193  * return:
1194  * port_id(in):
1195  */
1196 bool
1198 {
1199  SOCKET fd;
1200 
1201  /* Don't waste time retrying between master to master connections */
1202  fd = css_tcp_client_open_with_retry ("localhost", port_id, false);
1203  if (!IS_INVALID_SOCKET (fd))
1204  {
1205  css_shutdown_socket (fd);
1206  return true;
1207  }
1208  else
1209  {
1210  return false;
1211  }
1212 }
1213 
1214 /*
1215  * css_is_valid_request_id () - verify that there are no currently outstanding
1216  * requests with the same id
1217  * return:
1218  * conn(in):
1219  * request_id(in):
1220  */
1221 bool
1222 css_is_valid_request_id (CSS_CONN_ENTRY * conn, unsigned short request_id)
1223 {
1224 #if defined(CS_MODE)
1225  extern unsigned short method_request_id;
1226 
1227  if (method_request_id == request_id)
1228  {
1229  return false;
1230  }
1231 #endif /* CS_MODE */
1232 
1233  if (css_find_queue_entry (conn->data_queue, request_id) != NULL)
1234  {
1235  return false;
1236  }
1237 
1238  if (css_find_queue_entry (conn->request_queue, request_id) != NULL)
1239  {
1240  return false;
1241  }
1242 
1243  if (css_find_queue_entry (conn->abort_queue, request_id) != NULL)
1244  {
1245  return false;
1246  }
1247 
1248  if (css_find_queue_entry (conn->error_queue, request_id) != NULL)
1249  {
1250  return false;
1251  }
1252 
1253  return true;
1254 }
1255 
1256 /*
1257  * css_return_data_buffer() - return a buffer that has been queued by the
1258  * client (at request time), or will allocate a
1259  * new buffer
1260  * return:
1261  * conn(in/out):
1262  * request_id(in):
1263  * buffer_size(in/out):
1264  */
1265 char *
1266 css_return_data_buffer (CSS_CONN_ENTRY * conn, unsigned short request_id, int *buffer_size)
1267 {
1268  CSS_QUEUE_ENTRY *buffer_q_entry_p;
1269  char *buffer;
1270 
1271  buffer_q_entry_p = css_find_queue_entry (conn->buffer_queue, request_id);
1272  if (buffer_q_entry_p != NULL)
1273  {
1274  if (*buffer_size > buffer_q_entry_p->size)
1275  {
1276  *buffer_size = buffer_q_entry_p->size;
1277  }
1278 
1279  buffer = buffer_q_entry_p->buffer;
1280  buffer_q_entry_p->buffer = NULL;
1281  css_queue_remove_header_entry_ptr (&conn->buffer_queue, buffer_q_entry_p);
1282 
1283  return buffer;
1284  }
1285  else if (*buffer_size == 0)
1286  {
1287  return NULL;
1288  }
1289  else
1290  {
1291  return (char *) malloc (*buffer_size);
1292  }
1293 }
1294 
1295 /*
1296  * css_return_queued_data () - return any data that has been queued
1297  * return:
1298  * conn(in/out):
1299  * request_id(in):
1300  * buffer(out):
1301  * buffer_size(out):
1302  * rc(out):
1303  */
1304 static int
1305 css_return_queued_data (CSS_CONN_ENTRY * conn, unsigned short request_id, char **buffer, int *buffer_size, int *rc)
1306 {
1307  CSS_QUEUE_ENTRY *data_q_entry_p, *buffer_q_entry_p;
1308 
1309  data_q_entry_p = css_find_queue_entry (conn->data_queue, request_id);
1310 
1311  if (data_q_entry_p == NULL)
1312  {
1313  /* empty queue */
1314  return 0;
1315  }
1316 
1317  /*
1318  * We may have somehow already queued a receive buffer for this
1319  * packet. If so, it's important that we use *that* buffer, because
1320  * upper level code will check to see that the buffer address that we
1321  * return from this level is the same as the one that the upper level
1322  * queued earlier. If it isn't, it will raise an error and stop
1323  * (error code -187, "Communications buffer not used").
1324  */
1325  buffer_q_entry_p = css_find_queue_entry (conn->buffer_queue, request_id);
1326  if (buffer_q_entry_p != NULL)
1327  {
1328  *buffer = buffer_q_entry_p->buffer;
1329  *buffer_size = data_q_entry_p->size;
1330  buffer_q_entry_p->buffer = NULL;
1331  memcpy (*buffer, data_q_entry_p->buffer, *buffer_size);
1332  css_queue_remove_header_entry_ptr (&conn->buffer_queue, buffer_q_entry_p);
1333  }
1334  else
1335  {
1336  *buffer = data_q_entry_p->buffer;
1337  *buffer_size = data_q_entry_p->size;
1338  /*
1339  * Null this out so that the call to css_queue_remove_header_entry_ptr()
1340  * below doesn't free the buffer out from underneath our caller.
1341  */
1342  data_q_entry_p->buffer = NULL;
1343  }
1344 
1345  *rc = data_q_entry_p->rc;
1346  conn->set_tran_index (data_q_entry_p->transaction_id);
1347  conn->invalidate_snapshot = data_q_entry_p->invalidate_snapshot;
1348  conn->db_error = data_q_entry_p->db_error;
1349  css_queue_remove_header_entry_ptr (&conn->data_queue, data_q_entry_p);
1350 
1351  return 1;
1352 }
1353 
1354 /*
1355  * css_return_queued_error () - return any error data that has been queued
1356  * return:
1357  * conn(in/out):
1358  * request_id(in):
1359  * buffer(out):
1360  * buffer_size(out):
1361  * rc(out):
1362  */
1363 int
1364 css_return_queued_error (CSS_CONN_ENTRY * conn, unsigned short request_id, char **buffer, int *buffer_size, int *rc)
1365 {
1366  CSS_QUEUE_ENTRY *error_q_entry_p, *p;
1367  CSS_QUEUE_ENTRY entry;
1368 
1369  error_q_entry_p = css_find_queue_entry (conn->error_queue, request_id);
1370 
1371  if (error_q_entry_p == NULL)
1372  {
1373  /* empty queue */
1374  return 0;
1375  }
1376 
1377  *buffer = error_q_entry_p->buffer;
1378  *buffer_size = error_q_entry_p->size;
1379  *rc = error_q_entry_p->db_error;
1380  error_q_entry_p->buffer = NULL;
1381  css_queue_remove_header_entry_ptr (&conn->error_queue, error_q_entry_p);
1382 
1383  /*
1384  * Propagate ER_LK_UNILATERALLY_ABORTED error
1385  * when it is set during method call.
1386  */
1387  if (*rc == ER_LK_UNILATERALLY_ABORTED)
1388  {
1389  for (p = conn->error_queue; p; p = p->next)
1390  {
1391  entry = *p;
1392 
1393  if (p->size < *buffer_size)
1394  {
1395  p->buffer = (char *) malloc (*buffer_size);
1396  if (p->buffer)
1397  {
1398  free_and_init (entry.buffer);
1399  }
1400  else
1401  {
1402  p->buffer = entry.buffer;
1403  p->db_error = *rc;
1404  continue;
1405  }
1406  }
1407 
1408  p->size = *buffer_size;
1409  memcpy (p->buffer, *buffer, p->size);
1410  p->db_error = *rc;
1411  }
1412  }
1413 
1414  return 1;
1415 }
1416 
1417 /*
1418  * css_return_queued_request () - return a pointer to a request, if one is
1419  * queued
1420  * return:
1421  * conn(in/out):
1422  * rid(out):
1423  * request(out):
1424  * buffer_size(out):
1425  */
1426 static int
1427 css_return_queued_request (CSS_CONN_ENTRY * conn, unsigned short *rid, int *request, int *buffer_size)
1428 {
1429  CSS_QUEUE_ENTRY *request_q_entry_p;
1430  NET_HEADER *buffer;
1431 
1432  TPRINTF ("Entered return queued request %d\n", 0);
1433 
1434  request_q_entry_p = conn->request_queue;
1435 
1436  if (request_q_entry_p == NULL)
1437  {
1438  /* empty queue */
1439  return 0;
1440  }
1441 
1442  TPRINTF ("Found a queued request %d\n", 0);
1443 
1444  *rid = request_q_entry_p->key;
1445  buffer = (NET_HEADER *) request_q_entry_p->buffer;
1446 
1447  *request = ntohs (buffer->function_code);
1448  *buffer_size = ntohl (buffer->buffer_size);
1449  conn->set_tran_index (request_q_entry_p->transaction_id);
1450  conn->invalidate_snapshot = request_q_entry_p->invalidate_snapshot;
1451  conn->db_error = request_q_entry_p->db_error;
1452 
1453  /* This will remove both the entry and the buffer */
1455 
1456  return 1;
1457 }
1458 
1459 /*
1460  * css_remove_all_unexpected_packets () - remove all entries in all the queues associated with fd
1461  * return: void
1462  * conn(in/out):
1463  *
1464  * Note: DO NOT REMOVE THE DATA BUFFERS QUEUED BY THE USER
1465  */
1466 void
1468 {
1473 }
int status
CSS_CONN_ENTRY * css_connect_to_master_for_info(const char *host_name, int port_id, unsigned short *rid)
#define ER_LK_UNILATERALLY_ABORTED
Definition: error_code.h:130
void * cnxn
CSS_QUEUE_ENTRY * buffer_queue
static int css_read_header(CSS_CONN_ENTRY *conn, NET_HEADER *local_header)
#define ERR_CSS_ERROR_DURING_SERVER_CONNECT
Definition: error_code.h:444
bool css_tcp_listen_server_datagram(SOCKET sockfd, SOCKET *newfd)
Definition: tcp.c:930
#define IS_MASTER_CONN_NAME_HA_APPLYLOG(name)
Definition: master_util.h:104
int SOCKET
Definition: porting.h:482
int css_test_for_open_conn(CSS_CONN_ENTRY *conn)
void css_queue_remove_header_entry_ptr(CSS_QUEUE_ENTRY **anchor, CSS_QUEUE_ENTRY *entry)
#define ERR_CSS_APPLYLOG_ALREADY_EXISTS
Definition: error_code.h:1448
static void begin(char *test_name)
void css_shutdown_conn(CSS_CONN_ENTRY *conn)
static CSS_CONN_ENTRY * css_server_connect(char *host_name, CSS_CONN_ENTRY *conn, char *server_name, unsigned short *rid)
unsigned int htonl(unsigned int from)
#define IS_MASTER_CONN_NAME_HA_SERVER(name)
Definition: master_util.h:102
void css_free_conn(CSS_CONN_ENTRY *conn)
static CSS_CONN_ENTRY * css_server_connect_part_two(char *host_name, CSS_CONN_ENTRY *conn, int port_id, unsigned short *rid)
int css_Server_inhibit_connection_socket
void css_queue_remove_header_entry(CSS_QUEUE_ENTRY **anchor, unsigned short request_id)
int css_Server_use_new_connection_protocol
int db_error
static CSS_CONN_ENTRY * css_Conn_anchor
Definition: connection_cl.c:98
SOCKET css_tcp_client_open_with_retry(const char *host, int port, bool will_retry)
Definition: tcp.c:414
static int css_return_queued_request(CSS_CONN_ENTRY *conn, unsigned short *rid, int *request, int *buffer_size)
#define NET_HEADER_FLAG_INVALIDATE_SNAPSHOT
int css_read_one_request(CSS_CONN_ENTRY *conn, unsigned short *rid, int *request, int *buffer_size)
int size
SOCKET fd
static void css_close_conn(CSS_CONN_ENTRY *conn)
unsigned short flags
void css_queue_unexpected_data_packet(CSS_CONN_ENTRY *conn, unsigned short request_id, char *buffer, int size, int rc)
bool css_tcp_setup_server_datagram(const char *pathname, SOCKET *sockfd)
Definition: tcp.c:882
int css_return_queued_error(CSS_CONN_ENTRY *conn, unsigned short request_id, char **buffer, int *buffer_size, int *rc)
#define INVALID_SOCKET
Definition: porting.h:483
bool css_does_master_exist(int port_id)
void css_read_remaining_bytes(SOCKET fd, int len)
unsigned int key
int css_send_close_request(CSS_CONN_ENTRY *conn)
int css_receive_request(CSS_CONN_ENTRY *conn, unsigned short *rid, int *request, int *buffer_size)
void css_queue_unexpected_error_packet(CSS_CONN_ENTRY *conn, unsigned short request_id, char *buffer, int size, int rc)
CSS_CONN_ENTRY * css_connect_to_cubrid_server(char *host_name, char *server_name)
#define ERR_CSS_COPYLOG_ALREADY_EXISTS
Definition: error_code.h:1447
int css_net_send(CSS_CONN_ENTRY *conn, const char *buff, int len, int timeout)
unsigned short css_get_request_id(CSS_CONN_ENTRY *conn)
#define ERR_CSS_SERVER_ALREADY_EXISTS
Definition: error_code.h:443
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
#define ERR_CSS_TCP_CONNECT_TIMEDOUT
Definition: error_code.h:1462
CSS_QUEUE_ENTRY * data_queue
int css_send_request(CSS_CONN_ENTRY *conn, int command, unsigned short *request_id, const char *arg_buffer, int arg_buffer_size)
#define assert(x)
int transaction_id
int rc
int prm_get_integer_value(PARAM_ID prm_id)
void css_queue_unexpected_packet(int type, CSS_CONN_ENTRY *conn, unsigned short request_id, NET_HEADER *header, int size)
int er_set_area_error(char *server_area)
static CSS_CONN_ENTRY * css_common_connect(const char *host_name, CSS_CONN_ENTRY *conn, int connect_type, const char *server_name, int server_name_length, int port, int timeout, unsigned short *rid, bool send_magic)
unsigned short request_id
#define IS_INVALID_SOCKET(socket)
Definition: porting.h:484
#define DEFAULT_HEADER_DATA
static int css_return_queued_data(CSS_CONN_ENTRY *conn, unsigned short request_id, char **buffer, int *buffer_size, int *rc)
bool css_is_valid_request_id(CSS_CONN_ENTRY *conn, unsigned short request_id)
static void css_initialize_conn(CSS_CONN_ENTRY *conn, SOCKET fd)
void css_shutdown_socket(SOCKET fd)
Definition: tcp.c:1179
#define NULL
Definition: freelistheap.h:34
void css_queue_remove_header(CSS_QUEUE_ENTRY **anchor)
#define TPRINTF(error_string, arg)
CSS_QUEUE_ENTRY * abort_queue
struct packet_header NET_HEADER
void er_set_with_oserror(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
char * css_return_data_buffer(CSS_CONN_ENTRY *conn, unsigned short request_id, int *buffer_size)
int invalidate_snapshot
#define NULL_TRAN_INDEX
#define TRACE(string, arg1)
Definition: connection_cl.c:94
static int rc
Definition: serial.c:50
int css_readn(SOCKET fd, char *ptr, int nbytes, int timeout)
int css_receive_data(CSS_CONN_ENTRY *conn, unsigned short req_id, char **buffer, int *buffer_size, int timeout)
CSS_QUEUE_ENTRY * css_find_queue_entry(CSS_QUEUE_ENTRY *header, unsigned int key)
#define ARG_FILE_LINE
Definition: error_manager.h:44
static void css_dealloc_conn(CSS_CONN_ENTRY *conn)
unsigned short ntohs(unsigned short from)
#define GET_REAL_MASTER_CONN_NAME(name)
Definition: master_util.h:100
#define free_and_init(ptr)
Definition: memory_alloc.h:147
SOCKET css_tcp_client_open_with_timeout(const char *host, int port, int timeout)
Definition: tcp.c:550
#define strlen(s1)
Definition: intl_support.c:43
CSS_QUEUE_ENTRY * next
int css_Service_id
int css_queue_user_data_buffer(CSS_CONN_ENTRY *conn, unsigned short request_id, int size, char *buffer)
CSS_CONN_ENTRY * css_connect_to_master_server(int master_port_id, const char *server_name, int name_length)
CSS_QUEUE_ENTRY * error_queue
int css_net_recv(SOCKET fd, char *buffer, int *maxlen, int timeout)
#define ERR_CSS_TCP_CANNOT_CONNECT_TO_MASTER
Definition: error_code.h:429
CSS_CONN_ENTRY * css_find_conn_from_fd(SOCKET fd)
int css_send_magic(CSS_CONN_ENTRY *conn)
int css_receive_error(CSS_CONN_ENTRY *conn, unsigned short req_id, char **buffer, int *buffer_size)
int css_net_read_header(SOCKET fd, char *buffer, int *maxlen, int timeout)
unsigned int ntohl(unsigned int from)
int invalidate_snapshot
static int css_Client_id
Definition: connection_cl.c:99
int css_send_data(CSS_CONN_ENTRY *conn, unsigned short rid, const char *buffer, int buffer_size)
CSS_QUEUE_ENTRY * request_queue
CSS_CONN_ENTRY * next
#define CUB_MAXHOSTNAMELEN
Definition: porting.h:379
int db_error
int css_open_server_connection_socket(void)
Definition: tcp.c:1228
#define IS_MASTER_CONN_NAME_HA_COPYLOG(name)
Definition: master_util.h:103
CSS_CONN_ENTRY * css_connect_to_master_timeout(const char *host_name, int port_id, int timeout, unsigned short *rid)
CSS_CONN_ENTRY * css_find_exception_conn(void)
#define ERR_CSS_REQUEST_ID_FAILURE
Definition: error_code.h:420
#define GETHOSTNAME(p, l)
Definition: porting.h:381
const char ** p
Definition: dynamic_load.c:945
int client_id
char * buffer
void css_remove_all_unexpected_packets(CSS_CONN_ENTRY *conn)
CSS_CONN_ENTRY * css_make_conn(SOCKET fd)