Skip to content
This repository was archived by the owner on Feb 4, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions benchmarks/bench_storage.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <errno.h>
#include <pthread.h>

#include <datapool/datapool.h>
#include <bench_storage.h>
#include <time/cc_timer.h>
#include <cc_debug.h>
Expand Down Expand Up @@ -50,6 +51,7 @@ struct benchmark_specific {

struct benchmark_options {
struct benchmark_specific benchmark;
datapool_options_st datapool;
struct option engine[]; /* storage-engine specific options... */
};

Expand All @@ -73,10 +75,15 @@ benchmark_create(struct benchmark *b, const char *config)
struct benchmark_specific opts = { BENCHMARK_OPTION(OPTION_INIT) };
option_load_default((struct option *)&opts, nopts);

datapool_options_st datapool = { DATAPOOL_OPTION(OPTION_INIT) };
option_load_default((struct option *)&(datapool), OPTION_CARDINALITY(datapool_options_st));

nopts += OPTION_CARDINALITY(datapool_options_st);
nopts += bench_storage_config_nopts();

b->options = cc_alloc(sizeof(struct option) * nopts);
b->options->benchmark = opts;
b->options->datapool = datapool;

bench_storage_config_init(b->options->engine);

Expand Down
27 changes: 25 additions & 2 deletions src/datapool/datapool.h
Original file line number Diff line number Diff line change
@@ -1,14 +1,37 @@
#pragma once

#include <cc_option.h>
#include <stddef.h>
#include <stdbool.h>

#define DATAPOOL_PATH NULL
#define DATAPOOL_NAME "datapool"
#define DATAPOOL_PREFAULT false

/* name type default description */
#define DATAPOOL_OPTION(ACTION) \
ACTION( datapool_path, OPTION_TYPE_STR, DATAPOOL_PATH, "path to data pool" )\
ACTION( datapool_name, OPTION_TYPE_STR, DATAPOOL_NAME, "datapool name" )\
ACTION( datapool_prefault, OPTION_TYPE_BOOL, DATAPOOL_PREFAULT, "prefault datapool" )

typedef struct {
DATAPOOL_OPTION(OPTION_DECLARE)
} datapool_options_st;

typedef enum datapool_medium {
DATAPOOL_MEDIUM_SHM = 0,
DATAPOOL_MEDIUM_PMEM = 1
} datapool_medium_e;

struct datapool;

struct datapool *datapool_open(const char *path, const char *user_signature,
size_t size, int *fresh, bool prefault);
struct datapool *datapool_open(size_t size, int *fresh);
void datapool_close(struct datapool *pool);

void *datapool_addr(struct datapool *pool);
size_t datapool_size(struct datapool *pool);
void datapool_set_user_data(const struct datapool *pool, const void *user_data, size_t user_size);
void datapool_get_user_data(const struct datapool *pool, void *user_data, size_t user_size);
datapool_medium_e datapool_get_medium(void);
void datapool_setup(datapool_options_st *options);
void datapool_teardown(void);
79 changes: 63 additions & 16 deletions src/datapool/datapool_pmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,53 @@
#include <libpmem.h>
#include <errno.h>

#define DATAPOOL_MODULE_NAME "datapool::pmem"

static bool datapool_init = false;

static char* datapool_path = DATAPOOL_PATH;
static char* datapool_name = DATAPOOL_NAME;
static bool datapool_prefault = DATAPOOL_PREFAULT;


datapool_medium_e
datapool_get_medium(void)
{
if (!datapool_path) {
return DATAPOOL_MEDIUM_SHM;
}
return DATAPOOL_MEDIUM_PMEM;
}

void
datapool_setup(datapool_options_st *options)
{
log_info("set up the %s module", DATAPOOL_MODULE_NAME);

if (datapool_init) {
log_warn("datapool has already been setup, re-creating");
datapool_teardown();
}

if (options != NULL) {
datapool_path = option_str(&options->datapool_path);
datapool_name = option_str(&options->datapool_name);
datapool_prefault = option_bool(&options->datapool_prefault);
}
datapool_init = true;
}

void
datapool_teardown(void)
{
log_info("tear down the %s module", DATAPOOL_MODULE_NAME);

if (!datapool_init) {
log_warn("%s has never been setup", DATAPOOL_MODULE_NAME);
}
datapool_init = false;
}

#define DATAPOOL_SIGNATURE ("PELIKAN") /* 8 bytes */
#define DATAPOOL_SIGNATURE_LEN (sizeof(DATAPOOL_SIGNATURE))

Expand Down Expand Up @@ -72,9 +119,9 @@ datapool_sync(struct datapool *pool)
}

