changed gw_receive_backend_auth declaration to return int instead of boolean.
mysql_backend.c:
gw_read_backend_event calls gw_receive_backend_auth which either fails (== -1), succeeds with nothing to read (== 0) or succeeds (== 1). For each case there is handling. If dcb_read succeeds without read bytes, return asap.
mysql_client.c:
gw_error_client_event, gw_client_close, gw_client_hangup_event : all close client dcb but now they also close backend dcb.
mysql_common.c:
gw_receive_backend_auth, return -1, 0, or 1 if read from backend failed, was empty, or succeed, respectively.:
State update for filewriter was missing and that caused Maxscale to fail if opening of any log file failed.
dcb.c:
Added EAGAIN and EWOULDBLOCK handling to dcb_read. If dcb_close is called for freshly created dcb, dcb is only freed.
gateway.c:
Added file_write_footer and write_footer of which the latter is called at exit time. It simply draws a line to screen.
gw_utils.c:
Some macros for helping comparison between gw_read_gwbuff and dcb_read, which overlap.
poll.c:
Some macros to help enable/disable mutexing in poll_waitevents
service.c:
Check return value of listen and session_alloc and behave accordingly.
mysql_client.c:
If ioctl returned successfully with b==0 it earlier caused closing the client and backend dcbs. Since that doesn't reliably indicate that client has closed socket on its side, Maxscale doesn't close its sockets either.
mysql_common.c:
In gw_receive_backend_auth, if dcb_read returns n==0, it is not considered as an error anymore. The implemented behavior is not yet complete and correct. Result should be successful but the protocol state shouldn't change to MYSQL_IDLE before backend return is received.
In gw_send_authentication_to_backend protocol state was always set to MYSQL_AUTH_RECV even if gw_rwite had failed. Now, return value is read and state is set in caller's context basen on the return value.
skygw_utils.cc:
Removed ss_dassert from skyge_file_init because it prevented from returning meaningful error meassage to the client.:
tuned error printing and log writing output format
dcb.c :
dcb_connect, check return value of poll_add_dcb and behave accordingly.
dcb_write, in case of SIFPIPE, only write to trace log.
dcb_close, dassert with incorrect dcb states.
gateway.c :
added file_write_header to print header similar than in logs to stderr.
main, add signal handler for SIGPIPE
poll.c :
poll_remove_dcb, don't fail if dcb is in NOPOLLING or in ZOMBIE states.
poll_waitevents, write EPOLLHUPs to trace log, don't even attempt to write to closed socket.
readconnection.h :
shortened comment.
readwritesplit.h :
replaced generic names with more specific ones.
httpd.c :
Check listen return value and behave accordingly.
mysql_backend.c :
Tiny clean up.
mysql_client.c :
gw_MySQLListener, Check listen return value and behave accordingly.
mysql_common.c :
Shortened a header.
telnetd.c :
telnetd_listen, check listen return value and behave accordingly.
readconnroute.c :
Tuned log writing format.
readwritesplit.c :
Added function search_backend_servers, which chooses suitable backend and master server among those known by Maxscale. Fixed clean-up routines. Not ready yet but works somehow.
testroute.c :
Cleanup.
skygw_utils.cc :
Log writing clean up.
- Checked argument types and counts
- Removed trailing line feeds
- Removed thread ids from error logs (they are used in trace / debug log
- Added some state information to dcbs
- Added prefix 'Error' or 'Fatal' to error logs.
- Switches all error logs to use flushing log write.
Reproduce #217 by connecting with telnet to debug client interface and execute command:
fail accept 23
and try to execute read query, for example, with
mysql -h 127.0.0.1 -P 4008 -u maxuser -pmaxpwd -e 'select current_user(), @@server_id'
dcb_final_free: Router session is not closed anymore when dcb is closed. Router session is shared among all dcbs and is closed and freed with session.
dcb_connect: dcb's state must be switched fro DCB_STATE_ALLOC to DCB_STATE_DISCONNECTED before dcb_final_free can be called for it.
dcb_close: poll_remove_dcb encapsulates dcb's state transition in the same way as poll_add_dcb. Removed state modification from dcb_close. Read return value of poll_remove_dcb and log accordingly.
dcb_set state: remove dassert if dcb_set_state_nomutex returned false. False can be returned indicating that intented change didn't occur but the end state, for example, may be acceptable. Failures in state transitions are asserted in dcb_Set_state_nomutex.
poll.c
poll_add_dcb: dcb state is now set here to either DCB_STATE_LISTENING or to DCB_STATE_POLLING according to dcb's role. Failures in state setting and in epoll_ctl are detected, logged and handled.
poll_remove_dcb: Failures in state setting and epoll_ctl are detected, logged, and handled.
mysql_client_server_protocol.h
Removed macros MYSQL_FAILED_AUTHENTICATION & MYSQL_SUCCESFUL_AUTHENTICATION as they were not necessary and used with constant values 0 and 1 depending on the case.
Renamed variable 'conn' to 'protocol' in cases where it meant protocol.
mysql_backend.c
gw_read_backend_event: In case when there was nothing to read or read failed, backend dcb is closed because situation is assumed to be such that backend server closed its side of the socket. Removed macros MYSQL_FAILED/SUCCESFUL_AUTHENTICATION
gw_create_backend_connection: Assigned protocol with fd which is connected to backend.
backend_write_delayqueue: In case where dcb_write fails to write anything, close backend dcb to avoid it getting hanging.
mysql_client.c
gw_read_client_event: Read return value of routeQuery and if it isn't == 1, call mysql_send_custom_error with client dcb and set client's protocol state to MYSQL_IDLE instead of MYSQL_ROUTING.
gw_MySQLAccept: Static reply counter was erroneously used as a criteria for jumping to return point where return value was constantly 'success' (=0). Replaced static reply counter with private. Fixed return value in different cases.
mysql_common.c
gw_receive_backend_auth: Changed to return boolean values indicating of success or failue. Used integers which were assigned to macroed values on the caller side. Added length check before accessing buffer.
readconnroute.c
Cut too long lines and removed statements with side effects.
skygw_debug.h
Added macro STRPROTOCOLSTATE(s) to produce string representation of a given protocol state.
If backend connection can't be created, backend_dcb is not create, router client session is not created and what already is created in session_alloc, is freed.
mysql_client.c : gw_read_client_event
If session creation failed, then - instead of sending ok to client, "failed to create new session" is sent and client dcb is closed.
: gw_MySQLAccept
removed loop where accept was called again and again. With single thread looping forever is not possible because there's no one to free previously allocated resources.
If accept fails ten times in a row, then return without new client dcb.
: dcb_alloc switched malloc to calloc, dcb->fd is initialized to -1.
: dcb_process_zombies return value of close(fd) is checked. Closed fds are stored to conn_open array.
: dcb_connect assigns new fd only if backend connection succeeds. Dcb is added to poll set in the same way, only if connect succeed.
gateway.c : conn_open array is initialized in main. For each created socket, a true is set to corresponding slot. Max. number of slots is 1024.
mysql_client_server_protocol.h : gw_do_connect_to declaration
mysql_backend.c : gw_create_backend_connection returns rv >= 0 and a protocol which is assigned to backend_dcb. In error, -1 is returned and fd is not set.
mysql_client.c : conn_open array is kept up-to-date and protocol pointer is assigned also to dcb outside mysql_protocol_init.
mysql_common.c : gw_do_connect_to_backend 3rd argument is pointer to fd, not protocol. dcb is added to poll set later in dcb_connect.
skygw_debug.h : define conn_open[1024] array where open connections can be marked in debug build.