37 #include <sys/types.h> 45 #include <sys/ioctl.h> 47 #include <sys/socket.h> 48 #include <netinet/in.h> 53 #include <sys/select.h> 57 #include <sys/filio.h> 84 #define FD_SETSIZE 256 88 #define TRACE(string, arg1) \ 90 er_log_debug(ARG_FILE_LINE, string, arg1); \ 94 #define TRACE(string, arg1) 107 const char *server_name,
int server_name_length,
int port,
int timeout,
108 unsigned short *rid,
bool send_magic);
110 unsigned short *rid);
112 unsigned short *rid);
176 css_Conn_anchor = conn;
206 for (p = previous = css_Conn_anchor;
p; previous =
p, p = p->
next)
210 if (p == css_Conn_anchor)
212 css_Conn_anchor = p->
next;
260 for (p = css_Conn_anchor;
p; p = p->
next)
279 unsigned short old_rid;
327 unsigned short flags;
368 unsigned short flags = 0;
465 TRACE (
"in css_receive_request, received request: %d\n", *request);
494 TRACE (
"conn->status = %d in css_receive_data\n", conn ? conn->
status : 0);
498 assert (buffer && buffer_size);
502 TRACE (
"returning queued data of size %d\n", *buffer_size);
548 else if (0 <= buf_size)
570 *buffer_size = buf_size;
582 assert (*buffer_size == 0);
623 assert (buffer && buffer_size);
680 *buffer_size = buf_size;
692 assert (*buffer_size == 0);
721 int server_name_length,
int port,
int timeout,
unsigned short *rid,
bool send_magic)
725 #if !defined (WINDOWS) 753 #if !defined (WINDOWS) 754 else if (errno == ETIMEDOUT)
782 length = (int)
strlen (server_name) + 1;
807 int reason = -1, buffer_size;
812 return_status =
NULL;
830 if (buffer_size ==
sizeof (
int) && buffer == (
char *) &reason)
832 reason =
ntohl (reason);
835 return_status = conn;
842 if (buffer !=
NULL && buffer != (
char *) &reason)
847 return return_status;
866 int response, response_buff;
868 int connection_protocol;
869 #if !defined(WINDOWS) 871 int datagram_fd, socket_fd;
890 if (
css_common_connect (hname, conn, connection_protocol, server_name, name_length, master_port_id, 0, &rid,
true)
896 if (
css_readn (conn->
fd, (
char *) &response_buff,
sizeof (int), -1) !=
sizeof (int))
901 response =
ntohl (response_buff);
903 TRACE (
"connect_to_master received %d as response from master\n", response);
947 response =
htonl (server_port_id);
948 css_net_send (conn, (
char *) &response,
sizeof (
int), -1);
962 pname = std::filesystem::temp_directory_path ();
963 pname +=
"/csql_tcp_setup_server" + std::to_string (getpid ());
964 (void) unlink (pname.c_str ());
968 (void) unlink (pname.c_str ());
974 (void) unlink (pname.c_str ());
981 (void) unlink (pname.c_str ());
987 (void) unlink (pname.c_str ());
1011 int reason, port_id;
1015 char *buffer =
NULL;
1016 char reason_buffer[
sizeof (int)];
1040 goto error_receive_data;
1043 if (buffer !=
NULL && size ==
sizeof (
int))
1045 reason =
ntohl (*((
int *) buffer));
1052 if (buffer !=
NULL && buffer != reason_buffer)
1063 if (++retry_count > 20)
1080 goto error_receive_data;
1082 if (buffer !=
NULL && size ==
sizeof (
int))
1084 port_id =
ntohl (*((
int *) buffer));
1086 if (buffer != reason_buffer)
1113 if (error_area !=
NULL)
1125 if (buffer !=
NULL && buffer != reason_buffer)
1137 if (buffer_q_entry_p !=
NULL)
1178 double time = timeout;
1186 time = ceil (time / 1000);
1224 #if defined(CS_MODE) 1225 extern unsigned short method_request_id;
1227 if (method_request_id == request_id)
1272 if (buffer_q_entry_p !=
NULL)
1274 if (*buffer_size > buffer_q_entry_p->
size)
1276 *buffer_size = buffer_q_entry_p->
size;
1279 buffer = buffer_q_entry_p->
buffer;
1285 else if (*buffer_size == 0)
1291 return (
char *) malloc (*buffer_size);
1311 if (data_q_entry_p ==
NULL)
1326 if (buffer_q_entry_p !=
NULL)
1328 *buffer = buffer_q_entry_p->
buffer;
1329 *buffer_size = data_q_entry_p->
size;
1331 memcpy (*buffer, data_q_entry_p->
buffer, *buffer_size);
1336 *buffer = data_q_entry_p->
buffer;
1337 *buffer_size = data_q_entry_p->
size;
1345 *rc = data_q_entry_p->
rc;
1371 if (error_q_entry_p ==
NULL)
1377 *buffer = error_q_entry_p->
buffer;
1378 *buffer_size = error_q_entry_p->
size;
1393 if (p->
size < *buffer_size)
1395 p->
buffer = (
char *) malloc (*buffer_size);
1408 p->
size = *buffer_size;
1432 TPRINTF (
"Entered return queued request %d\n", 0);
1436 if (request_q_entry_p ==
NULL)
1442 TPRINTF (
"Found a queued request %d\n", 0);
1444 *rid = request_q_entry_p->
key;
CSS_CONN_ENTRY * css_connect_to_master_for_info(const char *host_name, int port_id, unsigned short *rid)
#define ER_LK_UNILATERALLY_ABORTED
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
bool css_tcp_listen_server_datagram(SOCKET sockfd, SOCKET *newfd)
#define IS_MASTER_CONN_NAME_HA_APPLYLOG(name)
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
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)
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
static CSS_CONN_ENTRY * css_Conn_anchor
SOCKET css_tcp_client_open_with_retry(const char *host, int port, bool will_retry)
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)
static void css_close_conn(CSS_CONN_ENTRY *conn)
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)
int css_return_queued_error(CSS_CONN_ENTRY *conn, unsigned short request_id, char **buffer, int *buffer_size, int *rc)
bool css_does_master_exist(int port_id)
void css_read_remaining_bytes(SOCKET fd, int len)
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
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
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
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)
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)
#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)
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)
#define TRACE(string, arg1)
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)
static void css_dealloc_conn(CSS_CONN_ENTRY *conn)
unsigned short ntohs(unsigned short from)
#define GET_REAL_MASTER_CONN_NAME(name)
#define free_and_init(ptr)
SOCKET css_tcp_client_open_with_timeout(const char *host, int port, int timeout)
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
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 css_send_data(CSS_CONN_ENTRY *conn, unsigned short rid, const char *buffer, int buffer_size)
CSS_QUEUE_ENTRY * request_queue
#define CUB_MAXHOSTNAMELEN
int css_open_server_connection_socket(void)
#define IS_MASTER_CONN_NAME_HA_COPYLOG(name)
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
#define GETHOSTNAME(p, l)
void css_remove_all_unexpected_packets(CSS_CONN_ENTRY *conn)
CSS_CONN_ENTRY * css_make_conn(SOCKET fd)