mirror of https://github.com/yandex/odyssey.git
107 lines
2.0 KiB
C
107 lines
2.0 KiB
C
![]() |
#ifndef OD_STAT_H
|
||
|
#define OD_STAT_H
|
||
|
|
||
|
/*
|
||
|
* Odyssey.
|
||
|
*
|
||
|
* Scalable PostgreSQL connection pooler.
|
||
|
*/
|
||
|
|
||
|
typedef struct od_stat od_stat_t;
|
||
|
|
||
|
struct od_stat
|
||
|
{
|
||
|
od_atomic_u64_t count_request;
|
||
|
od_atomic_u64_t count_reply;
|
||
|
od_atomic_u64_t count_query;
|
||
|
od_atomic_u64_t count_tx;
|
||
|
od_atomic_u64_t query_time;
|
||
|
uint64_t query_time_start;
|
||
|
od_atomic_u64_t tx_time;
|
||
|
uint64_t tx_time_start;
|
||
|
od_atomic_u64_t recv_server;
|
||
|
od_atomic_u64_t recv_client;
|
||
|
uint64_t count_error;
|
||
|
};
|
||
|
|
||
|
static inline void
|
||
|
od_stat_init(od_stat_t *stat)
|
||
|
{
|
||
|
memset(stat, 0, sizeof(*stat));
|
||
|
}
|
||
|
|
||
|
static inline int
|
||
|
od_stat_sync_is(od_stat_t *stat)
|
||
|
{
|
||
|
return stat->count_request == stat->count_reply;
|
||
|
}
|
||
|
|
||
|
static inline void
|
||
|
od_stat_sync_request(od_stat_t *stat, uint64_t count)
|
||
|
{
|
||
|
od_atomic_u64_add(&stat->count_request, count);
|
||
|
}
|
||
|
|
||
|
static inline void
|
||
|
od_stat_sync_reply(od_stat_t *stat)
|
||
|
{
|
||
|
od_atomic_u64_inc(&stat->count_reply);
|
||
|
}
|
||
|
|
||
|
static inline void
|
||
|
od_stat_query_start(od_stat_t *stat)
|
||
|
{
|
||
|
if (! stat->query_time_start)
|
||
|
stat->query_time_start = machine_time();
|
||
|
|
||
|
if (! stat->tx_time_start)
|
||
|
stat->tx_time_start = machine_time();
|
||
|
}
|
||
|
|
||
|
static inline void
|
||
|
od_stat_query_end(od_stat_t *stat, int in_transaction, int64_t *query_time)
|
||
|
{
|
||
|
int64_t diff;
|
||
|
if (stat->query_time_start) {
|
||
|
diff = machine_time() - stat->query_time_start;
|
||
|
if (diff > 0) {
|
||
|
*query_time = diff;
|
||
|
od_atomic_u64_add(&stat->query_time, diff);
|
||
|
od_atomic_u64_inc(&stat->count_query);
|
||
|
}
|
||
|
stat->query_time_start = 0;
|
||
|
}
|
||
|
|
||
|
if (in_transaction)
|
||
|
return;
|
||
|
|
||
|
if (stat->tx_time_start) {
|
||
|
diff = machine_time() - stat->tx_time_start;
|
||
|
if (diff > 0) {
|
||
|
od_atomic_u64_add(&stat->tx_time, diff);
|
||
|
od_atomic_u64_inc(&stat->count_tx);
|
||
|
}
|
||
|
stat->tx_time_start = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static inline void
|
||
|
od_stat_recv_server(od_stat_t *stat, uint64_t bytes)
|
||
|
{
|
||
|
od_atomic_u64_add(&stat->recv_server, bytes);
|
||
|
}
|
||
|
|
||
|
static inline void
|
||
|
od_stat_recv_client(od_stat_t *stat, uint64_t bytes)
|
||
|
{
|
||
|
od_atomic_u64_add(&stat->recv_client, bytes);
|
||
|
}
|
||
|
|
||
|
static inline void
|
||
|
od_stat_error(od_stat_t *stat)
|
||
|
{
|
||
|
stat->count_error++;
|
||
|
}
|
||
|
|
||
|
#endif /* OD_STAT_H */
|