Commit 6b831c18 authored by Geoff Simmons's avatar Geoff Simmons

trackrdrd: add field for shard key to the data table

parent e427d6dc
......@@ -120,6 +120,7 @@ CONF_Add(const char *lval, const char *rval)
confUnsigned("maxopen.scale", maxopen_scale);
confUnsigned("maxdata", maxdata);
confUnsigned("maxkeylen", maxkeylen);
confUnsigned("qlen.goal", qlen_goal);
confUnsigned("hash.max_probes", hash_max_probes);
confUnsigned("hash.ttl", hash_ttl);
......@@ -198,6 +199,7 @@ CONF_Init(void)
config.maxopen_scale = DEF_MAXOPEN_SCALE;
config.maxdone = DEF_MAXDONE;
config.maxdata = DEF_MAXDATA;
config.maxkeylen = DEF_MAXKEYLEN;
config.qlen_goal = DEF_QLEN_GOAL;
config.hash_max_probes = DEF_HASH_MAX_PROBES;
config.hash_ttl = DEF_HASH_TTL;
......@@ -249,6 +251,7 @@ CONF_Dump(void)
confdump("maxopen.scale = %u", config.maxopen_scale);
confdump("maxdone = %u", config.maxdone);
confdump("maxdata = %u", config.maxdata);
confdump("maxkeylen = %u", config.maxkeylen);
confdump("qlen.goal = %u", config.qlen_goal);
confdump("hash.max_probes = %u", config.hash_max_probes);
confdump("hash.ttl = %u", config.hash_ttl);
......
......@@ -53,7 +53,7 @@ DATA_Init(void)
dataentry *entryptr;
char *bufptr;
unsigned bufsize = config.maxdata;
unsigned bufsize = config.maxdata + config.maxkeylen;
/*
* we want enough space to accomodate all open and done records
......@@ -87,6 +87,7 @@ DATA_Init(void)
dtbl.entry[i].state = DATA_EMPTY;
dtbl.entry[i].hasdata = false;
dtbl.entry[i].data = &dtbl.buf[i * bufsize];
dtbl.entry[i].key = &dtbl.buf[(i * bufsize) + config.maxdata];
VSTAILQ_INSERT_TAIL(&dtbl.freehead, &dtbl.entry[i], freelist);
dtbl.nfree++;
}
......@@ -130,9 +131,10 @@ DATA_Dump1(dataentry *entry, int i)
{
if (entry->state == DATA_EMPTY)
return;
LOG_Log(LOG_INFO, "Data entry %d: XID=%d tid=%d state=%s data=[%.*s]",
i, entry->xid, entry->tid, statename[entry->state], entry->end,
entry->data);
LOG_Log(LOG_INFO,
"Data entry %d: XID=%d tid=%d state=%s data=[%.*s] key=[%.*s]",
i, entry->xid, entry->tid, statename[entry->state], entry->end,
entry->data, entry->keylen, entry->key);
}
void
......
......@@ -22,7 +22,7 @@ CMD="../trackrdrd -D -f varnish.binlog -l - -d -c test.conf"
# the user running it
CKSUM=$( $CMD | sed -e 's/\(initializing\) \(.*\)/\1/' | sed -e 's/\(Running as\) \([a-zA-Z0-9]*\)$/\1/' | grep -v 'Not running as root' | cksum)
if [ "$CKSUM" != '2459426004 234127' ]; then
if [ "$CKSUM" != '1900415110 234158' ]; then
echo "ERROR: Regression test incorrect cksum: $CKSUM"
exit 1
fi
......
......@@ -36,7 +36,6 @@
#include "../trackrdrd.h"
int tests_run = 0;
static char errmsg[BUFSIZ];
static struct freehead_s local_freehead
= VSTAILQ_HEAD_INITIALIZER(local_freehead);
......@@ -49,13 +48,45 @@ static char
printf("... testing data table initialization\n");
config.maxopen_scale = 10;
config.maxdone = 1024;
config.maxopen_scale = DEF_MAXOPEN_SCALE;
config.maxdone = DEF_MAXDONE;
config.maxdata = DEF_MAXDATA;
config.maxkeylen = DEF_MAXKEYLEN;
err = DATA_Init();
sprintf(errmsg, "DATA_Init: %s", strerror(err));
mu_assert(errmsg, err == 0);
sprintf(errmsg, "DATA_Init: expected table length 2048, got %d", dtbl.len);
mu_assert(errmsg, dtbl.len == 2048);
VMASSERT(err == 0, "DATA_Init: %s", strerror(err));
VMASSERT(dtbl.len == 2048, "DATA_Init: expected table length 2048, got %d",
dtbl.len);
for (int i = 0; i < dtbl.len; i++) {
MCHECK_OBJ_NOTNULL(&dtbl.entry[i], DATA_MAGIC);
MASSERT(dtbl.entry[i].state == DATA_EMPTY);
MASSERT(!dtbl.entry[i].hasdata);
MAN(dtbl.entry[i].data);
MAN(dtbl.entry[i].key);
}
return NULL;
}
static const char
*test_data_set_get(void)
{
char data[DEF_MAXDATA], key[DEF_MAXKEYLEN];
printf("... testing data write and read\n");
for (int i = 0; i < dtbl.len; i++) {
memset(dtbl.entry[i].data, 'd', DEF_MAXDATA);
memset(dtbl.entry[i].key, 'k', DEF_MAXKEYLEN);
}
memset(data, 'd', DEF_MAXDATA);
memset(key, 'k', DEF_MAXKEYLEN);
for (int i = 0; i < dtbl.len; i++) {
MASSERT(memcmp(dtbl.entry[i].data, data, DEF_MAXDATA) == 0);
MASSERT(memcmp(dtbl.entry[i].key, key, DEF_MAXKEYLEN) == 0);
}
return NULL;
}
......@@ -67,14 +98,14 @@ static const char
DATA_Take_Freelist(&local_freehead);
mu_assert("Local freelist empty after take",
!VSTAILQ_EMPTY(&local_freehead));
MASSERT0(!VSTAILQ_EMPTY(&local_freehead),
"Local freelist empty after take");
sprintf(errmsg, "Global free count non-zero after take (%u)", dtbl.nfree);
mu_assert(errmsg, dtbl.nfree == 0);
VMASSERT(dtbl.nfree == 0, "Global free count non-zero after take (%u)",
dtbl.nfree);
mu_assert("Global free list non-empty after take",
VSTAILQ_EMPTY(&dtbl.freehead));
MASSERT0(VSTAILQ_EMPTY(&dtbl.freehead),
"Global free list non-empty after take");
return NULL;
}
......@@ -86,15 +117,15 @@ static const char
DATA_Return_Freelist(&local_freehead, 2048);
mu_assert("Local freelist non-empty after return",
VSTAILQ_EMPTY(&local_freehead));
MASSERT0(VSTAILQ_EMPTY(&local_freehead),
"Local freelist non-empty after return");
sprintf(errmsg, "Expected global free count == 2048 after return (%u)",
dtbl.nfree);
mu_assert(errmsg, dtbl.nfree == 2048);
VMASSERT(dtbl.nfree == 2048,
"Expected global free count == 2048 after return (%u)",
dtbl.nfree);
mu_assert("Global free list empty after take",
!VSTAILQ_EMPTY(&dtbl.freehead));
MASSERT0(!VSTAILQ_EMPTY(&dtbl.freehead),
"Global free list empty after take");
return NULL;
}
......@@ -103,6 +134,7 @@ static const char
*all_tests(void)
{
mu_run_test(test_data_init);
mu_run_test(test_data_set_get);
mu_run_test(test_data_take);
mu_run_test(test_data_return);
return NULL;
......
......@@ -135,6 +135,8 @@ struct dataentry_s {
bool incomplete; /* expired or evacuated */
char *data;
char *key;
unsigned keylen;
};
typedef struct dataentry_s dataentry;
......@@ -271,6 +273,9 @@ struct config {
unsigned maxdata; /* size of char data buffer */
#define DEF_MAXDATA 1024
unsigned maxkeylen; /* size of shard key buffer */
#define DEF_MAXKEYLEN 128
/*
* queue-length goal:
*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment