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