|
Packit |
4e8bc4 |
/* logging functions */
|
|
Packit |
4e8bc4 |
#ifndef LOGGER_H
|
|
Packit |
4e8bc4 |
#define LOGGER_H
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
#include "bipbuffer.h"
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/* TODO: starttime tunable */
|
|
Packit |
4e8bc4 |
#define LOGGER_BUF_SIZE 1024 * 64
|
|
Packit |
4e8bc4 |
#define LOGGER_WATCHER_BUF_SIZE 1024 * 256
|
|
Packit |
4e8bc4 |
#define LOGGER_ENTRY_MAX_SIZE 2048
|
|
Packit |
4e8bc4 |
#define GET_LOGGER() ((logger *) pthread_getspecific(logger_key));
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/* Inlined from memcached.h - should go into sub header */
|
|
Packit |
4e8bc4 |
typedef unsigned int rel_time_t;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
enum log_entry_type {
|
|
Packit |
4e8bc4 |
LOGGER_ASCII_CMD = 0,
|
|
Packit |
4e8bc4 |
LOGGER_EVICTION,
|
|
Packit |
4e8bc4 |
LOGGER_ITEM_GET,
|
|
Packit |
4e8bc4 |
LOGGER_ITEM_STORE,
|
|
Packit |
4e8bc4 |
LOGGER_CRAWLER_STATUS,
|
|
Packit |
4e8bc4 |
LOGGER_SLAB_MOVE,
|
|
Packit |
4e8bc4 |
#ifdef EXTSTORE
|
|
Packit |
4e8bc4 |
LOGGER_EXTSTORE_WRITE,
|
|
Packit |
4e8bc4 |
LOGGER_COMPACT_START,
|
|
Packit |
4e8bc4 |
LOGGER_COMPACT_ABORT,
|
|
Packit |
4e8bc4 |
LOGGER_COMPACT_READ_START,
|
|
Packit |
4e8bc4 |
LOGGER_COMPACT_READ_END,
|
|
Packit |
4e8bc4 |
LOGGER_COMPACT_END,
|
|
Packit |
4e8bc4 |
LOGGER_COMPACT_FRAGINFO,
|
|
Packit |
4e8bc4 |
#endif
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
enum log_entry_subtype {
|
|
Packit |
4e8bc4 |
LOGGER_TEXT_ENTRY = 0,
|
|
Packit |
4e8bc4 |
LOGGER_EVICTION_ENTRY,
|
|
Packit |
4e8bc4 |
LOGGER_ITEM_GET_ENTRY,
|
|
Packit |
4e8bc4 |
LOGGER_ITEM_STORE_ENTRY,
|
|
Packit |
4e8bc4 |
#ifdef EXTSTORE
|
|
Packit |
4e8bc4 |
LOGGER_EXT_WRITE_ENTRY,
|
|
Packit |
4e8bc4 |
#endif
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
enum logger_ret_type {
|
|
Packit |
4e8bc4 |
LOGGER_RET_OK = 0,
|
|
Packit |
4e8bc4 |
LOGGER_RET_NOSPACE,
|
|
Packit |
4e8bc4 |
LOGGER_RET_ERR
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
enum logger_parse_entry_ret {
|
|
Packit |
4e8bc4 |
LOGGER_PARSE_ENTRY_OK = 0,
|
|
Packit |
4e8bc4 |
LOGGER_PARSE_ENTRY_FULLBUF,
|
|
Packit |
4e8bc4 |
LOGGER_PARSE_ENTRY_FAILED
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
typedef const struct {
|
|
Packit |
4e8bc4 |
enum log_entry_subtype subtype;
|
|
Packit |
4e8bc4 |
int reqlen;
|
|
Packit |
4e8bc4 |
uint16_t eflags;
|
|
Packit |
4e8bc4 |
char *format;
|
|
Packit |
4e8bc4 |
} entry_details;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/* log entry intermediary structures */
|
|
Packit |
4e8bc4 |
struct logentry_eviction {
|
|
Packit |
4e8bc4 |
long long int exptime;
|
|
Packit |
4e8bc4 |
uint32_t latime;
|
|
Packit |
4e8bc4 |
uint16_t it_flags;
|
|
Packit |
4e8bc4 |
uint8_t nkey;
|
|
Packit |
4e8bc4 |
uint8_t clsid;
|
|
Packit |
4e8bc4 |
char key[];
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
#ifdef EXTSTORE
|
|
Packit |
4e8bc4 |
struct logentry_ext_write {
|
|
Packit |
4e8bc4 |
long long int exptime;
|
|
Packit |
4e8bc4 |
uint32_t latime;
|
|
Packit |
4e8bc4 |
uint16_t it_flags;
|
|
Packit |
4e8bc4 |
uint8_t nkey;
|
|
Packit |
4e8bc4 |
uint8_t clsid;
|
|
Packit |
4e8bc4 |
uint8_t bucket;
|
|
Packit |
4e8bc4 |
char key[];
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
#endif
|
|
Packit |
4e8bc4 |
struct logentry_item_get {
|
|
Packit |
4e8bc4 |
uint8_t was_found;
|
|
Packit |
4e8bc4 |
uint8_t nkey;
|
|
Packit |
4e8bc4 |
uint8_t clsid;
|
|
Packit |
4e8bc4 |
int sfd;
|
|
Packit |
4e8bc4 |
char key[];
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
struct logentry_item_store {
|
|
Packit |
4e8bc4 |
int status;
|
|
Packit |
4e8bc4 |
int cmd;
|
|
Packit |
4e8bc4 |
rel_time_t ttl;
|
|
Packit |
4e8bc4 |
uint8_t nkey;
|
|
Packit |
4e8bc4 |
uint8_t clsid;
|
|
Packit |
4e8bc4 |
int sfd;
|
|
Packit |
4e8bc4 |
char key[];
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/* end intermediary structures */
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/* WARNING: cuddled items aren't compatible with warm restart. more code
|
|
Packit |
4e8bc4 |
* necessary to ensure log streams are all flushed/processed before stopping
|
|
Packit |
4e8bc4 |
*/
|
|
Packit |
4e8bc4 |
typedef struct _logentry {
|
|
Packit |
4e8bc4 |
enum log_entry_subtype event;
|
|
Packit |
4e8bc4 |
uint8_t pad;
|
|
Packit |
4e8bc4 |
uint16_t eflags;
|
|
Packit |
4e8bc4 |
uint64_t gid;
|
|
Packit |
4e8bc4 |
struct timeval tv; /* not monotonic! */
|
|
Packit |
4e8bc4 |
int size;
|
|
Packit |
4e8bc4 |
union {
|
|
Packit |
4e8bc4 |
char end;
|
|
Packit |
4e8bc4 |
} data[];
|
|
Packit |
4e8bc4 |
} logentry;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
#define LOG_SYSEVENTS (1<<1) /* threads start/stop/working */
|
|
Packit |
4e8bc4 |
#define LOG_FETCHERS (1<<2) /* get/gets/etc */
|
|
Packit |
4e8bc4 |
#define LOG_MUTATIONS (1<<3) /* set/append/incr/etc */
|
|
Packit |
4e8bc4 |
#define LOG_SYSERRORS (1<<4) /* malloc/etc errors */
|
|
Packit |
4e8bc4 |
#define LOG_CONNEVENTS (1<<5) /* new client, closed, etc */
|
|
Packit |
4e8bc4 |
#define LOG_EVICTIONS (1<<6) /* details of evicted items */
|
|
Packit |
4e8bc4 |
#define LOG_STRICT (1<<7) /* block worker instead of drop */
|
|
Packit |
4e8bc4 |
#define LOG_RAWCMDS (1<<9) /* raw ascii commands */
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
typedef struct _logger {
|
|
Packit |
4e8bc4 |
struct _logger *prev;
|
|
Packit |
4e8bc4 |
struct _logger *next;
|
|
Packit |
4e8bc4 |
pthread_mutex_t mutex; /* guard for this + *buf */
|
|
Packit |
4e8bc4 |
uint64_t written; /* entries written to the buffer */
|
|
Packit |
4e8bc4 |
uint64_t dropped; /* entries dropped */
|
|
Packit |
4e8bc4 |
uint64_t blocked; /* times blocked instead of dropped */
|
|
Packit |
4e8bc4 |
uint16_t fetcher_ratio; /* log one out of every N fetches */
|
|
Packit |
4e8bc4 |
uint16_t mutation_ratio; /* log one out of every N mutations */
|
|
Packit |
4e8bc4 |
uint16_t eflags; /* flags this logger should log */
|
|
Packit |
4e8bc4 |
bipbuf_t *buf;
|
|
Packit |
4e8bc4 |
const entry_details *entry_map;
|
|
Packit |
4e8bc4 |
} logger;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
enum logger_watcher_type {
|
|
Packit |
4e8bc4 |
LOGGER_WATCHER_STDERR = 0,
|
|
Packit |
4e8bc4 |
LOGGER_WATCHER_CLIENT = 1
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
typedef struct {
|
|
Packit |
4e8bc4 |
void *c; /* original connection structure. still with source thread attached */
|
|
Packit |
4e8bc4 |
int sfd; /* client fd */
|
|
Packit |
4e8bc4 |
int id; /* id number for watcher list */
|
|
Packit |
4e8bc4 |
uint64_t skipped; /* lines skipped since last successful print */
|
|
Packit |
4e8bc4 |
bool failed_flush; /* recently failed to write out (EAGAIN), wait before retry */
|
|
Packit |
4e8bc4 |
enum logger_watcher_type t; /* stderr, client, syslog, etc */
|
|
Packit |
4e8bc4 |
uint16_t eflags; /* flags we are interested in */
|
|
Packit |
4e8bc4 |
bipbuf_t *buf; /* per-watcher output buffer */
|
|
Packit |
4e8bc4 |
} logger_watcher;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
struct logger_stats {
|
|
Packit |
4e8bc4 |
uint64_t worker_dropped;
|
|
Packit |
4e8bc4 |
uint64_t worker_written;
|
|
Packit |
4e8bc4 |
uint64_t watcher_skipped;
|
|
Packit |
4e8bc4 |
uint64_t watcher_sent;
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
extern pthread_key_t logger_key;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/* public functions */
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
void logger_init(void);
|
|
Packit |
4e8bc4 |
void logger_stop(void);
|
|
Packit |
4e8bc4 |
logger *logger_create(void);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
#define LOGGER_LOG(l, flag, type, ...) \
|
|
Packit |
4e8bc4 |
do { \
|
|
Packit |
4e8bc4 |
logger *myl = l; \
|
|
Packit |
4e8bc4 |
if (l == NULL) \
|
|
Packit |
4e8bc4 |
myl = GET_LOGGER(); \
|
|
Packit |
4e8bc4 |
if (myl->eflags & flag) \
|
|
Packit |
4e8bc4 |
logger_log(myl, type, __VA_ARGS__); \
|
|
Packit |
4e8bc4 |
} while (0)
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
enum logger_ret_type logger_log(logger *l, const enum log_entry_type event, const void *entry, ...);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
enum logger_add_watcher_ret {
|
|
Packit |
4e8bc4 |
LOGGER_ADD_WATCHER_TOO_MANY = 0,
|
|
Packit |
4e8bc4 |
LOGGER_ADD_WATCHER_OK,
|
|
Packit |
4e8bc4 |
LOGGER_ADD_WATCHER_FAILED
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
enum logger_add_watcher_ret logger_add_watcher(void *c, const int sfd, uint16_t f);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/* functions used by restart system */
|
|
Packit |
4e8bc4 |
uint64_t logger_get_gid(void);
|
|
Packit |
4e8bc4 |
void logger_set_gid(uint64_t gid);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
#endif
|