static bool
datapool_valid_user_signature(struct datapool *pool, const char *user_name)
datapool_valid_user_signature(struct datapool *pool)
{
if (cc_strcmp(pool->hdr->user_signature, user_name)) {
if (cc_strcmp(pool->hdr->user_signature, datapool_name)) {
return false;
}
return true;
Expand Down Expand Up @@ -120,7 +167,7 @@ datapool_valid(struct datapool *pool)
}

static void
datapool_initialize(struct datapool *pool, const char *user_name)
datapool_initialize(struct datapool *pool)
{
log_info("initializing fresh datapool");

Expand All @@ -132,7 +179,7 @@ datapool_initialize(struct datapool *pool, const char *user_name)
pool->hdr->version = DATAPOOL_VERSION;
pool->hdr->size = pool->mapped_len;
pool->hdr->flags = 0;
cc_memcpy(pool->hdr->user_signature, user_name, cc_strlen(user_name));
cc_memcpy(pool->hdr->user_signature, datapool_name, cc_strlen(datapool_name));
datapool_sync_hdr(pool);

/* 3. set the signature */
Expand Down Expand Up @@ -163,43 +210,43 @@ datapool_flag_clear(struct datapool *pool, int flag)
* finish successfully.
*/
struct datapool *
datapool_open(const char *path, const char *user_signature, size_t size, int *fresh, bool prefault)
datapool_open(size_t size, int *fresh)
{
struct datapool *pool = cc_alloc(sizeof(*pool));
if (pool == NULL) {
log_error("unable to create allocate memory for pmem mapping");
goto err_alloc;
}

if (user_signature == NULL) {
if (datapool_name == NULL) {
log_error("empty user signature");
goto err_map;
}

if (cc_strnlen(user_signature, DATAPOOL_USER_LAYOUT_LEN) == DATAPOOL_USER_LAYOUT_LEN ) {
log_error("user signature is too long %zu", cc_strlen(user_signature));
if (cc_strnlen(datapool_name, DATAPOOL_USER_LAYOUT_LEN) == DATAPOOL_USER_LAYOUT_LEN ) {
log_error("user signature is too long %zu", cc_strlen(datapool_name));
goto err_map;
}

size_t map_size = size + sizeof(struct datapool_header);

if (path == NULL) { /* fallback to DRAM if pmem is not configured */
if (datapool_path == NULL) { /* fallback to DRAM if pmem is not configured */
pool->addr = cc_zalloc(map_size);
pool->mapped_len = map_size;
pool->is_pmem = 0;
pool->file_backed = 0;
} else {
pool->addr = pmem_map_file(path, map_size, PMEM_FILE_CREATE, 0600,
pool->addr = pmem_map_file(datapool_path, map_size, PMEM_FILE_CREATE, 0600,
&pool->mapped_len, &pool->is_pmem);
pool->file_backed = 1;
}

if (pool->addr == NULL) {
log_error(path == NULL ? strerror(errno) : pmem_errormsg());
log_error(datapool_path == NULL ? strerror(errno) : pmem_errormsg());
goto err_map;
}

if (prefault) {
if (datapool_prefault) {
log_info("prefault datapool");
volatile char *cur_addr = pool->addr;
char *addr_end = (char *)cur_addr + map_size;
Expand All @@ -209,7 +256,7 @@ datapool_open(const char *path, const char *user_signature, size_t size, int *fr
}

log_info("mapped datapool %s with size %llu, is_pmem: %d",
path, pool->mapped_len, pool->is_pmem);
datapool_path, pool->mapped_len, pool->is_pmem);

pool->hdr = pool->addr;
pool->user_addr = (uint8_t *)pool->addr + sizeof(struct datapool_header);
Expand All @@ -223,9 +270,9 @@ datapool_open(const char *path, const char *user_signature, size_t size, int *fr
*fresh = 1;
}

datapool_initialize(pool, user_signature);
} else if (!datapool_valid_user_signature(pool, user_signature)) {
log_error("wrong user signature (%s) used for pool", user_signature);
datapool_initialize(pool);
} else if (!datapool_valid_user_signature(pool)) {
log_error("wrong user signature (%s) used for pool", datapool_name);
goto err_map_adr;
}

Expand Down
44 changes: 42 additions & 2 deletions src/datapool/datapool_shm.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,50 @@
#include <cc_debug.h>
#include <cc_mm.h>

#define DATAPOOL_MODULE_NAME "datapool::shm"

static bool datapool_init = false;

static char* datapool_path = DATAPOOL_PATH;

datapool_medium_e
datapool_get_medium(void)
{
return DATAPOOL_MEDIUM_SHM;
}

void
datapool_setup(datapool_options_st *options)
{
log_info("set up the %s module", DATAPOOL_MODULE_NAME);

if (datapool_init) {
log_warn("datapool has already been setup, re-creating");
datapool_teardown();
}

if (options != NULL) {
datapool_path = option_str(&options->datapool_path);
}
datapool_init = true;
}

void
datapool_teardown(void)
{
log_info("tear down the %s module", DATAPOOL_MODULE_NAME);

if (!datapool_init) {
log_warn("%s has never been setup", DATAPOOL_MODULE_NAME);
}

datapool_init = false;
}

struct datapool *
datapool_open(const char *path, const char *user_signature, size_t size, int *fresh, bool prefault)
datapool_open(size_t size, int *fresh)
{
if (path != NULL) {
if (datapool_path != NULL) {
log_warn("attempted to open a file-based data pool without"
"pmem features enabled");
return NULL;
Expand Down
2 changes: 2 additions & 0 deletions src/server/ds/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ teardown(void)
admin_process_teardown();
process_teardown();
slab_teardown();
datapool_teardown();
compose_teardown();
parse_teardown();
response_teardown();
Expand Down Expand Up @@ -116,6 +117,7 @@ setup(void)
response_setup(&setting.response, &stats.response);
parse_setup(&stats.parse_req, NULL);
compose_setup(NULL, &stats.compose_rsp);
datapool_setup(&setting.datapool);
slab_setup(&setting.slab, &stats.slab);
process_setup(&setting.process, &stats.process);
admin_process_setup();
Expand Down
1 change: 1 addition & 0 deletions src/server/ds/setting.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ struct setting setting = {
{ PROCESS_OPTION(OPTION_INIT) },
{ REQUEST_OPTION(OPTION_INIT) },
{ RESPONSE_OPTION(OPTION_INIT) },
{ DATAPOOL_OPTION(OPTION_INIT) },
{ SLAB_OPTION(OPTION_INIT) },
{ TIME_OPTION(OPTION_INIT) },
{ ARRAY_OPTION(OPTION_INIT) },
Expand Down
2 changes: 2 additions & 0 deletions src/server/ds/setting.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "data/process.h"

#include "core/core.h"
#include "datapool/datapool.h"
#include "storage/slab/item.h"
#include "storage/slab/slab.h"
#include "protocol/data/redis_include.h"
Expand Down Expand Up @@ -37,6 +38,7 @@ struct setting {
process_options_st process;
request_options_st request;
response_options_st response;
datapool_options_st datapool;
slab_options_st slab;
time_options_st time;
/* ccommon libraries */
Expand Down
1 change: 1 addition & 0 deletions src/server/slimcache/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ teardown(void)
admin_process_teardown();
process_teardown();
cuckoo_teardown();
datapool_teardown();
klog_teardown();
compose_teardown();
parse_teardown();
Expand Down
1 change: 1 addition & 0 deletions src/server/slimcache/setting.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ struct setting setting = {
{ KLOG_OPTION(OPTION_INIT) },
{ REQUEST_OPTION(OPTION_INIT) },
{ RESPONSE_OPTION(OPTION_INIT) },
{ DATAPOOL_OPTION(OPTION_INIT) },
{ CUCKOO_OPTION(OPTION_INIT) },
{ TIME_OPTION(OPTION_INIT) },
{ ARRAY_OPTION(OPTION_INIT) },
Expand Down
2 changes: 2 additions & 0 deletions src/server/slimcache/setting.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "data/process.h"

#include "core/core.h"
#include "datapool/datapool.h"
#include "storage/cuckoo/cuckoo.h"
#include "protocol/data/memcache_include.h"
#include "time/time.h"
Expand Down Expand Up @@ -41,6 +42,7 @@ struct setting {
klog_options_st klog;
request_options_st request;
response_options_st response;
datapool_options_st datapool;
cuckoo_options_st cuckoo;
time_options_st time;
/* ccommon libraries */
Expand Down
1 change: 1 addition & 0 deletions src/server/slimds/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ teardown(void)
response_teardown();
request_teardown();
cuckoo_teardown();
datapool_teardown();
procinfo_teardown();
time_teardown();

Expand Down
1 change: 1 addition & 0 deletions src/server/slimds/setting.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ struct setting setting = {
{ PROCESS_OPTION(OPTION_INIT) },
{ REQUEST_OPTION(OPTION_INIT) },
{ RESPONSE_OPTION(OPTION_INIT) },
{ DATAPOOL_OPTION(OPTION_INIT) },
{ CUCKOO_OPTION(OPTION_INIT) },
{ TIME_OPTION(OPTION_INIT) },
{ ARRAY_OPTION(OPTION_INIT) },
Expand Down
2 changes: 2 additions & 0 deletions src/server/slimds/setting.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "data/process.h"

#include "core/core.h"
#include "datapool/datapool.h"
#include "storage/cuckoo/cuckoo.h"
#include "protocol/data/redis_include.h"
#include "time/time.h"
Expand Down Expand Up @@ -36,6 +37,7 @@ struct setting {
process_options_st process;
request_options_st request;
response_options_st response;
datapool_options_st datapool;
cuckoo_options_st cuckoo;
time_options_st time;
/* ccommon libraries */
Expand Down
Loading