1 #ifndef STATS_PREFIX_H 2 #define STATS_PREFIX_H 3 4 /* The stats prefix subsystem stores detailed statistics for each key prefix. 5 * Simple statistics like total number of GETS are stored by the Stats 6 * subsystem defined elsewhere. 7 * 8 * Suppose the prefix delimiter is ":", then "user:123" and "user:456" both 9 * have the same prefix "user". 10 */ 11 12 13 /* Initialize the stats prefix subsystem. Should be called once before other 14 * functions are called. The global hash initialization should be done before 15 * using this subsystem. 16 */ 17 void stats_prefix_init(char prefix_delimiter); 18 19 /* Clear previously collected stats. Requires you to have the acquired 20 * the STATS_LOCK() first. 21 */ 22 void stats_prefix_clear(void); 23 24 /* Record a GET for a key */ 25 void stats_prefix_record_get(const char *key, const size_t nkey, const bool is_hit); 26 27 /* Record a DELETE for a key */ 28 void stats_prefix_record_delete(const char *key, const size_t nkey); 29 30 /* Record a SET for a key */ 31 void stats_prefix_record_set(const char *key, const size_t nkey); 32 33 /* Return the collected stats in a textual for suitable for writing to a client. 34 * The size of the output text is stored in the length parameter. 35 * Returns NULL on error 36 */ 37 char *stats_prefix_dump(int *length); 38 39 /* Visible for testing */ 40 #define PREFIX_HASH_SIZE 256 41 typedef struct _prefix_stats PREFIX_STATS; 42 struct _prefix_stats { 43 char *prefix; 44 size_t prefix_len; 45 uint64_t num_gets; 46 uint64_t num_sets; 47 uint64_t num_deletes; 48 uint64_t num_hits; 49 PREFIX_STATS *next; 50 }; 51 52 /* Return the PREFIX_STATS structure for the specified key, creating it if 53 * it does not already exist. Returns NULL if the key does not contain 54 * prefix delimiter, or if there was an error. Requires you to have acquired 55 * STATS_LOCK() first. 56 */ 57 PREFIX_STATS *stats_prefix_find(const char *key, const size_t nkey); 58 59 #endif 60