mysql5/mysql-5.7.27/sql/conn_handler/socket_connection.h

183 lines
5.3 KiB
C++

/*
Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef SOCKET_CONNECTION_INCLUDED
#define SOCKET_CONNECTION_INCLUDED
#include "my_global.h" // uint
#include "my_thread.h"
#include "pfs_socket_provider.h"
#include "mysql/psi/mysql_socket.h" // MYSQL_SOCKET
#include <map>
#include <string>
#ifdef HAVE_POLL_H
#include <poll.h>
#endif
class Channel_info;
class THD;
extern const char *MY_BIND_ALL_ADDRESSES;
#ifdef HAVE_PSI_STATEMENT_INTERFACE
extern PSI_statement_info stmt_info_new_packet;
#endif
/**
Key Comparator for socket_map_t used in Mysqld_socket_listener
*/
struct Socket_lt_type
{
bool operator()(const MYSQL_SOCKET& s1, const MYSQL_SOCKET& s2) const
{
return mysql_socket_getfd(s1) < mysql_socket_getfd(s2);
}
};
/**
Typedef representing socket map type which hold the sockets and a corresponding
bool which is true if it is unix socket and false for tcp socket.
*/
typedef std::map<MYSQL_SOCKET, bool, Socket_lt_type> socket_map_t;
// iterator type for socket map type.
typedef std::map<MYSQL_SOCKET, bool, Socket_lt_type>::iterator
socket_map_iterator_t;
/**
This class represents the Mysqld_socket_listener which prepare the
listener sockets to recieve connection events from the client. The
Mysqld_socket_listener may be composed of either or both a tcp socket
which listen on a default mysqld tcp port or a user specified port
via mysqld command-line and a unix socket which is bind to a mysqld
defaul pathname.
*/
class Mysqld_socket_listener
{
std::string m_bind_addr_str; // IP address string
uint m_tcp_port; // TCP port to bind to
uint m_backlog; // backlog specifying length of pending connection queue
uint m_port_timeout; // port timeout value
std::string m_unix_sockname; // unix socket pathname to bind to
bool m_unlink_sockname; // Unlink socket & lock file if true.
/*
Map indexed by MYSQL socket fds and correspoding bool to distinguish
between unix and tcp socket.
*/
socket_map_t m_socket_map; // map indexed by mysql socket fd and index
uint m_error_count; // Internal variable for maintaining error count.
#ifdef HAVE_POLL
static const int MAX_SOCKETS=2;
struct poll_info_t
{
struct pollfd m_fds[MAX_SOCKETS];
MYSQL_SOCKET m_pfs_fds[MAX_SOCKETS];
};
// poll related info. used in poll for listening to connection events.
poll_info_t m_poll_info;
#else
struct select_info_t
{
fd_set m_read_fds,m_client_fds;
my_socket m_max_used_connection;
select_info_t() : m_max_used_connection(0)
{ FD_ZERO(&m_client_fds); }
};
// select info for used in select for listening to connection events.
select_info_t m_select_info;
#endif // HAVE_POLL
#ifdef HAVE_LIBWRAP
const char *m_libwrap_name;
int m_deny_severity;
#endif
/** Number of connection errors when selecting on the listening port */
static ulong connection_errors_select;
/** Number of connection errors when accepting sockets in the listening port. */
static ulong connection_errors_accept;
/** Number of connection errors from TCP wrappers. */
static ulong connection_errors_tcpwrap;
public:
static ulong get_connection_errors_select()
{
return connection_errors_select;
}
static ulong get_connection_errors_accept()
{
return connection_errors_accept;
}
static ulong get_connection_errors_tcpwrap()
{
return connection_errors_tcpwrap;
}
/**
Constructor to setup a listener for listen to connect events from
clients.
@param bind_addr_str IP address used in bind
@param tcp_port TCP port to bind to
@param backlog backlog specifying length of pending
connection queue used in listen.
@param port_timeout portname.
@param unix_sockname pathname for unix socket to bind to
*/
Mysqld_socket_listener(std::string bind_addr_str, uint tcp_port,
uint backlog, uint port_timeout,
std::string unix_sockname);
/**
Set up a listener - set of sockets to listen for connection events
from clients.
@retval false listener sockets setup to be used to listen for connect events
true failure in setting up the listener.
*/
bool setup_listener();
/**
The body of the event loop that listen for connection events from clients.
@retval Channel_info Channel_info object abstracting the connected client
details for processing this connection.
*/
Channel_info* listen_for_connection_event();
/**
Close the listener.
*/
void close_listener();
~Mysqld_socket_listener()
{
if (!m_socket_map.empty())
close_listener();
}
};
#endif // SOCKET_CONNECTION_INCLUDED.