diff options
author | Magnus Ahltorp <map@kth.se> | 2016-02-11 03:41:05 +0100 |
---|---|---|
committer | Linus Nordberg <linus@nordu.net> | 2016-04-25 13:14:10 +0200 |
commit | 43cbe3fdd2ba375b278d198d52f700b2accf65f6 (patch) | |
tree | 0aabcf3a67aaba2307a4e1a710769343e3fafd26 /c_src/permdbtest.c | |
parent | d1ea31e0818038452dab54afe8b6350d08075318 (diff) |
Added permdbtest
Diffstat (limited to 'c_src/permdbtest.c')
-rw-r--r-- | c_src/permdbtest.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/c_src/permdbtest.c b/c_src/permdbtest.c new file mode 100644 index 0000000..0d3bab7 --- /dev/null +++ b/c_src/permdbtest.c @@ -0,0 +1,123 @@ +#define _GNU_SOURCE +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <assert.h> +#include <stdarg.h> +#include <stdint.h> +#include <arpa/inet.h> +#include <fcntl.h> +#include <err.h> +#include <sys/resource.h> +#include "permdb.h" +#ifdef HAVE_COMMON_CRYPTO +#include <CommonCrypto/CommonDigest.h> +#else +#include <rhash.h> +#endif +static void +usage() +{ + errx(1, "usage: permdbtest <store> <entries> <datasize> <fsync>"); +} + +void * +gentestdata(long long nentries) +{ +#ifndef HAVE_COMMON_CRYPTO + rhash_library_init(); +#endif + unsigned char *testdata = malloc(nentries * 32 * 2); + for (long long i = 0; i < nentries; i++) { + uint32_t key[2]; + uint32_t value[2]; + key[0] = htonl(i); + key[1] = htonl(0); + value[0] = htonl(i); + value[1] = htonl(1); +#ifdef HAVE_COMMON_CRYPTO + CC_SHA256(key, sizeof(key), testdata + i * 32 * 2); + CC_SHA256(value, sizeof(value), testdata + i * 32 * 2 + 32); +#else + rhash_msg(RHASH_SHA256, key, sizeof(key), testdata + i * 32 * 2); + rhash_msg(RHASH_SHA256, value, sizeof(value), testdata + i * 32 * 2 + 32); +#endif + } + return testdata; +} + +int +main(int argc, char *argv[]) +{ + if (argc != 5) { + usage(); + } + const char *store = argv[1]; + long long nentries = atol(argv[2]); + int datasize = atoi(argv[3]); + int nfsync = atoi(argv[4]); + + permdb_object *state = permdb_alloc(store); + + printf("generating test data\n"); + void *testdata = gentestdata(nentries); + printf("inserting test data\n"); + int written_since_fsync = 0; + int datamultiplier = datasize / 32; + if (datasize % 32 != 0) { + printf("datasize %d not multiple of 32, truncating to %d\n", datasize, datamultiplier * 32); + } + datasize = datamultiplier * 32; + unsigned char *value = malloc(datasize); + for (long long i = 0; i < nentries; i++) { + unsigned char *key = testdata + i * 32 * 2; + for (int j = 0; j < datamultiplier; j++) { + memcpy(value + j * 32, testdata + i * 32 * 2 + 32, 32); + } + + int result = addvalue(state, key, 32, value, datasize); + if (result < 0) { + errx(1, "addvalue: %d\n", result); + } + written_since_fsync += 1; + if (written_since_fsync >= nfsync) { + result = committree(state); + if (result < 0) { + errx(1, "committree: %d\n", result); + } + written_since_fsync = 0; + } + } + free(value); + int result = committree(state); + if (result < 0) { + errx(1, "committree: %d\n", result); + } + written_since_fsync = 0; + + printf("reading test data\n"); + for (long long i = 0; i < nentries; i++) { + unsigned char *key = testdata + i * 32 * 2; + size_t datalen; + unsigned char *result = getvalue(state, key, 32, &datalen); + if (datalen != datasize) { + errx(1, "getvalue returned datalen %zd\n", datalen); + } + for (int j = 0; j < datamultiplier; j++) { + if (memcmp(result + j * 32, testdata + i * 32 * 2 + 32, 32)) { + errx(1, "getvalue returned incorrect data\n"); + } + } + free(result); + } + + struct rusage rusage; + getrusage(RUSAGE_SELF, &rusage); + fprintf(stderr, "user %ld.%d sys %ld.%d maxrss %ld M\n", rusage.ru_utime.tv_sec, (int)rusage.ru_utime.tv_usec, rusage.ru_stime.tv_sec, (int)rusage.ru_utime.tv_usec, rusage.ru_maxrss/1024); + + free(testdata); + permdb_free(state); + + return 0; +} |