2017-06-24 14:57:55 +00:00
|
|
|
|
|
|
|
/*
|
2018-03-12 14:03:15 +00:00
|
|
|
* Odyssey.
|
2017-06-24 14:57:55 +00:00
|
|
|
*
|
2018-04-04 13:19:58 +00:00
|
|
|
* Scalable PostgreSQL connection pooler.
|
2020-04-02 11:00:56 +00:00
|
|
|
*/
|
2017-06-24 14:57:55 +00:00
|
|
|
|
2020-11-27 18:03:42 +00:00
|
|
|
#include <kiwi.h>
|
|
|
|
#include <machinarium.h>
|
|
|
|
#include <odyssey.h>
|
2017-06-24 14:57:55 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
enum { OD_LKILL_CLIENT,
|
|
|
|
OD_LRELOAD,
|
|
|
|
OD_LSHOW,
|
|
|
|
OD_LSTATS,
|
|
|
|
OD_LSERVERS,
|
|
|
|
OD_LCLIENTS,
|
|
|
|
OD_LLISTS,
|
|
|
|
OD_LSET,
|
|
|
|
OD_LCREATE,
|
|
|
|
OD_LDROP,
|
|
|
|
OD_LPOOLS,
|
|
|
|
OD_LPOOLS_EXTENDED,
|
|
|
|
OD_LDATABASES,
|
|
|
|
OD_LMODULE,
|
|
|
|
OD_LERRORS,
|
|
|
|
OD_LERRORS_PER_ROUTE,
|
|
|
|
OD_LFRONTEND,
|
|
|
|
OD_LROUTER,
|
|
|
|
OD_LVERSION,
|
2017-08-07 14:45:22 +00:00
|
|
|
};
|
|
|
|
|
2020-04-02 11:00:56 +00:00
|
|
|
static od_keyword_t od_console_keywords[] = {
|
|
|
|
od_keyword("kill_client", OD_LKILL_CLIENT),
|
2020-05-25 09:47:13 +00:00
|
|
|
od_keyword("reload", OD_LRELOAD),
|
2020-04-02 11:00:56 +00:00
|
|
|
od_keyword("show", OD_LSHOW),
|
|
|
|
od_keyword("stats", OD_LSTATS),
|
|
|
|
od_keyword("servers", OD_LSERVERS),
|
|
|
|
od_keyword("clients", OD_LCLIENTS),
|
|
|
|
od_keyword("lists", OD_LLISTS),
|
|
|
|
od_keyword("set", OD_LSET),
|
|
|
|
od_keyword("pools", OD_LPOOLS),
|
2020-03-18 05:12:53 +00:00
|
|
|
od_keyword("pools_extended", OD_LPOOLS_EXTENDED),
|
2020-04-02 11:00:56 +00:00
|
|
|
od_keyword("databases", OD_LDATABASES),
|
2020-06-09 09:19:11 +00:00
|
|
|
od_keyword("create", OD_LCREATE),
|
|
|
|
od_keyword("module", OD_LMODULE),
|
2020-07-08 06:26:17 +00:00
|
|
|
od_keyword("errors", OD_LERRORS),
|
2020-09-02 16:13:50 +00:00
|
|
|
od_keyword("errors_per_route", OD_LERRORS_PER_ROUTE),
|
2020-07-08 06:26:17 +00:00
|
|
|
od_keyword("frontend", OD_LFRONTEND),
|
|
|
|
od_keyword("router", OD_LROUTER),
|
2020-06-09 09:19:11 +00:00
|
|
|
od_keyword("drop", OD_LDROP),
|
2020-07-27 07:24:25 +00:00
|
|
|
od_keyword("version", OD_LVERSION),
|
2017-08-07 14:45:22 +00:00
|
|
|
{ 0, 0, 0 }
|
|
|
|
};
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_stats_add(machine_msg_t *stream,
|
|
|
|
char *database, int database_len,
|
|
|
|
od_stat_t *total, od_stat_t *avg)
|
2017-08-11 15:19:29 +00:00
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
assert(stream);
|
2019-01-23 15:43:52 +00:00
|
|
|
int offset;
|
2018-08-28 14:43:46 +00:00
|
|
|
machine_msg_t *msg;
|
2019-01-23 15:43:52 +00:00
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
2018-08-28 14:43:46 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-11 15:37:41 +00:00
|
|
|
int rc;
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, database, database_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-11 15:37:41 +00:00
|
|
|
char data[64];
|
2020-04-02 11:00:56 +00:00
|
|
|
int data_len;
|
2018-04-02 12:41:59 +00:00
|
|
|
/* total_xact_count */
|
2018-04-03 12:03:12 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, total->count_tx);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2018-04-02 12:41:59 +00:00
|
|
|
/* total_query_count */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len =
|
|
|
|
od_snprintf(data, sizeof(data), "%" PRIu64, total->count_query);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-11 15:19:29 +00:00
|
|
|
/* total_received */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len =
|
|
|
|
od_snprintf(data, sizeof(data), "%" PRIu64, total->recv_client);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-11 15:19:29 +00:00
|
|
|
/* total_sent */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len =
|
|
|
|
od_snprintf(data, sizeof(data), "%" PRIu64, total->recv_server);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2018-04-02 12:41:59 +00:00
|
|
|
/* total_xact_time */
|
2018-08-01 15:10:44 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, total->tx_time);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-11 15:19:29 +00:00
|
|
|
/* total_query_time */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len =
|
|
|
|
od_snprintf(data, sizeof(data), "%" PRIu64, total->query_time);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2018-04-02 12:41:59 +00:00
|
|
|
/* total_wait_time */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2018-04-02 12:41:59 +00:00
|
|
|
/* avg_xact_count */
|
2018-04-03 12:03:12 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, avg->count_tx);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2018-04-02 12:41:59 +00:00
|
|
|
/* avg_query_count */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len =
|
|
|
|
od_snprintf(data, sizeof(data), "%" PRIu64, avg->count_query);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-11 15:19:29 +00:00
|
|
|
/* avg_recv */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len =
|
|
|
|
od_snprintf(data, sizeof(data), "%" PRIu64, avg->recv_client);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-11 15:19:29 +00:00
|
|
|
/* avg_sent */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len =
|
|
|
|
od_snprintf(data, sizeof(data), "%" PRIu64, avg->recv_server);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2018-04-02 12:41:59 +00:00
|
|
|
/* avg_xact_time */
|
2018-08-01 15:10:44 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, avg->tx_time);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2018-04-02 12:41:59 +00:00
|
|
|
/* avg_query_time */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, avg->query_time);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2018-04-02 12:41:59 +00:00
|
|
|
/* avg_wait_time */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-11 15:19:29 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-07-08 06:26:17 +00:00
|
|
|
static inline od_retcode_t
|
|
|
|
od_console_show_frontend_stats_err_add(machine_msg_t *stream,
|
2020-12-28 10:43:31 +00:00
|
|
|
od_route_pool_t *route_pool)
|
2020-07-08 06:26:17 +00:00
|
|
|
{
|
|
|
|
assert(stream);
|
|
|
|
|
|
|
|
for (size_t i = 0; i < OD_FRONTEND_STATUS_ERRORS_TYPES_COUNT; ++i) {
|
|
|
|
int offset;
|
|
|
|
int rc;
|
|
|
|
machine_msg_t *msg;
|
|
|
|
|
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
|
|
|
if (msg == NULL)
|
|
|
|
return NOT_OK_RESPONSE;
|
|
|
|
|
2020-07-17 09:17:29 +00:00
|
|
|
size_t total_count = od_err_logger_get_aggr_errors_count(
|
2020-12-28 10:43:31 +00:00
|
|
|
route_pool->err_logger, od_frontend_status_errs[i]);
|
2020-07-08 06:26:17 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
char *err_type =
|
|
|
|
od_frontend_status_to_str(od_frontend_status_errs[i]);
|
2020-07-08 06:26:17 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, err_type,
|
|
|
|
strlen(err_type));
|
2020-07-08 06:26:17 +00:00
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
char data[64];
|
|
|
|
int data_len;
|
|
|
|
/* error_type */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64,
|
|
|
|
total_count);
|
2020-07-08 06:26:17 +00:00
|
|
|
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return OK_RESPONSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int
|
|
|
|
od_console_show_router_stats_err_add(machine_msg_t *stream,
|
2020-12-28 10:43:31 +00:00
|
|
|
od_error_logger_t *err_logger)
|
2020-07-08 06:26:17 +00:00
|
|
|
{
|
|
|
|
assert(stream);
|
|
|
|
|
|
|
|
for (size_t i = 0; i < OD_ROUTER_STATUS_ERRORS_TYPES_COUNT; ++i) {
|
|
|
|
int offset;
|
|
|
|
int rc;
|
|
|
|
machine_msg_t *msg;
|
|
|
|
|
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
2020-11-25 10:17:15 +00:00
|
|
|
if (msg == NULL) {
|
2020-07-08 06:26:17 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2020-11-25 10:17:15 +00:00
|
|
|
}
|
2020-07-08 06:26:17 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
char *err_type =
|
|
|
|
od_router_status_to_str(od_router_status_errs[i]);
|
2020-07-08 06:26:17 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, err_type,
|
|
|
|
strlen(err_type));
|
2020-07-08 06:26:17 +00:00
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
2020-11-25 10:17:15 +00:00
|
|
|
|
|
|
|
/* error_type */
|
2020-07-08 06:26:17 +00:00
|
|
|
char data[64];
|
|
|
|
int data_len;
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64,
|
|
|
|
od_err_logger_get_aggr_errors_count(
|
|
|
|
err_logger,
|
|
|
|
od_router_status_errs[i]));
|
2020-07-08 06:26:17 +00:00
|
|
|
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return OK_RESPONSE;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static int od_console_show_stats_cb(char *database, int database_len,
|
|
|
|
od_stat_t *total, od_stat_t *avg,
|
|
|
|
void **argv)
|
2017-08-11 15:19:29 +00:00
|
|
|
{
|
2019-01-23 15:43:52 +00:00
|
|
|
machine_msg_t *stream = argv[0];
|
2020-12-28 10:43:31 +00:00
|
|
|
return od_console_show_stats_add(stream, database, database_len, total,
|
|
|
|
avg);
|
2017-08-11 15:19:29 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static int od_console_show_err_frontend_stats_cb(od_route_pool_t *pool,
|
|
|
|
void **argv)
|
2020-07-08 06:26:17 +00:00
|
|
|
{
|
|
|
|
machine_msg_t *stream = argv[0];
|
|
|
|
return od_console_show_frontend_stats_err_add(stream, pool);
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static int od_console_show_err_router_stats_cb(od_error_logger_t *l,
|
|
|
|
void **argv)
|
2020-07-08 06:26:17 +00:00
|
|
|
{
|
|
|
|
machine_msg_t *stream = argv[0];
|
|
|
|
return od_console_show_router_stats_err_add(stream, l);
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_stats(od_client_t *client,
|
|
|
|
machine_msg_t *stream)
|
2017-08-11 15:19:29 +00:00
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
assert(stream);
|
2018-03-13 13:17:27 +00:00
|
|
|
od_router_t *router = client->global->router;
|
2020-12-28 10:43:31 +00:00
|
|
|
od_cron_t *cron = client->global->cron;
|
2018-08-02 16:02:02 +00:00
|
|
|
|
2018-08-28 14:43:46 +00:00
|
|
|
machine_msg_t *msg;
|
2020-12-28 10:43:31 +00:00
|
|
|
msg = kiwi_be_write_row_descriptionf(
|
|
|
|
stream, "sllllllllllllll", "database", "total_xact_count",
|
|
|
|
"total_query_count", "total_received", "total_sent",
|
|
|
|
"total_xact_time", "total_query_time", "total_wait_time",
|
|
|
|
"avg_xact_count", "avg_query_count", "avg_recv", "avg_sent",
|
|
|
|
"avg_xact_time", "avg_query_time", "avg_wait_time");
|
2018-08-28 14:43:46 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2018-08-28 14:43:46 +00:00
|
|
|
|
2019-01-23 15:43:52 +00:00
|
|
|
void *argv[] = { stream };
|
2020-12-28 10:43:31 +00:00
|
|
|
od_route_pool_stat_database(&router->route_pool,
|
|
|
|
od_console_show_stats_cb,
|
|
|
|
cron->stat_time_us, argv);
|
2018-12-06 14:23:15 +00:00
|
|
|
|
2020-07-08 06:26:17 +00:00
|
|
|
int rc = kiwi_be_write_complete(stream, "SHOW", 5);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE) {
|
2020-07-08 06:26:17 +00:00
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline od_retcode_t od_console_show_errors(od_client_t *client,
|
|
|
|
machine_msg_t *stream)
|
2020-07-08 06:26:17 +00:00
|
|
|
{
|
|
|
|
assert(stream);
|
|
|
|
od_router_t *router = client->global->router;
|
|
|
|
|
|
|
|
void *argv[] = { stream };
|
|
|
|
|
|
|
|
machine_msg_t *msg;
|
2020-12-28 10:43:31 +00:00
|
|
|
msg = kiwi_be_write_row_descriptionf(stream, "sl", "error_type",
|
|
|
|
"count");
|
2020-07-08 06:26:17 +00:00
|
|
|
|
2020-11-25 10:17:15 +00:00
|
|
|
if (msg == NULL) {
|
2020-07-08 06:26:17 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2020-11-25 10:17:15 +00:00
|
|
|
}
|
2020-07-08 06:26:17 +00:00
|
|
|
|
|
|
|
int rc;
|
|
|
|
rc = od_route_pool_stat_err_router(
|
2020-12-28 10:43:31 +00:00
|
|
|
router, od_console_show_err_router_stats_cb, argv);
|
2020-07-08 06:26:17 +00:00
|
|
|
|
|
|
|
if (rc != OK_RESPONSE)
|
|
|
|
return rc;
|
|
|
|
|
|
|
|
rc = od_route_pool_stat_err_frontend(
|
2020-12-28 10:43:31 +00:00
|
|
|
&router->route_pool, od_console_show_err_frontend_stats_cb,
|
|
|
|
argv);
|
2020-07-08 06:26:17 +00:00
|
|
|
|
|
|
|
if (rc != OK_RESPONSE)
|
|
|
|
return rc;
|
|
|
|
|
|
|
|
rc = kiwi_be_write_complete(stream, "SHOW", 5);
|
|
|
|
return rc;
|
2017-08-15 13:49:39 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_errors_per_route_cb(od_route_t *route,
|
|
|
|
void **argv)
|
2020-09-02 16:13:50 +00:00
|
|
|
{
|
|
|
|
machine_msg_t *stream = argv[0];
|
|
|
|
assert(stream);
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
if (!route || !route->extra_logging_enabled ||
|
|
|
|
od_route_is_dynamic(route)) {
|
2020-09-02 16:13:50 +00:00
|
|
|
return OK_RESPONSE;
|
|
|
|
}
|
2020-11-25 10:17:15 +00:00
|
|
|
|
2020-09-02 16:13:50 +00:00
|
|
|
for (size_t i = 0; i < OD_FRONTEND_STATUS_ERRORS_TYPES_COUNT; ++i) {
|
|
|
|
int offset;
|
|
|
|
int rc;
|
|
|
|
machine_msg_t *msg;
|
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
2020-11-25 10:17:15 +00:00
|
|
|
if (msg == NULL) {
|
|
|
|
/* message was not successfully allocated */
|
2020-09-02 16:13:50 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2020-11-25 10:17:15 +00:00
|
|
|
}
|
2020-09-02 16:13:50 +00:00
|
|
|
|
|
|
|
size_t total_count = od_err_logger_get_aggr_errors_count(
|
2020-12-28 10:43:31 +00:00
|
|
|
route->err_logger, od_frontend_status_errs[i]);
|
2020-09-02 16:13:50 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
char *err_type =
|
|
|
|
od_frontend_status_to_str(od_frontend_status_errs[i]);
|
2020-09-02 16:13:50 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, err_type,
|
|
|
|
strlen(err_type));
|
2020-11-25 10:17:15 +00:00
|
|
|
|
2020-09-02 16:13:50 +00:00
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* route user */
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset,
|
|
|
|
route->rule->user_name,
|
|
|
|
strlen(route->rule->user_name));
|
2020-09-02 16:13:50 +00:00
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* route database */
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset,
|
|
|
|
route->rule->db_name,
|
|
|
|
strlen(route->rule->db_name));
|
2020-09-02 16:13:50 +00:00
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* error_type */
|
|
|
|
|
|
|
|
char data[64];
|
|
|
|
int data_len;
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64,
|
|
|
|
total_count);
|
2020-09-02 16:13:50 +00:00
|
|
|
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (size_t i = 0; i < OD_ROUTER_ROUTE_STATUS_ERRORS_TYPES_COUNT; ++i) {
|
|
|
|
int offset;
|
|
|
|
int rc;
|
|
|
|
machine_msg_t *msg;
|
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
|
|
|
if (msg == NULL)
|
|
|
|
return NOT_OK_RESPONSE;
|
|
|
|
|
|
|
|
size_t total_count = od_err_logger_get_aggr_errors_count(
|
2020-12-28 10:43:31 +00:00
|
|
|
route->err_logger, od_router_route_status_errs[i]);
|
2020-09-02 16:13:50 +00:00
|
|
|
|
|
|
|
char *err_type =
|
2020-12-28 10:43:31 +00:00
|
|
|
od_router_status_to_str(od_router_route_status_errs[i]);
|
2020-09-02 16:13:50 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, err_type,
|
|
|
|
strlen(err_type));
|
2020-09-02 16:13:50 +00:00
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* route user */
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset,
|
|
|
|
route->rule->user_name,
|
|
|
|
strlen(route->rule->user_name));
|
2020-09-02 16:13:50 +00:00
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* route database */
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset,
|
|
|
|
route->rule->db_name,
|
|
|
|
strlen(route->rule->db_name));
|
2020-09-02 16:13:50 +00:00
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* error_type */
|
|
|
|
|
|
|
|
char data[64];
|
|
|
|
int data_len;
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64,
|
|
|
|
total_count);
|
2020-09-02 16:13:50 +00:00
|
|
|
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc != OK_RESPONSE) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return OK_RESPONSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline od_retcode_t
|
|
|
|
od_console_show_errors_per_route(od_client_t *client, machine_msg_t *stream)
|
|
|
|
{
|
|
|
|
assert(stream);
|
|
|
|
od_router_t *router = client->global->router;
|
|
|
|
|
|
|
|
void *argv[] = { stream };
|
|
|
|
|
|
|
|
machine_msg_t *msg;
|
2020-12-28 10:43:31 +00:00
|
|
|
msg = kiwi_be_write_row_descriptionf(stream, "sssl", "error_type",
|
|
|
|
"user", "database", "count");
|
2020-09-02 16:13:50 +00:00
|
|
|
|
|
|
|
if (msg == NULL) {
|
|
|
|
return NOT_OK_RESPONSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
od_router_foreach(router, od_console_show_errors_per_route_cb, argv);
|
|
|
|
|
|
|
|
od_retcode_t rc = kiwi_be_write_complete(stream, "SHOW", 5);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_version(machine_msg_t *stream)
|
2020-07-27 07:24:25 +00:00
|
|
|
{
|
|
|
|
assert(stream);
|
|
|
|
|
|
|
|
machine_msg_t *msg;
|
|
|
|
msg = kiwi_be_write_row_descriptionf(stream, "s", "version");
|
|
|
|
|
|
|
|
if (msg == NULL)
|
|
|
|
return NOT_OK_RESPONSE;
|
|
|
|
int offset;
|
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
|
|
|
if (msg == NULL)
|
|
|
|
return NOT_OK_RESPONSE;
|
|
|
|
|
|
|
|
char data[128];
|
|
|
|
int data_len;
|
|
|
|
/* current version and build */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len =
|
|
|
|
od_snprintf(data, sizeof(data), "%s-%s-%s", OD_VERSION_NUMBER,
|
|
|
|
OD_VERSION_GIT, OD_VERSION_BUILD);
|
2020-07-27 07:24:25 +00:00
|
|
|
|
|
|
|
int rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc != OK_RESPONSE)
|
|
|
|
return rc;
|
|
|
|
|
|
|
|
rc = kiwi_be_write_complete(stream, "SHOW", 5);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2020-12-14 13:18:37 +00:00
|
|
|
static inline od_retcode_t
|
2020-12-28 10:43:31 +00:00
|
|
|
od_console_show_quantiles(machine_msg_t *stream, int offset,
|
|
|
|
const int quantiles_count, const double *quantiles,
|
|
|
|
td_histogram_t *transactions_hgram,
|
|
|
|
td_histogram_t *queries_hgram)
|
2020-12-14 13:18:37 +00:00
|
|
|
{
|
|
|
|
char data[64];
|
|
|
|
int data_len;
|
2020-12-15 11:33:43 +00:00
|
|
|
int rc = OK_RESPONSE;
|
2020-12-14 13:18:37 +00:00
|
|
|
for (int i = 0; i < quantiles_count; i++) {
|
|
|
|
double q = quantiles[i];
|
|
|
|
/* query quantile */
|
2020-12-28 10:43:31 +00:00
|
|
|
double query_quantile = td_value_at(queries_hgram, q);
|
|
|
|
double transaction_quantile =
|
|
|
|
td_value_at(transactions_hgram, q);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (isnan(query_quantile)) {
|
|
|
|
query_quantile = 0;
|
|
|
|
}
|
|
|
|
if (isnan(transaction_quantile)) {
|
|
|
|
transaction_quantile = 0;
|
|
|
|
}
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64,
|
|
|
|
(uint64_t)query_quantile);
|
2020-12-14 13:18:37 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return rc;
|
|
|
|
/* transaction quantile */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64,
|
|
|
|
(uint64_t)transaction_quantile);
|
2020-12-14 13:18:37 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return rc;
|
|
|
|
}
|
2020-12-15 11:33:43 +00:00
|
|
|
return rc;
|
2020-12-14 13:18:37 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_pools_add_cb(od_route_t *route, void **argv)
|
2018-12-21 10:08:53 +00:00
|
|
|
{
|
2019-01-23 15:43:52 +00:00
|
|
|
int offset;
|
2020-12-28 10:43:31 +00:00
|
|
|
machine_msg_t *stream = argv[0];
|
|
|
|
bool *extended = argv[1];
|
|
|
|
double *quantiles = argv[2];
|
|
|
|
int *quantiles_count = argv[3];
|
2020-12-14 13:18:37 +00:00
|
|
|
td_histogram_t *common_transactions_hgram = argv[4];
|
2020-12-28 10:43:31 +00:00
|
|
|
td_histogram_t *common_queries_hgram = argv[5];
|
2020-12-14 13:18:37 +00:00
|
|
|
|
2018-12-21 10:08:53 +00:00
|
|
|
machine_msg_t *msg;
|
2020-05-28 06:12:10 +00:00
|
|
|
td_histogram_t *transactions_hgram = NULL;
|
2020-12-28 10:43:31 +00:00
|
|
|
td_histogram_t *queries_hgram = NULL;
|
|
|
|
td_histogram_t *freeze_hgram = NULL;
|
2019-01-23 15:43:52 +00:00
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2018-12-21 10:08:53 +00:00
|
|
|
|
|
|
|
od_route_lock(route);
|
|
|
|
int rc;
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, route->id.database,
|
|
|
|
route->id.database_len - 1);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, route->id.user,
|
|
|
|
route->id.user_len - 1);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
|
|
|
char data[64];
|
2020-04-02 11:00:56 +00:00
|
|
|
int data_len;
|
2018-12-21 10:08:53 +00:00
|
|
|
|
|
|
|
/* cl_active */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%d",
|
|
|
|
route->client_pool.count_active);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
|
|
|
/* cl_waiting */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%d",
|
|
|
|
route->client_pool.count_pending);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
|
|
|
/* sv_active */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%d",
|
|
|
|
route->server_pool.count_active);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
|
|
|
/* sv_idle */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%d",
|
|
|
|
route->server_pool.count_idle);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
|
|
|
/* sv_used */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
|
|
|
/* sv_tested */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
|
|
|
/* sv_login */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
|
|
|
/* maxwait */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
|
|
|
/* maxwait_us */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* pool_mode */
|
|
|
|
rc = -1;
|
|
|
|
if (route->rule->pool == OD_RULE_POOL_SESSION)
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, "session", 7);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (route->rule->pool == OD_RULE_POOL_TRANSACTION)
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, "transaction",
|
|
|
|
11);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2018-12-21 10:08:53 +00:00
|
|
|
goto error;
|
|
|
|
|
2020-03-18 05:12:53 +00:00
|
|
|
if (*extended) {
|
2020-04-02 11:00:56 +00:00
|
|
|
/* bytes recived */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64,
|
|
|
|
route->stats.recv_client);
|
2020-04-02 11:00:56 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-04-02 11:00:56 +00:00
|
|
|
goto error;
|
|
|
|
/* bytes sent */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64,
|
|
|
|
route->stats.recv_server);
|
2020-04-02 11:00:56 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-04-02 11:00:56 +00:00
|
|
|
goto error;
|
2020-08-10 09:49:57 +00:00
|
|
|
|
|
|
|
/* tcp conn rate */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64,
|
|
|
|
route->tcp_connections);
|
2020-08-10 09:49:57 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-08-10 09:49:57 +00:00
|
|
|
goto error;
|
|
|
|
|
2020-05-28 06:12:10 +00:00
|
|
|
transactions_hgram = td_new(QUANTILES_COMPRESSION);
|
2020-12-28 10:43:31 +00:00
|
|
|
queries_hgram = td_new(QUANTILES_COMPRESSION);
|
|
|
|
freeze_hgram = td_new(QUANTILES_COMPRESSION);
|
2020-05-28 06:12:10 +00:00
|
|
|
if (route->stats.enable_quantiles) {
|
|
|
|
for (size_t i = 0; i < QUANTILES_WINDOW; ++i) {
|
2020-12-28 10:43:31 +00:00
|
|
|
td_copy(freeze_hgram,
|
|
|
|
route->stats.transaction_hgram[i]);
|
2020-05-28 06:12:10 +00:00
|
|
|
td_merge(transactions_hgram, freeze_hgram);
|
2020-12-28 10:43:31 +00:00
|
|
|
td_copy(freeze_hgram,
|
|
|
|
route->stats.query_hgram[i]);
|
2020-05-28 06:12:10 +00:00
|
|
|
td_merge(queries_hgram, freeze_hgram);
|
|
|
|
}
|
2020-12-14 13:18:37 +00:00
|
|
|
td_merge(common_transactions_hgram, transactions_hgram);
|
|
|
|
td_merge(common_queries_hgram, queries_hgram);
|
2020-05-28 06:12:10 +00:00
|
|
|
}
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = od_console_show_quantiles(stream, offset, *quantiles_count,
|
|
|
|
quantiles, transactions_hgram,
|
|
|
|
queries_hgram);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE) {
|
|
|
|
goto error;
|
2020-04-02 11:00:56 +00:00
|
|
|
}
|
|
|
|
}
|
2020-05-28 06:12:10 +00:00
|
|
|
td_safe_free(transactions_hgram);
|
|
|
|
td_safe_free(queries_hgram);
|
|
|
|
td_safe_free(freeze_hgram);
|
2018-12-21 10:08:53 +00:00
|
|
|
od_route_unlock(route);
|
|
|
|
return 0;
|
|
|
|
error:
|
2020-05-28 06:12:10 +00:00
|
|
|
td_safe_free(transactions_hgram);
|
|
|
|
td_safe_free(queries_hgram);
|
|
|
|
td_safe_free(freeze_hgram);
|
2018-12-21 10:08:53 +00:00
|
|
|
od_route_unlock(route);
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2018-12-21 10:08:53 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_databases_add_cb(od_route_t *route,
|
|
|
|
void **argv)
|
2020-01-28 09:41:25 +00:00
|
|
|
{
|
|
|
|
int offset;
|
|
|
|
machine_msg_t *stream = argv[0];
|
|
|
|
machine_msg_t *msg;
|
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2020-01-28 09:41:25 +00:00
|
|
|
|
|
|
|
od_route_lock(route);
|
|
|
|
int rc;
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, route->id.database,
|
|
|
|
route->id.database_len - 1);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
2020-12-28 10:43:31 +00:00
|
|
|
od_rule_t *rule = route->rule;
|
2020-01-28 09:41:25 +00:00
|
|
|
od_rule_storage_t *storage = rule->storage;
|
|
|
|
|
|
|
|
char *host = storage->host;
|
2020-11-23 09:13:28 +00:00
|
|
|
if (!host) {
|
2020-01-28 09:41:25 +00:00
|
|
|
host = "";
|
2020-11-23 09:13:28 +00:00
|
|
|
}
|
|
|
|
|
2020-04-02 11:00:56 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, host, strlen(host));
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE) {
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
2020-11-23 09:13:28 +00:00
|
|
|
}
|
|
|
|
|
2020-01-28 09:41:25 +00:00
|
|
|
char data[64];
|
2020-04-02 11:00:56 +00:00
|
|
|
int data_len;
|
2020-01-28 09:41:25 +00:00
|
|
|
|
|
|
|
/* port */
|
2020-06-14 16:43:37 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%d", storage->port);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* database */
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, rule->db_name,
|
|
|
|
rule->db_name_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* force_user */
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, "", 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* pool_size */
|
2020-06-14 16:43:37 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%d", rule->pool_size);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* reserve_pool */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* pool_mode */
|
|
|
|
rc = -1;
|
|
|
|
if (rule->pool == OD_RULE_POOL_SESSION)
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, "session", 7);
|
|
|
|
if (rule->pool == OD_RULE_POOL_TRANSACTION)
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, "transaction",
|
|
|
|
11);
|
2020-11-23 09:13:28 +00:00
|
|
|
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE) {
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
2020-11-23 09:13:28 +00:00
|
|
|
}
|
2020-01-28 09:41:25 +00:00
|
|
|
|
|
|
|
/* max_connections */
|
2020-06-14 16:43:37 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%d", rule->client_max);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* current_connections */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%d",
|
|
|
|
route->client_pool.count_active +
|
|
|
|
route->client_pool.count_pending +
|
|
|
|
route->client_pool.count_queue);
|
2020-11-23 09:13:28 +00:00
|
|
|
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* paused */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* disabled */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2020-01-28 09:41:25 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
od_route_unlock(route);
|
|
|
|
return 0;
|
2020-04-02 11:00:56 +00:00
|
|
|
error:
|
2020-01-28 09:41:25 +00:00
|
|
|
od_route_unlock(route);
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2020-01-28 09:41:25 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_databases(od_client_t *client,
|
|
|
|
machine_msg_t *stream)
|
2020-01-28 09:41:25 +00:00
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
assert(stream);
|
2020-01-28 09:41:25 +00:00
|
|
|
od_router_t *router = client->global->router;
|
|
|
|
|
|
|
|
machine_msg_t *msg;
|
2020-12-28 10:43:31 +00:00
|
|
|
msg = kiwi_be_write_row_descriptionf(
|
|
|
|
stream, "sslssllsllll", "name", "host", "port", "database",
|
|
|
|
"force_user", "pool_size", "reserve_pool", "pool_mode",
|
|
|
|
"max_connections", "current_connections", "paused", "disabled");
|
2020-01-28 09:41:25 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2020-01-28 09:41:25 +00:00
|
|
|
|
|
|
|
void *argv[] = { stream };
|
|
|
|
int rc;
|
|
|
|
rc = od_router_foreach(router, od_console_show_databases_add_cb, argv);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-01-28 09:41:25 +00:00
|
|
|
|
2020-02-18 13:05:02 +00:00
|
|
|
return kiwi_be_write_complete(stream, "SHOW", 5);
|
2020-01-28 09:41:25 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_pools(od_client_t *client,
|
|
|
|
machine_msg_t *stream, bool extended)
|
2018-12-21 10:08:53 +00:00
|
|
|
{
|
2020-03-18 05:12:53 +00:00
|
|
|
assert(stream);
|
|
|
|
int rc;
|
2018-12-21 10:08:53 +00:00
|
|
|
od_router_t *router = client->global->router;
|
2020-12-28 10:43:31 +00:00
|
|
|
od_route_t *route = client->route;
|
|
|
|
double *quantiles = route->rule->quantiles;
|
2020-03-18 05:12:53 +00:00
|
|
|
int quantiles_count = route->rule->quantiles_count;
|
2018-12-21 10:08:53 +00:00
|
|
|
|
|
|
|
machine_msg_t *msg;
|
2020-12-28 10:43:31 +00:00
|
|
|
msg = kiwi_be_write_row_descriptionf(stream, "ssllllllllls", "database",
|
|
|
|
"user", "cl_active", "cl_waiting",
|
|
|
|
"sv_active", "sv_idle", "sv_used",
|
|
|
|
"sv_tested", "sv_login", "maxwait",
|
|
|
|
"maxwait_us", "pool_mode");
|
2018-12-21 10:08:53 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2018-12-21 10:08:53 +00:00
|
|
|
|
2020-03-18 05:12:53 +00:00
|
|
|
if (extended) {
|
2020-04-02 11:00:56 +00:00
|
|
|
char *bytes_rcv = "bytes_recieved";
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_row_description_add(msg, 0, bytes_rcv,
|
|
|
|
strlen(bytes_rcv), 0, 0,
|
|
|
|
23 /* INT4OID */, 4, 0,
|
|
|
|
0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-04-02 11:00:56 +00:00
|
|
|
char *bytes_sent = "bytes_sent";
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_row_description_add(msg, 0, bytes_sent,
|
|
|
|
strlen(bytes_sent), 0, 0,
|
|
|
|
23 /* INT4OID */, 4, 0,
|
|
|
|
0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-04-02 11:00:56 +00:00
|
|
|
|
2020-08-10 09:49:57 +00:00
|
|
|
char *tcp_conn_rate = "tcp_conn_count";
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_row_description_add(msg, 0, tcp_conn_rate,
|
|
|
|
strlen(tcp_conn_rate), 0,
|
|
|
|
0, 23 /* INT4OID */, 4,
|
|
|
|
0, 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-08-10 09:49:57 +00:00
|
|
|
|
2020-04-02 11:00:56 +00:00
|
|
|
for (int i = 0; i < quantiles_count; i++) {
|
|
|
|
char caption[KIWI_MAX_VAR_SIZE];
|
|
|
|
int caption_len;
|
2020-12-28 10:43:31 +00:00
|
|
|
caption_len = od_snprintf(caption, sizeof(caption),
|
|
|
|
"query_%.6g", quantiles[i]);
|
2020-04-02 11:00:56 +00:00
|
|
|
rc = kiwi_be_write_row_description_add(
|
2020-12-28 10:43:31 +00:00
|
|
|
msg, 0, caption, caption_len, 0, 0,
|
|
|
|
23 /* INT4OID */, 4, 0, 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-12-28 10:43:31 +00:00
|
|
|
caption_len =
|
|
|
|
od_snprintf(caption, sizeof(caption),
|
|
|
|
"transaction_%.6g", quantiles[i]);
|
2020-04-02 11:00:56 +00:00
|
|
|
rc = kiwi_be_write_row_description_add(
|
2020-12-28 10:43:31 +00:00
|
|
|
msg, 0, caption, caption_len, 0, 0,
|
|
|
|
23 /* INT4OID */, 4, 0, 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-04-02 11:00:56 +00:00
|
|
|
}
|
2020-03-18 05:12:53 +00:00
|
|
|
}
|
|
|
|
|
2020-12-15 11:33:43 +00:00
|
|
|
td_histogram_t *transactions_hgram = NULL;
|
2020-12-28 10:43:31 +00:00
|
|
|
td_histogram_t *queries_hgram = NULL;
|
2020-12-14 13:18:37 +00:00
|
|
|
if (extended) {
|
|
|
|
transactions_hgram = td_new(QUANTILES_COMPRESSION);
|
2020-12-28 10:43:31 +00:00
|
|
|
queries_hgram = td_new(QUANTILES_COMPRESSION);
|
2020-12-14 13:18:37 +00:00
|
|
|
}
|
2020-12-28 10:43:31 +00:00
|
|
|
void *argv[] = { stream, &extended, quantiles,
|
|
|
|
&quantiles_count, transactions_hgram, queries_hgram };
|
2018-12-21 10:08:53 +00:00
|
|
|
rc = od_router_foreach(router, od_console_show_pools_add_cb, argv);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
goto error;
|
|
|
|
if (extended) {
|
|
|
|
int offset;
|
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
|
|
|
if (msg == NULL)
|
|
|
|
goto error;
|
|
|
|
char *aggregated_name = "aggregated";
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, aggregated_name,
|
|
|
|
strlen(aggregated_name));
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE) {
|
|
|
|
goto error;
|
|
|
|
}
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, aggregated_name,
|
|
|
|
strlen(aggregated_name));
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE) {
|
|
|
|
goto error;
|
|
|
|
}
|
2021-03-05 05:45:22 +00:00
|
|
|
const size_t rest_columns_count = 13;
|
2020-12-14 13:18:37 +00:00
|
|
|
for (size_t i = 0; i < rest_columns_count; ++i) {
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, NULL,
|
|
|
|
NULL_MSG_LEN);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE) {
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
}
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = od_console_show_quantiles(stream, offset, quantiles_count,
|
|
|
|
quantiles, transactions_hgram,
|
|
|
|
queries_hgram);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE) {
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
td_safe_free(transactions_hgram);
|
|
|
|
td_safe_free(queries_hgram);
|
2020-02-18 13:05:02 +00:00
|
|
|
return kiwi_be_write_complete(stream, "SHOW", 5);
|
2020-12-14 13:18:37 +00:00
|
|
|
error:
|
|
|
|
td_safe_free(transactions_hgram);
|
|
|
|
td_safe_free(queries_hgram);
|
|
|
|
return NOT_OK_RESPONSE;
|
2018-12-21 10:08:53 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_servers_server_cb(od_server_t *server,
|
|
|
|
void **argv)
|
2017-08-17 15:16:16 +00:00
|
|
|
{
|
|
|
|
od_route_t *route = server->route;
|
|
|
|
|
2019-01-23 15:43:52 +00:00
|
|
|
int offset;
|
|
|
|
machine_msg_t *stream = argv[0];
|
2018-08-28 14:43:46 +00:00
|
|
|
machine_msg_t *msg;
|
2019-01-23 15:43:52 +00:00
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
2018-08-28 14:43:46 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2018-12-06 14:23:15 +00:00
|
|
|
/* type */
|
2017-08-17 15:16:16 +00:00
|
|
|
char data[64];
|
2020-04-02 11:00:56 +00:00
|
|
|
size_t data_len;
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "S");
|
2017-08-17 15:16:16 +00:00
|
|
|
int rc;
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* user */
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, route->id.user,
|
|
|
|
route->id.user_len - 1);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* database */
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, route->id.database,
|
|
|
|
route->id.database_len - 1);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* state */
|
|
|
|
char *state = "";
|
2018-08-28 14:43:46 +00:00
|
|
|
if (server->state == OD_SERVER_IDLE)
|
2017-08-17 15:16:16 +00:00
|
|
|
state = "idle";
|
2020-04-02 11:00:56 +00:00
|
|
|
else if (server->state == OD_SERVER_ACTIVE)
|
2017-08-17 15:16:16 +00:00
|
|
|
state = "active";
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, state, strlen(state));
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* addr */
|
2019-01-23 15:43:52 +00:00
|
|
|
od_getpeername(server->io.io, data, sizeof(data), 1, 0);
|
2017-08-17 15:16:16 +00:00
|
|
|
data_len = strlen(data);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* port */
|
2019-01-23 15:43:52 +00:00
|
|
|
od_getpeername(server->io.io, data, sizeof(data), 0, 1);
|
2017-08-17 15:16:16 +00:00
|
|
|
data_len = strlen(data);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* local_addr */
|
2019-01-23 15:43:52 +00:00
|
|
|
od_getsockname(server->io.io, data, sizeof(data), 1, 0);
|
2017-08-17 15:16:16 +00:00
|
|
|
data_len = strlen(data);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* local_port */
|
2019-01-23 15:43:52 +00:00
|
|
|
od_getsockname(server->io.io, data, sizeof(data), 0, 1);
|
2017-08-17 15:16:16 +00:00
|
|
|
data_len = strlen(data);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* connect_time */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, NULL, -1);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* request_time */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, NULL, -1);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-01-17 11:32:19 +00:00
|
|
|
/* wait */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "0");
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-01-17 11:32:19 +00:00
|
|
|
/* wait_us */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "0");
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* ptr */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len =
|
|
|
|
od_snprintf(data, sizeof(data), "%s%.*s", server->id.id_prefix,
|
|
|
|
(signed)sizeof(server->id.id), server->id.id);
|
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* link */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%s", "");
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* remote_pid */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "0");
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* tls */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%s", "");
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_servers_cb(od_route_t *route, void **argv)
|
2018-12-06 14:23:15 +00:00
|
|
|
{
|
|
|
|
od_route_lock(route);
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
od_server_pool_foreach(&route->server_pool, OD_SERVER_ACTIVE,
|
|
|
|
od_console_show_servers_server_cb, argv);
|
2018-12-06 14:23:15 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
od_server_pool_foreach(&route->server_pool, OD_SERVER_IDLE,
|
|
|
|
od_console_show_servers_server_cb, argv);
|
2018-12-06 14:23:15 +00:00
|
|
|
|
|
|
|
od_route_unlock(route);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_servers(od_client_t *client,
|
|
|
|
machine_msg_t *stream)
|
2017-08-15 13:49:39 +00:00
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
assert(stream);
|
2018-03-13 13:17:27 +00:00
|
|
|
od_router_t *router = client->global->router;
|
2018-08-28 14:43:46 +00:00
|
|
|
|
|
|
|
machine_msg_t *msg;
|
2020-12-28 10:43:31 +00:00
|
|
|
msg = kiwi_be_write_row_descriptionf(
|
|
|
|
stream, "sssssdsdssddssds", "type", "user", "database", "state",
|
|
|
|
"addr", "port", "local_addr", "local_port", "connect_time",
|
|
|
|
"request_time", "wait", "wait_us", "ptr", "link", "remote_pid",
|
|
|
|
"tls");
|
2018-08-28 14:43:46 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
|
2019-01-23 15:43:52 +00:00
|
|
|
void *argv[] = { stream };
|
2018-12-07 12:28:32 +00:00
|
|
|
od_router_foreach(router, od_console_show_servers_cb, argv);
|
2017-08-17 15:38:28 +00:00
|
|
|
|
2020-02-18 13:05:02 +00:00
|
|
|
return kiwi_be_write_complete(stream, "SHOW", 5);
|
2017-08-17 15:38:28 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_clients_callback(od_client_t *client,
|
|
|
|
void **argv)
|
2017-08-17 15:38:28 +00:00
|
|
|
{
|
2019-01-23 15:43:52 +00:00
|
|
|
int offset;
|
|
|
|
machine_msg_t *stream = argv[0];
|
2018-08-28 14:43:46 +00:00
|
|
|
machine_msg_t *msg;
|
2019-01-23 15:43:52 +00:00
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
2018-08-28 14:43:46 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
char data[64];
|
2020-04-02 11:00:56 +00:00
|
|
|
size_t data_len;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* type */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "C");
|
2017-08-17 15:38:28 +00:00
|
|
|
int rc;
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* user */
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset,
|
|
|
|
client->startup.user.value,
|
|
|
|
client->startup.user.value_len - 1);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* database */
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset,
|
|
|
|
client->startup.database.value,
|
|
|
|
client->startup.database.value_len - 1);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* state */
|
|
|
|
char *state = "";
|
2018-08-28 14:43:46 +00:00
|
|
|
if (client->state == OD_CLIENT_ACTIVE)
|
2017-08-17 15:38:28 +00:00
|
|
|
state = "active";
|
2020-04-02 11:00:56 +00:00
|
|
|
else if (client->state == OD_CLIENT_PENDING)
|
2017-08-17 15:38:28 +00:00
|
|
|
state = "pending";
|
2020-04-02 11:00:56 +00:00
|
|
|
else if (client->state == OD_CLIENT_QUEUE)
|
2017-08-17 15:38:28 +00:00
|
|
|
state = "queue";
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, state, strlen(state));
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* addr */
|
2019-01-23 15:43:52 +00:00
|
|
|
od_getpeername(client->io.io, data, sizeof(data), 1, 0);
|
2017-08-17 15:38:28 +00:00
|
|
|
data_len = strlen(data);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* port */
|
2019-01-23 15:43:52 +00:00
|
|
|
od_getpeername(client->io.io, data, sizeof(data), 0, 1);
|
2017-08-17 15:38:28 +00:00
|
|
|
data_len = strlen(data);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* local_addr */
|
2019-01-23 15:43:52 +00:00
|
|
|
od_getsockname(client->io.io, data, sizeof(data), 1, 0);
|
2017-08-17 15:38:28 +00:00
|
|
|
data_len = strlen(data);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* local_port */
|
2019-01-23 15:43:52 +00:00
|
|
|
od_getsockname(client->io.io, data, sizeof(data), 0, 1);
|
2017-08-17 15:38:28 +00:00
|
|
|
data_len = strlen(data);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* connect_time */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, NULL, -1);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* request_time */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, NULL, -1);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-01-14 13:04:57 +00:00
|
|
|
/* wait */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "0");
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-01-14 13:04:57 +00:00
|
|
|
/* wait_us */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "0");
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* ptr */
|
2020-12-28 10:43:31 +00:00
|
|
|
data_len =
|
|
|
|
od_snprintf(data, sizeof(data), "%s%.*s", client->id.id_prefix,
|
|
|
|
(signed)sizeof(client->id.id), client->id.id);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* link */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%s", "");
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* remote_pid */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "0");
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* tls */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%s", "");
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:38:28 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_clients_cb(od_route_t *route, void **argv)
|
2018-12-06 14:23:15 +00:00
|
|
|
{
|
|
|
|
od_route_lock(route);
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
od_client_pool_foreach(&route->client_pool, OD_CLIENT_ACTIVE,
|
|
|
|
od_console_show_clients_callback, argv);
|
2018-12-06 14:23:15 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
od_client_pool_foreach(&route->client_pool, OD_CLIENT_PENDING,
|
|
|
|
od_console_show_clients_callback, argv);
|
2018-12-06 14:23:15 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
od_client_pool_foreach(&route->client_pool, OD_CLIENT_QUEUE,
|
|
|
|
od_console_show_clients_callback, argv);
|
2018-12-06 14:23:15 +00:00
|
|
|
|
|
|
|
od_route_unlock(route);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_clients(od_client_t *client,
|
|
|
|
machine_msg_t *stream)
|
2017-08-17 15:38:28 +00:00
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
assert(stream);
|
2018-03-13 13:17:27 +00:00
|
|
|
od_router_t *router = client->global->router;
|
2018-08-28 14:43:46 +00:00
|
|
|
|
|
|
|
machine_msg_t *msg;
|
2020-12-28 10:43:31 +00:00
|
|
|
msg = kiwi_be_write_row_descriptionf(
|
|
|
|
stream, "sssssdsdssddssds", "type", "user", "database", "state",
|
|
|
|
"addr", "port", "local_addr", "local_port", "connect_time",
|
|
|
|
"request_time", "wait", "wait_us", "ptr", "link", "remote_pid",
|
|
|
|
"tls");
|
2018-08-28 14:43:46 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-17 15:16:16 +00:00
|
|
|
|
2019-01-23 15:43:52 +00:00
|
|
|
void *argv[] = { stream };
|
2018-12-06 14:23:15 +00:00
|
|
|
od_router_foreach(router, od_console_show_clients_cb, argv);
|
2017-08-16 13:58:05 +00:00
|
|
|
|
2020-02-18 13:05:02 +00:00
|
|
|
return kiwi_be_write_complete(stream, "SHOW", 5);
|
2017-08-04 15:02:33 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_lists_add(machine_msg_t *stream, char *list,
|
|
|
|
int items)
|
2017-08-25 12:39:00 +00:00
|
|
|
{
|
2019-01-23 15:43:52 +00:00
|
|
|
int offset;
|
2018-08-28 14:43:46 +00:00
|
|
|
machine_msg_t *msg;
|
2019-01-23 15:43:52 +00:00
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
2018-08-28 14:43:46 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* list */
|
|
|
|
int rc;
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, list, strlen(list));
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* items */
|
|
|
|
char data[64];
|
2020-04-02 11:00:56 +00:00
|
|
|
int data_len;
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%d", items);
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_lists_cb(od_route_t *route, void **argv)
|
2017-08-25 12:39:00 +00:00
|
|
|
{
|
2018-12-06 14:23:15 +00:00
|
|
|
od_route_lock(route);
|
|
|
|
|
|
|
|
int *used_servers = argv[0];
|
2020-02-18 09:46:13 +00:00
|
|
|
int *free_servers = argv[1];
|
2018-12-06 14:23:15 +00:00
|
|
|
(*used_servers) += route->server_pool.count_active;
|
2020-02-18 09:46:13 +00:00
|
|
|
(*free_servers) += route->server_pool.count_idle;
|
2018-12-06 14:23:15 +00:00
|
|
|
|
|
|
|
od_route_unlock(route);
|
2017-08-25 12:39:00 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show_lists(od_client_t *client,
|
|
|
|
machine_msg_t *stream)
|
2017-08-25 12:39:00 +00:00
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
assert(stream);
|
2018-03-13 13:17:27 +00:00
|
|
|
od_router_t *router = client->global->router;
|
2017-08-25 12:39:00 +00:00
|
|
|
|
2018-12-06 14:23:15 +00:00
|
|
|
/* Gather router information.
|
|
|
|
|
|
|
|
router_used_servers can be inconsistent here, since it depends on
|
|
|
|
separate route locks.
|
|
|
|
*/
|
|
|
|
od_router_lock(router);
|
|
|
|
|
|
|
|
int router_used_servers = 0;
|
2020-02-18 09:46:13 +00:00
|
|
|
int router_free_servers = 0;
|
2020-12-28 10:43:31 +00:00
|
|
|
int router_pools = router->route_pool.count;
|
|
|
|
int router_clients = od_atomic_u32_of(&router->clients);
|
2017-08-25 12:39:00 +00:00
|
|
|
|
2020-02-18 09:46:13 +00:00
|
|
|
void *argv[] = { &router_used_servers, &router_free_servers };
|
2020-12-28 10:43:31 +00:00
|
|
|
od_route_pool_foreach(&router->route_pool, od_console_show_lists_cb,
|
|
|
|
argv);
|
2018-12-06 14:23:15 +00:00
|
|
|
|
|
|
|
od_router_unlock(router);
|
2018-08-28 14:43:46 +00:00
|
|
|
|
|
|
|
machine_msg_t *msg;
|
2019-01-23 15:43:52 +00:00
|
|
|
msg = kiwi_be_write_row_descriptionf(stream, "sd", "list", "items");
|
2018-08-28 14:43:46 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2018-08-28 14:43:46 +00:00
|
|
|
int rc;
|
2018-12-06 14:23:15 +00:00
|
|
|
/* databases */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "databases", 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* users */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "users", 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* pools */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "pools", router_pools);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* free_clients */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "free_clients", 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* used_clients */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "used_clients", router_clients);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* login_clients */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "login_clients", 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* free_servers */
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "free_servers",
|
|
|
|
router_free_servers);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* used_servers */
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "used_servers",
|
|
|
|
router_used_servers);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* dns_names */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "dns_names", 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* dns_zones */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "dns_zones", 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* dns_queries */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "dns_queries", 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-25 12:39:00 +00:00
|
|
|
/* dns_pending */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "dns_pending", 0);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-02-18 13:05:02 +00:00
|
|
|
return kiwi_be_write_complete(stream, "SHOW", 5);
|
2017-08-25 12:39:00 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_show(od_client_t *client, machine_msg_t *stream,
|
|
|
|
od_parser_t *parser)
|
2017-08-07 14:45:22 +00:00
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
assert(stream);
|
2017-08-08 13:05:58 +00:00
|
|
|
od_token_t token;
|
2017-08-07 14:45:22 +00:00
|
|
|
int rc;
|
2017-08-08 13:05:58 +00:00
|
|
|
rc = od_parser_next(parser, &token);
|
|
|
|
switch (rc) {
|
2020-12-28 10:43:31 +00:00
|
|
|
case OD_PARSER_KEYWORD:
|
|
|
|
break;
|
|
|
|
case OD_PARSER_EOF:
|
|
|
|
default:
|
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-08 13:05:58 +00:00
|
|
|
}
|
|
|
|
od_keyword_t *keyword;
|
|
|
|
keyword = od_keyword_match(od_console_keywords, &token);
|
|
|
|
if (keyword == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-08 13:05:58 +00:00
|
|
|
switch (keyword->id) {
|
2020-12-28 10:43:31 +00:00
|
|
|
case OD_LSTATS:
|
|
|
|
return od_console_show_stats(client, stream);
|
|
|
|
case OD_LPOOLS:
|
|
|
|
return od_console_show_pools(client, stream, false);
|
|
|
|
case OD_LPOOLS_EXTENDED:
|
|
|
|
return od_console_show_pools(client, stream, true);
|
|
|
|
case OD_LDATABASES:
|
|
|
|
return od_console_show_databases(client, stream);
|
|
|
|
case OD_LSERVERS:
|
|
|
|
return od_console_show_servers(client, stream);
|
|
|
|
case OD_LCLIENTS:
|
|
|
|
return od_console_show_clients(client, stream);
|
|
|
|
case OD_LLISTS:
|
|
|
|
return od_console_show_lists(client, stream);
|
|
|
|
case OD_LERRORS:
|
|
|
|
return od_console_show_errors(client, stream);
|
|
|
|
case OD_LERRORS_PER_ROUTE:
|
|
|
|
return od_console_show_errors_per_route(client, stream);
|
|
|
|
case OD_LVERSION:
|
|
|
|
return od_console_show_version(stream);
|
2017-08-08 13:05:58 +00:00
|
|
|
}
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2017-08-07 14:45:22 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_kill_client(od_client_t *client,
|
|
|
|
machine_msg_t *stream,
|
|
|
|
od_parser_t *parser)
|
2018-07-19 14:33:44 +00:00
|
|
|
{
|
2019-01-23 15:43:52 +00:00
|
|
|
(void)stream;
|
2018-07-19 14:33:44 +00:00
|
|
|
od_token_t token;
|
|
|
|
int rc;
|
|
|
|
rc = od_parser_next(parser, &token);
|
|
|
|
if (rc != OD_PARSER_KEYWORD)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2018-07-19 14:33:44 +00:00
|
|
|
od_id_t id;
|
|
|
|
if (token.value.string.size != (sizeof(id.id) + 1))
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2018-07-19 14:33:44 +00:00
|
|
|
memcpy(id.id, token.value.string.pointer + 1, sizeof(id.id));
|
|
|
|
|
2018-12-06 14:23:15 +00:00
|
|
|
od_router_kill(client->global->router, &id);
|
2018-07-19 14:33:44 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_reload(od_client_t *client, machine_msg_t *stream)
|
2020-05-25 09:47:13 +00:00
|
|
|
{
|
|
|
|
od_instance_t *instance = client->global->instance;
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
od_log(&instance->logger, "console", NULL, NULL,
|
|
|
|
"RELOAD command received");
|
2020-05-25 09:47:13 +00:00
|
|
|
od_system_config_reload(client->global->system);
|
2020-06-04 10:25:28 +00:00
|
|
|
return kiwi_be_write_complete(stream, "RELOAD", 7);
|
2020-05-25 09:47:13 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_set(od_client_t *client, machine_msg_t *stream)
|
2017-08-23 13:29:30 +00:00
|
|
|
{
|
2019-01-23 15:43:52 +00:00
|
|
|
(void)client;
|
2018-12-06 14:23:15 +00:00
|
|
|
/* reply success */
|
2020-02-18 13:05:02 +00:00
|
|
|
return kiwi_be_write_complete(stream, "SET", 4);
|
2017-08-23 13:29:30 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_add_module(od_client_t *client,
|
|
|
|
machine_msg_t *stream,
|
|
|
|
od_parser_t *parser)
|
2020-06-09 09:19:11 +00:00
|
|
|
{
|
|
|
|
assert(stream);
|
|
|
|
od_token_t token;
|
|
|
|
int rc;
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = od_parser_next(parser, &token);
|
2020-06-09 09:19:11 +00:00
|
|
|
od_instance_t *instance = client->global->instance;
|
|
|
|
|
|
|
|
switch (rc) {
|
2020-12-28 10:43:31 +00:00
|
|
|
case OD_PARSER_STRING: {
|
|
|
|
char module_path[MAX_MODULE_PATH_LEN];
|
|
|
|
od_token_to_string_dest(&token, module_path);
|
|
|
|
|
|
|
|
od_log(&instance->logger, "od module dynamic load", NULL, NULL,
|
|
|
|
"loading module with path %s", module_path);
|
|
|
|
int retcode = od_target_module_add(&instance->logger,
|
|
|
|
client->global->modules,
|
|
|
|
module_path);
|
|
|
|
if (retcode == 0) {
|
|
|
|
od_frontend_infof(client, stream,
|
|
|
|
"module was successfully loaded!");
|
|
|
|
} else {
|
|
|
|
od_frontend_errorf(
|
|
|
|
client, stream, KIWI_SYSTEM_ERROR,
|
|
|
|
"module was NOT successfully loaded! Check logs for details");
|
2020-06-09 09:19:11 +00:00
|
|
|
}
|
2020-12-28 10:43:31 +00:00
|
|
|
return retcode;
|
|
|
|
}
|
|
|
|
case OD_PARSER_EOF:
|
|
|
|
default:
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-06-09 09:19:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_unload_module(od_client_t *client,
|
|
|
|
machine_msg_t *stream,
|
|
|
|
od_parser_t *parser)
|
2020-06-09 09:19:11 +00:00
|
|
|
{
|
|
|
|
assert(stream);
|
|
|
|
od_token_t token;
|
|
|
|
int rc;
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = od_parser_next(parser, &token);
|
2020-06-09 09:19:11 +00:00
|
|
|
od_instance_t *instance = client->global->instance;
|
|
|
|
|
|
|
|
switch (rc) {
|
2020-12-28 10:43:31 +00:00
|
|
|
case OD_PARSER_STRING: {
|
|
|
|
char module_path[MAX_MODULE_PATH_LEN];
|
|
|
|
od_token_to_string_dest(&token, module_path);
|
|
|
|
|
|
|
|
od_log(&instance->logger, "od module dynamic unload", NULL,
|
|
|
|
NULL, "unloading module with path %s", module_path);
|
|
|
|
int retcode = od_target_module_unload(&instance->logger,
|
|
|
|
client->global->modules,
|
|
|
|
module_path);
|
|
|
|
if (retcode == 0) {
|
|
|
|
od_frontend_infof(client, stream,
|
|
|
|
"module was successfully unloaded!");
|
|
|
|
} else {
|
|
|
|
od_frontend_errorf(client, stream, KIWI_SYSTEM_ERROR,
|
|
|
|
"module was NOT successfully "
|
|
|
|
"unloaded! Check logs for details");
|
2020-06-09 09:19:11 +00:00
|
|
|
}
|
2020-12-28 10:43:31 +00:00
|
|
|
return retcode;
|
|
|
|
}
|
|
|
|
case OD_PARSER_EOF:
|
|
|
|
default:
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-06-09 09:19:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_create(od_client_t *client, machine_msg_t *stream,
|
|
|
|
od_parser_t *parser)
|
2020-06-09 09:19:11 +00:00
|
|
|
{
|
|
|
|
assert(stream);
|
|
|
|
od_token_t token;
|
|
|
|
int rc;
|
|
|
|
rc = od_parser_next(parser, &token);
|
|
|
|
switch (rc) {
|
2020-12-28 10:43:31 +00:00
|
|
|
case OD_PARSER_KEYWORD:
|
|
|
|
break;
|
|
|
|
case OD_PARSER_EOF:
|
|
|
|
default:
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-06-09 09:19:11 +00:00
|
|
|
}
|
|
|
|
od_keyword_t *keyword;
|
|
|
|
keyword = od_keyword_match(od_console_keywords, &token);
|
|
|
|
if (keyword == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2020-06-09 09:19:11 +00:00
|
|
|
|
|
|
|
switch (keyword->id) {
|
2020-12-28 10:43:31 +00:00
|
|
|
case OD_LMODULE:
|
|
|
|
return od_console_add_module(client, stream, parser);
|
2020-06-09 09:19:11 +00:00
|
|
|
}
|
|
|
|
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2020-06-09 09:19:11 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
static inline int od_console_drop(od_client_t *client, machine_msg_t *stream,
|
|
|
|
od_parser_t *parser)
|
2020-06-09 09:19:11 +00:00
|
|
|
{
|
|
|
|
assert(stream);
|
|
|
|
od_token_t token;
|
|
|
|
int rc;
|
|
|
|
rc = od_parser_next(parser, &token);
|
|
|
|
switch (rc) {
|
2020-12-28 10:43:31 +00:00
|
|
|
case OD_PARSER_KEYWORD:
|
|
|
|
break;
|
|
|
|
case OD_PARSER_EOF:
|
|
|
|
default:
|
|
|
|
return NOT_OK_RESPONSE;
|
2020-06-09 09:19:11 +00:00
|
|
|
}
|
|
|
|
od_keyword_t *keyword;
|
|
|
|
keyword = od_keyword_match(od_console_keywords, &token);
|
|
|
|
if (keyword == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2020-06-09 09:19:11 +00:00
|
|
|
|
|
|
|
switch (keyword->id) {
|
2020-12-28 10:43:31 +00:00
|
|
|
case OD_LMODULE:
|
|
|
|
return od_console_unload_module(client, stream, parser);
|
2020-06-09 09:19:11 +00:00
|
|
|
}
|
|
|
|
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2020-06-09 09:19:11 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
int od_console_query(od_client_t *client, machine_msg_t *stream,
|
|
|
|
char *query_data, uint32_t query_data_size)
|
2017-08-07 14:38:05 +00:00
|
|
|
{
|
2018-12-06 14:23:15 +00:00
|
|
|
od_instance_t *instance = client->global->instance;
|
2018-08-28 14:43:46 +00:00
|
|
|
|
2017-08-07 14:38:05 +00:00
|
|
|
uint32_t query_len;
|
|
|
|
char *query;
|
2018-08-29 13:34:38 +00:00
|
|
|
machine_msg_t *msg;
|
|
|
|
int rc;
|
2020-12-28 10:43:31 +00:00
|
|
|
rc = kiwi_be_read_query(query_data, query_data_size, &query,
|
|
|
|
&query_len);
|
2020-12-14 13:18:37 +00:00
|
|
|
if (rc == NOT_OK_RESPONSE) {
|
2020-12-28 10:43:31 +00:00
|
|
|
od_error(&instance->logger, "console", client, NULL,
|
|
|
|
"bad console command");
|
|
|
|
msg = od_frontend_errorf(client, stream, KIWI_SYNTAX_ERROR,
|
|
|
|
"bad console command");
|
2018-12-06 14:23:15 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2019-01-23 15:43:52 +00:00
|
|
|
|
2018-12-06 14:23:15 +00:00
|
|
|
return 0;
|
2018-08-29 13:34:38 +00:00
|
|
|
}
|
2017-08-07 14:38:05 +00:00
|
|
|
|
2018-08-29 13:34:38 +00:00
|
|
|
if (instance->config.log_query)
|
2020-12-28 10:43:31 +00:00
|
|
|
od_debug(&instance->logger, "console", client, NULL, "%.*s",
|
|
|
|
query_len, query);
|
2017-08-07 14:38:05 +00:00
|
|
|
|
2017-08-07 14:45:22 +00:00
|
|
|
od_parser_t parser;
|
|
|
|
od_parser_init(&parser, query, query_len);
|
|
|
|
|
|
|
|
od_token_t token;
|
|
|
|
rc = od_parser_next(&parser, &token);
|
|
|
|
switch (rc) {
|
2020-12-28 10:43:31 +00:00
|
|
|
case OD_PARSER_KEYWORD:
|
|
|
|
break;
|
|
|
|
case OD_PARSER_EOF:
|
|
|
|
default:
|
|
|
|
goto bad_query;
|
2017-08-07 14:45:22 +00:00
|
|
|
}
|
|
|
|
od_keyword_t *keyword;
|
|
|
|
keyword = od_keyword_match(od_console_keywords, &token);
|
2017-08-08 13:00:45 +00:00
|
|
|
if (keyword == NULL)
|
2017-09-08 12:45:00 +00:00
|
|
|
goto bad_query;
|
2017-08-07 14:45:22 +00:00
|
|
|
switch (keyword->id) {
|
2020-12-28 10:43:31 +00:00
|
|
|
case OD_LSHOW:
|
|
|
|
rc = od_console_show(client, stream, &parser);
|
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
goto bad_query;
|
|
|
|
break;
|
|
|
|
case OD_LKILL_CLIENT:
|
|
|
|
rc = od_console_kill_client(client, stream, &parser);
|
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
goto bad_query;
|
|
|
|
break;
|
|
|
|
case OD_LRELOAD:
|
|
|
|
rc = od_console_reload(client, stream);
|
|
|
|
if (rc == NOT_OK_RESPONSE)
|
|
|
|
goto bad_query;
|
|
|
|
break;
|
|
|
|
case OD_LSET:
|
|
|
|
rc = od_console_set(client, stream);
|
|
|
|
if (rc == NOT_OK_RESPONSE)
|
2017-09-08 12:45:00 +00:00
|
|
|
goto bad_query;
|
2020-12-28 10:43:31 +00:00
|
|
|
break;
|
|
|
|
case OD_LCREATE:
|
|
|
|
rc = od_console_create(client, stream, &parser);
|
|
|
|
if (rc == NOT_OK_RESPONSE) {
|
|
|
|
goto bad_query;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OD_LDROP:
|
|
|
|
rc = od_console_drop(client, stream, &parser);
|
|
|
|
if (rc == NOT_OK_RESPONSE) {
|
|
|
|
goto bad_query;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
goto bad_query;
|
2017-08-07 14:45:22 +00:00
|
|
|
}
|
|
|
|
|
2018-12-06 14:23:15 +00:00
|
|
|
return 0;
|
2017-08-08 13:00:45 +00:00
|
|
|
|
2017-09-08 12:45:00 +00:00
|
|
|
bad_query:
|
2020-12-28 10:43:31 +00:00
|
|
|
od_error(&instance->logger, "console", client, NULL,
|
|
|
|
"console command error: %.*s", query_len, query);
|
|
|
|
|
|
|
|
msg = od_frontend_errorf(client, stream, KIWI_SYNTAX_ERROR,
|
|
|
|
"console command error: %.*s", query_len,
|
|
|
|
query);
|
2018-12-06 14:23:15 +00:00
|
|
|
if (msg == NULL)
|
2020-12-14 13:18:37 +00:00
|
|
|
return NOT_OK_RESPONSE;
|
2019-01-23 15:43:52 +00:00
|
|
|
|
2018-08-29 13:34:38 +00:00
|
|
|
return 0;
|
2017-06-24 14:57:55 +00:00
|
|
|
}
|