odyssey/sources/stat.h

107 lines
2.0 KiB
C
Raw Normal View History

2018-08-02 13:38:36 +00:00
#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 */