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.
|
2017-06-24 14:57:55 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
2017-08-07 14:38:05 +00:00
|
|
|
#include <ctype.h>
|
2018-08-28 14:43:46 +00:00
|
|
|
#include <inttypes.h>
|
|
|
|
#include <assert.h>
|
2017-06-24 14:57:55 +00:00
|
|
|
|
2019-11-11 08:37:09 +00:00
|
|
|
#include <machinarium.h>
|
2019-11-19 11:57:16 +00:00
|
|
|
#include <kiwi.h>
|
2018-08-28 14:43:46 +00:00
|
|
|
#include <odyssey.h>
|
2017-06-24 14:57:55 +00:00
|
|
|
|
2017-08-07 14:45:22 +00:00
|
|
|
enum
|
|
|
|
{
|
2018-07-19 14:33:44 +00:00
|
|
|
OD_LKILL_CLIENT,
|
2017-08-07 14:45:22 +00:00
|
|
|
OD_LSHOW,
|
2017-08-15 13:49:39 +00:00
|
|
|
OD_LSTATS,
|
2017-08-17 15:38:28 +00:00
|
|
|
OD_LSERVERS,
|
2017-08-23 13:29:30 +00:00
|
|
|
OD_LCLIENTS,
|
2017-08-25 12:39:00 +00:00
|
|
|
OD_LLISTS,
|
2018-12-21 10:08:53 +00:00
|
|
|
OD_LSET,
|
2020-01-28 09:41:25 +00:00
|
|
|
OD_LPOOLS,
|
|
|
|
OD_LDATABASES
|
2017-08-07 14:45:22 +00:00
|
|
|
};
|
|
|
|
|
2018-08-28 14:43:46 +00:00
|
|
|
static od_keyword_t
|
|
|
|
od_console_keywords[] =
|
2017-08-07 14:45:22 +00:00
|
|
|
{
|
2018-07-19 14:33:44 +00:00
|
|
|
od_keyword("kill_client", OD_LKILL_CLIENT),
|
|
|
|
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),
|
2018-12-21 10:08:53 +00:00
|
|
|
od_keyword("pools", OD_LPOOLS),
|
2020-01-28 09:41:25 +00:00
|
|
|
od_keyword("databases", OD_LDATABASES),
|
2017-08-07 14:45:22 +00:00
|
|
|
{ 0, 0, 0 }
|
|
|
|
};
|
|
|
|
|
2017-08-11 15:19:29 +00:00
|
|
|
static inline int
|
2019-01-23 15:43:52 +00:00
|
|
|
od_console_show_stats_add(machine_msg_t *stream,
|
2017-08-11 15:19:29 +00:00
|
|
|
char *database,
|
|
|
|
int database_len,
|
2018-08-02 13:38:36 +00:00
|
|
|
od_stat_t *total,
|
|
|
|
od_stat_t *avg)
|
2017-08-11 15:19:29 +00:00
|
|
|
{
|
2020-02-18 13:05:02 +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)
|
|
|
|
return -1;
|
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);
|
2017-08-04 15:02:33 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-11 15:37:41 +00:00
|
|
|
char data[64];
|
|
|
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-04-02 12:41:59 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2018-04-02 12:41:59 +00:00
|
|
|
/* total_query_count */
|
2018-08-01 15:10:44 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, total->count_query);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-04 15:02:33 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-11 15:19:29 +00:00
|
|
|
/* total_received */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, total->recv_client);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-04 15:02:33 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-11 15:19:29 +00:00
|
|
|
/* total_sent */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, total->recv_server);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-04-02 12:41:59 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-04 15:02:33 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-11 15:19:29 +00:00
|
|
|
/* total_query_time */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, total->query_time);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-04 15:10:49 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-04-02 12:41:59 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-04-02 12:41:59 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2018-04-02 12:41:59 +00:00
|
|
|
/* avg_query_count */
|
2018-08-01 15:10:44 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, avg->count_query);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-04 15:10:49 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-11 15:19:29 +00:00
|
|
|
/* avg_recv */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, avg->recv_client);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-04 15:10:49 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-11 15:19:29 +00:00
|
|
|
/* avg_sent */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, avg->recv_server);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-04 15:10:49 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-04-02 12:41:59 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-04-02 12:41:59 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-12-06 14:23:15 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
2017-08-11 15:19:29 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2018-12-06 14:23:15 +00:00
|
|
|
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];
|
|
|
|
return od_console_show_stats_add(stream, database, database_len,
|
2017-08-11 15:19:29 +00:00
|
|
|
total, avg);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int
|
2019-01-23 15:43:52 +00:00
|
|
|
od_console_show_stats(od_client_t *client, machine_msg_t *stream)
|
2017-08-11 15:19:29 +00:00
|
|
|
{
|
2020-02-18 13:05:02 +00:00
|
|
|
assert(stream);
|
2018-03-13 13:17:27 +00:00
|
|
|
od_router_t *router = client->global->router;
|
2018-08-02 16:02:02 +00:00
|
|
|
od_cron_t *cron = client->global->cron;
|
|
|
|
|
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,
|
|
|
|
"sllllllllllllll",
|
2018-08-28 14:43:46 +00:00
|
|
|
"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");
|
|
|
|
if (msg == NULL)
|
|
|
|
return -1;
|
|
|
|
|
2019-01-23 15:43:52 +00:00
|
|
|
void *argv[] = { stream };
|
2018-12-06 14:23:15 +00:00
|
|
|
od_route_pool_stat_database(&router->route_pool,
|
|
|
|
od_console_show_stats_cb,
|
|
|
|
cron->stat_time_us,
|
|
|
|
argv);
|
|
|
|
|
2020-02-18 13:05:02 +00:00
|
|
|
return kiwi_be_write_complete(stream, "SHOW", 5);
|
2017-08-15 13:49:39 +00:00
|
|
|
}
|
|
|
|
|
2018-12-21 10:08:53 +00:00
|
|
|
static inline int
|
|
|
|
od_console_show_pools_add_cb(od_route_t *route, void **argv)
|
|
|
|
{
|
2019-01-23 15:43:52 +00:00
|
|
|
int offset;
|
|
|
|
machine_msg_t *stream = argv[0];
|
2018-12-21 10:08:53 +00:00
|
|
|
machine_msg_t *msg;
|
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)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
od_route_lock(route);
|
|
|
|
int rc;
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, route->id.database,
|
|
|
|
route->id.database_len - 1);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, route->id.user,
|
|
|
|
route->id.user_len - 1);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
char data[64];
|
|
|
|
int data_len;
|
|
|
|
|
|
|
|
/* cl_active */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 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);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
/* cl_waiting */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 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);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
/* sv_active */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 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);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
/* sv_idle */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 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);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
/* sv_used */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
/* sv_tested */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
/* sv_login */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
/* maxwait */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
/* maxwait_us */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
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)
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, "transaction", 11);
|
2018-12-21 10:08:53 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
od_route_unlock(route);
|
|
|
|
return 0;
|
|
|
|
error:
|
|
|
|
od_route_unlock(route);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2020-01-28 09:41:25 +00:00
|
|
|
static inline int
|
|
|
|
od_console_show_databases_add_cb(od_route_t *route, void **argv)
|
|
|
|
{
|
|
|
|
int offset;
|
|
|
|
machine_msg_t *stream = argv[0];
|
|
|
|
machine_msg_t *msg;
|
|
|
|
msg = kiwi_be_write_data_row(stream, &offset);
|
|
|
|
if (msg == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
od_route_lock(route);
|
|
|
|
int rc;
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, route->id.database,
|
|
|
|
route->id.database_len - 1);
|
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
od_rule_t *rule = route->rule;
|
|
|
|
od_rule_storage_t *storage = rule->storage;
|
|
|
|
|
|
|
|
char *host = storage->host;
|
|
|
|
if (!host)
|
|
|
|
host = "";
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, host,
|
|
|
|
strlen(host));
|
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
char data[64];
|
|
|
|
int data_len;
|
|
|
|
|
|
|
|
/* port */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, storage->port);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* database */
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, rule->db_name,
|
|
|
|
rule->db_name_len);
|
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* force_user */
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, "", 0);
|
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* pool_size */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, rule->pool_size);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* reserve_pool */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-01-28 09:41:25 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc == -1)
|
|
|
|
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)
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, "transaction", 11);
|
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* max_connections */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, rule->client_max);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* current_connections */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, route->client_pool.count_active
|
|
|
|
+ route->client_pool.count_pending
|
|
|
|
+ route->client_pool.count_queue);
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* paused */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-01-28 09:41:25 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* disabled */
|
2020-02-18 13:05:02 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%" PRIu64, 0UL);
|
2020-01-28 09:41:25 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc == -1)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
od_route_unlock(route);
|
|
|
|
return 0;
|
|
|
|
error:
|
|
|
|
od_route_unlock(route);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int
|
|
|
|
od_console_show_databases(od_client_t *client, machine_msg_t *stream)
|
|
|
|
{
|
2020-02-18 13:05:02 +00:00
|
|
|
assert(stream);
|
2020-01-28 09:41:25 +00:00
|
|
|
od_router_t *router = client->global->router;
|
|
|
|
|
|
|
|
machine_msg_t *msg;
|
|
|
|
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");
|
|
|
|
if (msg == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
void *argv[] = { stream };
|
|
|
|
int rc;
|
|
|
|
rc = od_router_foreach(router, od_console_show_databases_add_cb, argv);
|
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
|
2020-02-18 13:05:02 +00:00
|
|
|
return kiwi_be_write_complete(stream, "SHOW", 5);
|
2020-01-28 09:41:25 +00:00
|
|
|
}
|
|
|
|
|
2018-12-21 10:08:53 +00:00
|
|
|
static inline int
|
2019-01-23 15:43:52 +00:00
|
|
|
od_console_show_pools(od_client_t *client, machine_msg_t *stream)
|
2018-12-21 10:08:53 +00:00
|
|
|
{
|
2020-02-18 13:05:02 +00:00
|
|
|
assert(stream);
|
2018-12-21 10:08:53 +00:00
|
|
|
od_router_t *router = client->global->router;
|
|
|
|
|
|
|
|
machine_msg_t *msg;
|
2019-01-23 15:43:52 +00:00
|
|
|
msg = kiwi_be_write_row_descriptionf(stream,
|
|
|
|
"ssllllllllls",
|
2018-12-21 10:08:53 +00:00
|
|
|
"database",
|
|
|
|
"user",
|
|
|
|
"cl_active",
|
|
|
|
"cl_waiting",
|
|
|
|
"sv_active",
|
|
|
|
"sv_idle",
|
|
|
|
"sv_used",
|
|
|
|
"sv_tested",
|
|
|
|
"sv_login",
|
|
|
|
"maxwait",
|
|
|
|
"maxwait_us",
|
|
|
|
"pool_mode");
|
|
|
|
if (msg == NULL)
|
|
|
|
return -1;
|
|
|
|
|
2019-01-23 15:43:52 +00:00
|
|
|
void *argv[] = { stream };
|
|
|
|
int rc;
|
2018-12-21 10:08:53 +00:00
|
|
|
rc = od_router_foreach(router, od_console_show_pools_add_cb, argv);
|
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
|
2020-02-18 13:05:02 +00:00
|
|
|
return kiwi_be_write_complete(stream, "SHOW", 5);
|
2018-12-21 10:08:53 +00:00
|
|
|
}
|
|
|
|
|
2017-08-17 15:16:16 +00:00
|
|
|
static inline int
|
2018-12-06 14:23:15 +00:00
|
|
|
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)
|
|
|
|
return -1;
|
2018-12-06 14:23:15 +00:00
|
|
|
/* type */
|
2017-08-17 15:16:16 +00:00
|
|
|
char data[64];
|
2020-02-18 13:05:02 +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);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* user */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset,
|
2018-12-06 14:23:15 +00:00
|
|
|
route->id.user,
|
2018-08-28 14:43:46 +00:00
|
|
|
route->id.user_len - 1);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* database */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset,
|
2018-12-06 14:23:15 +00:00
|
|
|
route->id.database,
|
2018-08-28 14:43:46 +00:00
|
|
|
route->id.database_len - 1);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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";
|
|
|
|
else
|
2018-08-28 14:43:46 +00:00
|
|
|
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));
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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-01-17 11:32:19 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* wait */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "0");
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* wait_us */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "0");
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-17 15:16:16 +00:00
|
|
|
/* ptr */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%s%.*s",
|
|
|
|
server->id.id_prefix,
|
|
|
|
(signed)sizeof(server->id.id), server->id.id);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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", "");
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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");
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2017-08-17 15:16:16 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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", "");
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(msg, offset, data, data_len);
|
2018-12-06 14:23:15 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
2017-08-17 15:16:16 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-08-15 13:49:39 +00:00
|
|
|
static inline int
|
2018-12-06 14:23:15 +00:00
|
|
|
od_console_show_servers_cb(od_route_t *route, void **argv)
|
|
|
|
{
|
|
|
|
od_route_lock(route);
|
|
|
|
|
|
|
|
od_server_pool_foreach(&route->server_pool,
|
|
|
|
OD_SERVER_ACTIVE,
|
|
|
|
od_console_show_servers_server_cb,
|
|
|
|
argv);
|
|
|
|
|
|
|
|
od_server_pool_foreach(&route->server_pool,
|
|
|
|
OD_SERVER_IDLE,
|
|
|
|
od_console_show_servers_server_cb,
|
|
|
|
argv);
|
|
|
|
|
|
|
|
od_route_unlock(route);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int
|
2019-01-23 15:43:52 +00:00
|
|
|
od_console_show_servers(od_client_t *client, machine_msg_t *stream)
|
2017-08-15 13:49:39 +00:00
|
|
|
{
|
2020-02-18 13:05:02 +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;
|
2019-01-23 15:43:52 +00:00
|
|
|
msg = kiwi_be_write_row_descriptionf(stream,
|
2020-01-17 11:32:19 +00:00
|
|
|
"sssssdsdssddssds",
|
2018-08-28 14:43:46 +00:00
|
|
|
"type",
|
|
|
|
"user",
|
|
|
|
"database",
|
|
|
|
"state",
|
|
|
|
"addr",
|
|
|
|
"port",
|
|
|
|
"local_addr",
|
|
|
|
"local_port",
|
|
|
|
"connect_time",
|
|
|
|
"request_time",
|
2020-01-17 11:32:19 +00:00
|
|
|
"wait",
|
|
|
|
"wait_us",
|
2018-08-28 14:43:46 +00:00
|
|
|
"ptr",
|
|
|
|
"link",
|
|
|
|
"remote_pid",
|
|
|
|
"tls");
|
|
|
|
if (msg == NULL)
|
2017-08-15 14:37:09 +00:00
|
|
|
return -1;
|
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
|
|
|
}
|
|
|
|
|
|
|
|
static inline int
|
2018-12-06 14:23:15 +00:00
|
|
|
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)
|
|
|
|
return -1;
|
2017-08-17 15:38:28 +00:00
|
|
|
char data[64];
|
2020-02-18 13:05:02 +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);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* user */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, client->startup.user.value,
|
2018-12-12 13:07:25 +00:00
|
|
|
client->startup.user.value_len - 1);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* database */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, client->startup.database.value,
|
2018-12-12 13:07:25 +00:00
|
|
|
client->startup.database.value_len - 1);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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";
|
|
|
|
else
|
2018-08-28 14:43:46 +00:00
|
|
|
if (client->state == OD_CLIENT_PENDING)
|
2017-08-17 15:38:28 +00:00
|
|
|
state = "pending";
|
|
|
|
else
|
2018-08-28 14:43:46 +00:00
|
|
|
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));
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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-01-14 13:04:57 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* wait */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "0");
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* wait_us */
|
|
|
|
data_len = od_snprintf(data, sizeof(data), "0");
|
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
2017-08-17 15:38:28 +00:00
|
|
|
/* ptr */
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%s%.*s",
|
|
|
|
client->id.id_prefix,
|
|
|
|
(signed)sizeof(client->id.id), client->id.id);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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", "");
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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");
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2017-08-17 15:38:28 +00:00
|
|
|
if (rc == -1)
|
2019-01-23 15:43:52 +00:00
|
|
|
return -1;
|
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", "");
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-12-06 14:23:15 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
2017-08-17 15:38:28 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int
|
2018-12-06 14:23:15 +00:00
|
|
|
od_console_show_clients_cb(od_route_t *route, void **argv)
|
|
|
|
{
|
|
|
|
od_route_lock(route);
|
|
|
|
|
|
|
|
od_client_pool_foreach(&route->client_pool,
|
|
|
|
OD_CLIENT_ACTIVE,
|
|
|
|
od_console_show_clients_callback,
|
|
|
|
argv);
|
|
|
|
|
|
|
|
od_client_pool_foreach(&route->client_pool,
|
|
|
|
OD_CLIENT_PENDING,
|
|
|
|
od_console_show_clients_callback,
|
|
|
|
argv);
|
|
|
|
|
|
|
|
od_client_pool_foreach(&route->client_pool,
|
|
|
|
OD_CLIENT_QUEUE,
|
|
|
|
od_console_show_clients_callback,
|
|
|
|
argv);
|
|
|
|
|
|
|
|
od_route_unlock(route);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int
|
2019-01-23 15:43:52 +00:00
|
|
|
od_console_show_clients(od_client_t *client, machine_msg_t *stream)
|
2017-08-17 15:38:28 +00:00
|
|
|
{
|
2020-02-18 13:05:02 +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;
|
2019-01-23 15:43:52 +00:00
|
|
|
msg = kiwi_be_write_row_descriptionf(stream,
|
2020-01-14 13:04:57 +00:00
|
|
|
"sssssdsdssddssds",
|
2018-08-28 14:43:46 +00:00
|
|
|
"type",
|
|
|
|
"user",
|
|
|
|
"database",
|
|
|
|
"state",
|
|
|
|
"addr",
|
|
|
|
"port",
|
|
|
|
"local_addr",
|
|
|
|
"local_port",
|
|
|
|
"connect_time",
|
|
|
|
"request_time",
|
2020-01-14 13:04:57 +00:00
|
|
|
"wait",
|
|
|
|
"wait_us",
|
2018-08-28 14:43:46 +00:00
|
|
|
"ptr",
|
|
|
|
"link",
|
|
|
|
"remote_pid",
|
|
|
|
"tls");
|
|
|
|
if (msg == NULL)
|
2017-08-17 15:38:28 +00:00
|
|
|
return -1;
|
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
|
|
|
}
|
|
|
|
|
2017-08-25 12:39:00 +00:00
|
|
|
static inline int
|
2019-01-23 15:43:52 +00:00
|
|
|
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)
|
|
|
|
return -1;
|
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));
|
|
|
|
if (rc == -1)
|
2017-08-25 12:39:00 +00:00
|
|
|
return -1;
|
|
|
|
/* items */
|
|
|
|
char data[64];
|
|
|
|
int data_len;
|
2017-11-27 12:54:16 +00:00
|
|
|
data_len = od_snprintf(data, sizeof(data), "%d", items);
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_write_data_row_add(stream, offset, data, data_len);
|
2018-12-06 14:23:15 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
2017-08-25 12:39:00 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int
|
2018-12-06 14:23:15 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int
|
2019-01-23 15:43:52 +00:00
|
|
|
od_console_show_lists(od_client_t *client, machine_msg_t *stream)
|
2017-08-25 12:39:00 +00:00
|
|
|
{
|
2020-02-18 13:05:02 +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;
|
2018-12-06 14:23:15 +00:00
|
|
|
int router_pools = router->route_pool.count;
|
2019-10-10 10:00:33 +00:00
|
|
|
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 };
|
2018-12-06 14:23:15 +00:00
|
|
|
od_route_pool_foreach(&router->route_pool, od_console_show_lists_cb, argv);
|
|
|
|
|
|
|
|
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)
|
2017-08-25 12:39:00 +00:00
|
|
|
return -1;
|
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);
|
2017-08-25 12:39:00 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* users */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "users", 0);
|
2017-08-25 12:39:00 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* pools */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "pools", router_pools);
|
2017-08-25 12:39:00 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* free_clients */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "free_clients", 0);
|
2017-08-25 12:39:00 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* used_clients */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "used_clients", router_clients);
|
2017-08-25 12:39:00 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* login_clients */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "login_clients", 0);
|
2017-08-25 12:39:00 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* free_servers */
|
2020-02-18 09:46:13 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "free_servers", router_free_servers);
|
2017-08-25 12:39:00 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* used_servers */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "used_servers", router_used_servers);
|
2017-08-25 12:39:00 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* dns_names */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "dns_names", 0);
|
2017-08-25 12:39:00 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* dns_zones */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "dns_zones", 0);
|
2017-08-25 12:39:00 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* dns_queries */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "dns_queries", 0);
|
2017-08-25 12:39:00 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
/* dns_pending */
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show_lists_add(stream, "dns_pending", 0);
|
2018-12-06 14:23:15 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
2020-02-18 13:05:02 +00:00
|
|
|
return kiwi_be_write_complete(stream, "SHOW", 5);
|
2017-08-25 12:39:00 +00:00
|
|
|
}
|
|
|
|
|
2017-08-07 14:45:22 +00:00
|
|
|
static inline int
|
2019-01-23 15:43:52 +00:00
|
|
|
od_console_show(od_client_t *client, machine_msg_t *stream, od_parser_t *parser)
|
2017-08-07 14:45:22 +00:00
|
|
|
{
|
2020-02-18 13:05:02 +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) {
|
|
|
|
case OD_PARSER_KEYWORD:
|
|
|
|
break;
|
|
|
|
case OD_PARSER_EOF:
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
od_keyword_t *keyword;
|
|
|
|
keyword = od_keyword_match(od_console_keywords, &token);
|
|
|
|
if (keyword == NULL)
|
|
|
|
return -1;
|
|
|
|
switch (keyword->id) {
|
|
|
|
case OD_LSTATS:
|
2019-01-23 15:43:52 +00:00
|
|
|
return od_console_show_stats(client, stream);
|
|
|
|
case OD_LPOOLS:
|
|
|
|
return od_console_show_pools(client, stream);
|
2020-01-28 09:41:25 +00:00
|
|
|
case OD_LDATABASES:
|
|
|
|
return od_console_show_databases(client, stream);
|
2017-08-15 13:49:39 +00:00
|
|
|
case OD_LSERVERS:
|
2019-01-23 15:43:52 +00:00
|
|
|
return od_console_show_servers(client, stream);
|
2017-08-17 15:38:28 +00:00
|
|
|
case OD_LCLIENTS:
|
2019-01-23 15:43:52 +00:00
|
|
|
return od_console_show_clients(client, stream);
|
2017-08-25 12:39:00 +00:00
|
|
|
case OD_LLISTS:
|
2019-01-23 15:43:52 +00:00
|
|
|
return od_console_show_lists(client, stream);
|
2017-08-08 13:05:58 +00:00
|
|
|
}
|
|
|
|
return -1;
|
2017-08-07 14:45:22 +00:00
|
|
|
}
|
|
|
|
|
2018-07-19 14:33:44 +00:00
|
|
|
static inline int
|
2019-01-23 15:43:52 +00:00
|
|
|
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)
|
|
|
|
return -1;
|
|
|
|
od_id_t id;
|
|
|
|
if (token.value.string.size != (sizeof(id.id) + 1))
|
|
|
|
return -1;
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2017-08-23 13:29:30 +00:00
|
|
|
static inline int
|
2019-01-23 15:43:52 +00:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2018-12-06 14:23:15 +00:00
|
|
|
int
|
2019-01-23 15:43:52 +00:00
|
|
|
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;
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = kiwi_be_read_query(query_data, query_data_size, &query, &query_len);
|
2018-08-29 13:34:38 +00:00
|
|
|
if (rc == -1) {
|
|
|
|
od_error(&instance->logger, "console", client, NULL,
|
|
|
|
"bad console command");
|
2019-01-23 15:43:52 +00:00
|
|
|
msg = od_frontend_errorf(client, stream, KIWI_SYNTAX_ERROR,
|
|
|
|
"bad console command");
|
2018-12-06 14:23:15 +00:00
|
|
|
if (msg == NULL)
|
|
|
|
return -1;
|
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)
|
2017-10-26 12:54:32 +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) {
|
|
|
|
case OD_PARSER_KEYWORD:
|
|
|
|
break;
|
2017-08-08 13:02:33 +00:00
|
|
|
case OD_PARSER_EOF:
|
2017-08-07 14:45:22 +00:00
|
|
|
default:
|
2017-09-08 12:45:00 +00:00
|
|
|
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) {
|
2018-12-06 14:23:15 +00:00
|
|
|
case OD_LSHOW:
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_show(client, stream, &parser);
|
2018-07-19 14:33:44 +00:00
|
|
|
if (rc == -1)
|
|
|
|
goto bad_query;
|
|
|
|
break;
|
2018-12-06 14:23:15 +00:00
|
|
|
case OD_LKILL_CLIENT:
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_kill_client(client, stream, &parser);
|
2017-08-08 13:05:58 +00:00
|
|
|
if (rc == -1)
|
2017-09-08 12:45:00 +00:00
|
|
|
goto bad_query;
|
2017-08-08 13:05:58 +00:00
|
|
|
break;
|
2017-08-23 13:29:30 +00:00
|
|
|
case OD_LSET:
|
2019-01-23 15:43:52 +00:00
|
|
|
rc = od_console_set(client, stream);
|
2017-08-23 13:29:30 +00:00
|
|
|
if (rc == -1)
|
2017-09-08 12:45:00 +00:00
|
|
|
goto bad_query;
|
2017-08-23 13:29:30 +00:00
|
|
|
break;
|
2017-08-07 14:45:22 +00:00
|
|
|
default:
|
2017-09-08 12:45:00 +00:00
|
|
|
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:
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(&instance->logger, "console", client, NULL,
|
2018-08-29 13:34:38 +00:00
|
|
|
"console command error: %.*s", query_len, query);
|
2019-01-23 15:43:52 +00:00
|
|
|
|
|
|
|
msg = od_frontend_errorf(client, stream, KIWI_SYNTAX_ERROR,
|
2018-12-06 14:23:15 +00:00
|
|
|
"console command error: %.*s",
|
2018-08-28 14:43:46 +00:00
|
|
|
query_len, query);
|
2018-12-06 14:23:15 +00:00
|
|
|
if (msg == NULL)
|
2017-06-24 14:57:55 +00:00
|
|
|
return -1;
|
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
|
|
|
}
|