Some read/study i'm doing about thread pool to understand what could be exposed with information_schema tables...
check if i'm grouping ("creating tables") with the right information...
-----
from your mail Vladislav:
"Global all_groups array contains all thread groups ."
=> static thread_group_t all_groups[MAX_THREAD_GROUPS];
=> static uint group_count;
"group_count" is the max value of a loop using all_groups var?
something realted to "threadpool_max_threads", with a limit of group_count<MAX_THREAD_GROUPS?
"Every thread_group_t has list of
waiting threads , called “waiting_threads”,
and queue of not yet handled requests, called “queue”
(request is represented by connection_t ),
a listener etc."
a request is a "php mysql_connect"? each new tcp/ip connection create a new request?
=> struct thread_group_t
{
mysql_mutex_t mutex;
connection_queue_t queue;
worker_list_t waiting_threads;
worker_thread_t *listener; (listener thread? maybe it have a THD and we could show the query_id/thread_id or some information?)
pthread_attr_t *pthread_attr; (what is pthread_attr? i didn't found in threadpool*)
int pollfd; (a fd to kevent and others libs?)
int thread_count; (number of threads in this thread group?!)
int active_thread_count; (active threads running this thread group?!)
int connection_count; (active connections in this thread group?!)
int io_event_count; (io event count? what is this? network io?)
int queue_event_count; (queue event count? maybe the COUNT(*) for connection_queue_t queue ?)
ulonglong last_thread_creation_time; (last thread create time, it's a unixtimestamp * 1.000.000 (us)? )
int shutdown_pipe[2]; (maybe rpc to call a server shutdown?)
bool shutdown; (shutdown information?)
bool stalled; (hum... stall (nice name), well i must study about threadpool stall yet, but i think it's a nice information to report to DBA =] )
} MY_ALIGNED(512);
I don't know yet how I_P_List<> and I_P_List_adapter<> work, but i will search about it in code... it's like a C++ object with ->legth and others easy to use tools? something like "foreach" (connection_queue_t as xxx) and interact with each connection_t inside connection_queue_t using xxx?
typedef I_P_List<connection_t,
I_P_List_adapter<connection_t,
&connection_t::next_in_queue,
&connection_t::prev_in_queue>,
I_P_List_null_counter,
I_P_List_fast_push_back<connection_t> >
=> connection_queue_t;
typedef I_P_List<worker_thread_t, I_P_List_adapter<worker_thread_t,
&worker_thread_t::next_in_list,
&worker_thread_t::prev_in_list>
>
=> worker_list_t;
---
=> struct worker_thread_t
{
ulonglong event_count; /* number of request handled by this thread */
thread_group_t* thread_group; (it's point to thread_group inside all_groups? does it have an ID about what index of all_groups we are?)
worker_thread_t *next_in_list;
worker_thread_t **prev_in_list;
mysql_cond_t cond; (what is this?)
bool woken; (what is this?)
};
=> struct connection_t
{
THD *thd;
thread_group_t *thread_group;
connection_t *next_in_queue;
connection_t **prev_in_queue;
ulonglong abs_wait_timeout; (what is this?)
bool logged_in; (hummm waiting password?)
bool bound_to_poll_descriptor; (what is this?)
bool waiting; (connection in waiting queue state?)
};
=> pthread_attr_t ??? (didn't found in threadpool* files, i will search with time about it, maybe something to linux/unix pthread lib?)
===========================================================================================================
well now i'm thinking right about information_schema tables using the variables from the top of this email... :
TABLES:
1) all_groups variable => THREADPOOL_THREAD_GROUPS table
columns:
THREAD_GROUP_ID INT NOT NULL DEFAULT 0,
THREAD_COUNT INT NOT NULL DEFAULT 0,
ACTIVE_THREAD_COUNT INT NOT NULL DEFAULT 0,
CONNECTION_COUNT INT NOT NULL DEFAULT 0,
IO_EVENT_COUNT INT NOT NULL DEFAULT 0 COMMENT "WHAT IS THIS? NETWORK I/O?",
QUEUE_EVENT_COUNT INT NOT NULL DEFAULT 0,
LAST_THREAD_CREATION_TIME DECIMAL UNSIGNED? UNIXTIMESTAMP?
SHUTDOWN ENUM('Y','N') NOT NULL DEFAULT 'N'
STALLED ENUM('Y','N') NOT NULL DEFAULT 'N'
maybe we should put information about LISTERNER_THREAD_ID (thd->query_id / thd->thread_id) ?
LISTENER_QUERY_ID BIGINT NOT NULL DEFAULT 0,
LISTENER_THREAD_ID BIGINT NOT NULL DEFAULT 0
2) connection_queue_t queue => THREADPOOL_CONNECTION_QUEUE table
columns
from queue->thd
QUERY_ID INT NOT NULL DEFAULT 0, (does it exists? or just after parser?)
THREAD_ID INT NOT NULL DEFAULT 0,
queue->thread_group
THREAD_GROUP_ID INT NOT NULL DEFAULT 0, ( i didn't found a ID for each thread_group, there's something for it? like am all_groups[] index?
queue->cond (mysql_cond_t) ??? (what is this?)
queue->woken (bool) ???? (what is this?)
3) worker_list_t waiting_threads => THREADPOOL_WAITING_THREADS table, maybe WAITING_QUEUE?
THREAD_GROUP_ID INT NOT NULL DEFAULT 0, (thread_group_t* thread_group)
EVENT_COUNT BIGINT UNSIGNED NOT NULL DEFAULT 0, (ulonglong event_count; /* number of request handled by this thread */ what is this?)
->cond (mysql_cond_t) ??? (what is this?)
->woken (bool) ???? (what is this?)
i didn't found a THD, for this (query_id/thread_id)
pthread_attr_t *pthread_attr; what is this?
something that i didn't understand yet...
for example... if i got a waiting_thread, how i know what THD or what 'worker' thread will "do the job" of this query? i know it's too fast that i will not get it with information_schema, but it's a deterministic function right? there's a pool of worker thread that handle waiting threads?
about the thread pool work... if the query is attached to one thread_group, it could 'jump' to another thread group? the "worker thread" is outside from thread group and at end of the execution it will realloc the connection to another thread_group?
if anyone have more ideas about this information tables, and where i could get information about each column, please reply with the answer or with ideas =)