149 lines
3.2 KiB
C

/*
* Summary: Specification of the storage engine interface.
*
* Copy: See Copyright for the status of this software.
*
* Author: Trond Norbye <trond.norbye@sun.com>
*/
#ifndef MEMCACHED_DEFAULT_ENGINE_H
#define MEMCACHED_DEFAULT_ENGINE_H
#include "config.h"
#include <pthread.h>
#include <memcached/engine.h>
#include <memcached/util.h>
#include <memcached/visibility.h>
/* Slab sizing definitions. */
#define POWER_SMALLEST 1
#define POWER_LARGEST 200
#define CHUNK_ALIGN_BYTES 8
#define DONT_PREALLOC_SLABS
#define MAX_NUMBER_OF_SLAB_CLASSES (POWER_LARGEST + 1)
/** How long an object can reasonably be assumed to be locked before
harvesting it on a low memory condition. */
#define TAIL_REPAIR_TIME (3 * 3600)
/* Forward decl */
struct default_engine;
#include "trace.h"
#include "items.h"
#include "assoc.h"
#include "hash.h"
#include "slabs.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Flags */
#define ITEM_WITH_CAS 1
#define ITEM_LINKED (1<<8)
/* temp */
#define ITEM_SLABBED (2<<8)
struct config {
bool use_cas;
size_t verbose;
rel_time_t oldest_live;
bool evict_to_free;
size_t maxbytes;
bool preallocate;
float factor;
size_t chunk_size;
size_t item_size_max;
bool ignore_vbucket;
bool vb0;
};
MEMCACHED_PUBLIC_API
ENGINE_ERROR_CODE create_instance(uint64_t interface,
GET_SERVER_API get_server_api,
ENGINE_HANDLE **handle);
/**
* Statistic information collected by the default engine
*/
struct engine_stats {
pthread_mutex_t lock;
uint64_t evictions;
uint64_t reclaimed;
uint64_t curr_bytes;
uint64_t curr_items;
uint64_t total_items;
};
struct engine_scrubber {
pthread_mutex_t lock;
bool running;
uint64_t visited;
uint64_t cleaned;
time_t started;
time_t stopped;
};
enum vbucket_state {
VBUCKET_STATE_DEAD = 0,
VBUCKET_STATE_ACTIVE = 1,
VBUCKET_STATE_REPLICA = 2,
VBUCKET_STATE_PENDING = 3
};
struct vbucket_info {
int state : 2;
};
#define NUM_VBUCKETS 65536
/**
* Definition of the private instance data used by the default engine.
*
* This is currently "work in progress" so it is not as clean as it should be.
*/
struct default_engine {
ENGINE_HANDLE_V1 engine;
SERVER_HANDLE_V1 server;
GET_SERVER_API get_server_api;
/**
* Is the engine initalized or not
*/
bool initialized;
struct assoc assoc;
struct slabs slabs;
struct items items;
/**
* The cache layer (item_* and assoc_*) is currently protected by
* this single mutex
*/
pthread_mutex_t cache_lock;
struct config config;
struct engine_stats stats;
struct engine_scrubber scrubber;
union {
engine_info engine_info;
char buffer[sizeof(engine_info) +
(sizeof(feature_info) * LAST_REGISTERED_ENGINE_FEATURE)];
} info;
char vbucket_infos[NUM_VBUCKETS];
};
char* item_get_data(const hash_item* item);
const void* item_get_key(const hash_item* item);
void item_set_cas(ENGINE_HANDLE *handle, const void *cookie,
item* item, uint64_t val);
uint64_t item_get_cas(const hash_item* item);
uint8_t item_get_clsid(const hash_item* item);
#endif