Commit 9d232d1a authored by Bradley C. Kuszmaul's avatar Bradley C. Kuszmaul Committed by Yoni Fogel

More progress. Right now the translation table is overwriting the actual...

More progress.  Right now the translation table is overwriting the actual data.  Addresses  #1000, #1080, #1131.

git-svn-id: file:///svn/tokudb.1131b+1080a@6107 c7de825b-a66e-492c-adef-691d508d4ae1
parent 0cc525b5
...@@ -556,11 +556,14 @@ void toku_verify_counts (BRTNODE node) { ...@@ -556,11 +556,14 @@ void toku_verify_counts (BRTNODE node) {
int toku_serialize_brt_header_size (struct brt_header *h) { int toku_serialize_brt_header_size (struct brt_header *h) {
unsigned int size = (+8 // "tokudata" unsigned int size = (+8 // "tokudata"
+4 // size +4 // size
+4 // tree's nodesize
+4 // version +4 // version
+8 // freelist +4 // tree's nodesize
+8 // unused memory +8 // free blocks
+4); // n_named_roots +8 // unused blocks
+4 // n_named_roots
+8 // max_blocknum_translated
+8 // block_translation_address_on_disk
);
if (h->n_named_roots<0) { if (h->n_named_roots<0) {
size+=(+8 // diskoff size+=(+8 // diskoff
+4 // flags +4 // flags
...@@ -587,7 +590,7 @@ int toku_serialize_brt_header_to_wbuf (struct wbuf *wbuf, struct brt_header *h) ...@@ -587,7 +590,7 @@ int toku_serialize_brt_header_to_wbuf (struct wbuf *wbuf, struct brt_header *h)
wbuf_BLOCKNUM(wbuf, h->free_blocks); wbuf_BLOCKNUM(wbuf, h->free_blocks);
wbuf_BLOCKNUM(wbuf, h->unused_blocks); wbuf_BLOCKNUM(wbuf, h->unused_blocks);
wbuf_int (wbuf, h->n_named_roots); wbuf_int (wbuf, h->n_named_roots);
if (h->block_translation_address_on_disk !=0 ) { if (h->block_translation_address_on_disk != 0) {
block_allocator_free_block(h->block_allocator, h->block_translation_address_on_disk); block_allocator_free_block(h->block_allocator, h->block_translation_address_on_disk);
} }
block_allocator_alloc_block(h->block_allocator, 4 + 8*h->max_blocknum_translated, &h->block_translation_address_on_disk); block_allocator_alloc_block(h->block_allocator, 4 + 8*h->max_blocknum_translated, &h->block_translation_address_on_disk);
...@@ -627,13 +630,16 @@ int toku_serialize_brt_header_to (int fd, struct brt_header *h) { ...@@ -627,13 +630,16 @@ int toku_serialize_brt_header_to (int fd, struct brt_header *h) {
{ {
struct wbuf w; struct wbuf w;
u_int64_t size = 4 + h->max_blocknum_translated * 8; // 4 for the checksum u_int64_t size = 4 + h->max_blocknum_translated * 8; // 4 for the checksum
printf("%s:%d writing translation table of size %ld\n", __FILE__, __LINE__, size);
wbuf_init(&w, toku_malloc(size), size); wbuf_init(&w, toku_malloc(size), size);
u_int64_t i; u_int64_t i;
for (i=0; i<h->max_blocknum_translated; i++) { for (i=0; i<h->max_blocknum_translated; i++) {
wbuf_ulonglong(&w, h->block_translation[i].diskoff); wbuf_ulonglong(&w, h->block_translation[i].diskoff);
wbuf_ulonglong(&w, h->block_translation[i].size); wbuf_ulonglong(&w, h->block_translation[i].size);
} }
wbuf_int(&w, x1764_finish(&w.checksum)); u_int32_t checksum = x1764_finish(&w.checksum);
printf("%s:%d writing to %ld, checksum=%d offset=%d size=%ld\n", __FILE__, __LINE__, h->block_translation_address_on_disk, checksum, w.ndone, size);
wbuf_int(&w, checksum);
ssize_t nwrote = pwrite(fd, w.buf, size, h->block_translation_address_on_disk); ssize_t nwrote = pwrite(fd, w.buf, size, h->block_translation_address_on_disk);
assert(nwrote==(ssize_t)size); assert(nwrote==(ssize_t)size);
toku_free(w.buf); toku_free(w.buf);
...@@ -670,10 +676,9 @@ int deserialize_brtheader (u_int32_t size, int fd, DISKOFF off, struct brt_heade ...@@ -670,10 +676,9 @@ int deserialize_brtheader (u_int32_t size, int fd, DISKOFF off, struct brt_heade
h->block_translation_address_on_disk = rbuf_diskoff(&rc); h->block_translation_address_on_disk = rbuf_diskoff(&rc);
// Set up the the block translation buffer. // Set up the the block translation buffer.
create_block_allocator(&h->block_allocator, h->nodesize); create_block_allocator(&h->block_allocator, h->nodesize);
if (h->max_blocknum_translated == 0) { if (h->block_translation_address_on_disk == 0) {
h->block_translation = 0; h->block_translation = 0;
} else { } else {
//
block_allocator_alloc_block_at(h->block_allocator, h->block_translation_address_on_disk, h->block_translation_size_on_disk); block_allocator_alloc_block_at(h->block_allocator, h->block_translation_address_on_disk, h->block_translation_size_on_disk);
XMALLOC_N(h->max_blocknum_translated, h->block_translation); XMALLOC_N(h->max_blocknum_translated, h->block_translation);
unsigned char *XMALLOC_N(h->block_translation_size_on_disk, tbuf); unsigned char *XMALLOC_N(h->block_translation_size_on_disk, tbuf);
...@@ -684,7 +689,9 @@ int deserialize_brtheader (u_int32_t size, int fd, DISKOFF off, struct brt_heade ...@@ -684,7 +689,9 @@ int deserialize_brtheader (u_int32_t size, int fd, DISKOFF off, struct brt_heade
{ {
// check the checksum // check the checksum
u_int32_t x1764 = x1764_memory(tbuf, h->block_translation_size_on_disk - 4); u_int32_t x1764 = x1764_memory(tbuf, h->block_translation_size_on_disk - 4);
u_int32_t stored_x1764 = ntohl(*(int*)(tbuf + h->block_translation_size_on_disk - 4)); u_int64_t offset = h->block_translation_size_on_disk - 4;
printf("%s:%d read from %ld (x1764 offset=%ld) size=%ld\n", __FILE__, __LINE__, h->block_translation_address_on_disk, offset, h->block_translation_size_on_disk);
u_int32_t stored_x1764 = ntohl(*(int*)(tbuf + offset));
assert(x1764 == stored_x1764); assert(x1764 == stored_x1764);
} }
// now read all that data. // now read all that data.
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h> #include <unistd.h>
#include "block_allocator.h"
#include "toku_assert.h" #include "toku_assert.h"
#include "brt-internal.h" #include "brt-internal.h"
#include "key.h" #include "key.h"
...@@ -2155,6 +2156,11 @@ static int brt_alloc_init_header(BRT t, const char *dbname, TOKUTXN txn) { ...@@ -2155,6 +2156,11 @@ static int brt_alloc_init_header(BRT t, const char *dbname, TOKUTXN txn) {
t->h->nodesize=t->nodesize; t->h->nodesize=t->nodesize;
t->h->free_blocks = make_blocknum(-1); t->h->free_blocks = make_blocknum(-1);
t->h->unused_blocks=make_blocknum(2); t->h->unused_blocks=make_blocknum(2);
t->h->max_blocknum_translated = 0;
t->h->block_translation = 0;
t->h->block_translation_size_on_disk = 0;
t->h->block_translation_address_on_disk = 0;
create_block_allocator(&t->h->block_allocator, t->nodesize);
toku_fifo_create(&t->h->fifo); toku_fifo_create(&t->h->fifo);
t->root_put_counter = global_root_put_counter++; t->root_put_counter = global_root_put_counter++;
if (dbname) { if (dbname) {
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "cachetable-rwlock.h" #include "cachetable-rwlock.h"
// execute the cachetable callbacks using a writer thread 0->no 1->yes // execute the cachetable callbacks using a writer thread 0->no 1->yes
#define DO_WRITER_THREAD 1 #define DO_WRITER_THREAD 0
#if DO_WRITER_THREAD #if DO_WRITER_THREAD
static void *cachetable_writer(void *); static void *cachetable_writer(void *);
#endif #endif
......
...@@ -10,6 +10,15 @@ ...@@ -10,6 +10,15 @@
{ {
compress_is_not_valgrind_clean2 compress_is_not_valgrind_clean2
Memcheck:Cond Memcheck:Cond
fun:longest_match
fun:deflate_fast
fun:deflate
fun:compress2
}
{
compress_is_not_valgrind_clean3
Memcheck:Cond
obj:/usr/lib64/libz.so.1.2.3 obj:/usr/lib64/libz.so.1.2.3
obj:/usr/lib64/libz.so.1.2.3 obj:/usr/lib64/libz.so.1.2.3
fun:deflate fun:deflate
......
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