Commit 2b718739 authored by Christian Rober's avatar Christian Rober Committed by Yoni Fogel

[t:4567] Merging fixes to recent error reporting changes.

git-svn-id: file:///svn/toku/tokudb@41843 c7de825b-a66e-492c-adef-691d508d4ae1
parent 5dce42f5
......@@ -1256,7 +1256,7 @@ verify_brtnode_sub_block (struct sub_block *sb)
}
// This function deserializes the data stored by serialize_brtnode_info
static void
static enum deserialize_error_code
deserialize_brtnode_info(
struct sub_block *sb,
BRTNODE node
......@@ -1266,7 +1266,12 @@ deserialize_brtnode_info(
// this function puts that information into node
// first verify the checksum
verify_brtnode_sub_block(sb);
enum deserialize_error_code e = DS_OK;
e = verify_brtnode_sub_block(sb);
if (e != DS_OK) {
goto exit;
}
u_int32_t data_size = sb->uncompressed_size - 4; // checksum is 4 bytes at end
// now with the data verified, we can read the information into the node
......@@ -1320,6 +1325,8 @@ deserialize_brtnode_info(
dump_bad_block(rb.buf, rb.size);
assert(FALSE);
}
exit:
return e;
}
static void
......@@ -1598,10 +1605,8 @@ deserialize_brtnode_header_from_rbuf_if_small_enough (BRTNODE *brtnode,
u_int32_t stored_checksum = rbuf_int(rb);
if (stored_checksum != checksum) {
dump_bad_block(rb->buf, rb->size);
if (stored_checksum != checksum) {
e = DS_XSUM_FAIL;
goto cleanup;
}
e = DS_XSUM_FAIL;
goto cleanup;
}
// Now we want to read the pivot information.
......@@ -1639,7 +1644,11 @@ deserialize_brtnode_header_from_rbuf_if_small_enough (BRTNODE *brtnode,
);
// at this point sb->uncompressed_ptr stores the serialized node info.
deserialize_brtnode_info(&sb_node_info, node);
e = deserialize_brtnode_info(&sb_node_info, node);
if (e != DS_OK) {
goto cleanup;
}
toku_free(sb_node_info.uncompressed_ptr);
sb_node_info.uncompressed_ptr = NULL;
......@@ -2255,7 +2264,10 @@ deserialize_brtnode_from_rbuf(
}
// at this point, sb->uncompressed_ptr stores the serialized node info
deserialize_brtnode_info(&sb_node_info, node);
e = deserialize_brtnode_info(&sb_node_info, node);
if (e != DS_OK) {
goto cleanup;
}
toku_free(sb_node_info.uncompressed_ptr);
// now that the node info has been deserialized, we can proceed to deserialize
......@@ -2327,6 +2339,10 @@ deserialize_brtnode_from_rbuf(
cleanup:
if (r != 0) {
e = DS_ERRNO;
// NOTE: Right now, callers higher in the stack will assert on
// failure, so this is OK for production. However, if we
// create tools that use this function to search for errors in
// the BRT, then we will leak memory.
if (node) toku_free(node);
}
......@@ -2429,7 +2445,7 @@ toku_deserialize_brtnode_from (int fd,
read_brtnode_header_from_fd_into_rbuf_if_small_enough(fd, blocknum, bfe->h, &rb);
e = deserialize_brtnode_header_from_rbuf_if_small_enough(brtnode, ndd, blocknum, fullhash, bfe, &rb, fd);
if (e == DS_ERRNO) {
if (e != DS_OK) { //<CER> ??? Change this to != DS_OK?
e = DS_OK;
toku_free(rb.buf);
rb = RBUF_INITIALIZER;
......
......@@ -798,23 +798,22 @@ int toku_brtnode_fetch_callback (CACHEFILE UU(cachefile), int fd, BLOCKNUM noden
// deserialize the node, must pass the bfe in because we cannot
// evaluate what piece of the the node is necessary until we get it at
// least partially into memory
// <CER> TODO: Use checksum error code as a return HERE!
enum deserialize_error_code e;
int r = 0;
e = toku_deserialize_brtnode_from(fd, nodename, fullhash, node, ndd, bfe);
if (e == DS_XSUM_FAIL) {
fprintf(stderr, "Checksum failure while reading node in file %s.\n", toku_cachefile_fname_in_env(cachefile));
assert(false); // make absolutely sure we crash before doing anything else
} else if (e == DS_ERRNO) {
r = errno;
} else if (e == DS_OK) {
r = 0;
} else {
if (e != DS_OK) {
if (e == DS_XSUM_FAIL) {
fprintf(stderr,
"Checksum failure while reading node in file %s.\n",
toku_cachefile_fname_in_env(cachefile));
} else if (e == DS_ERRNO) {
r = errno;
fprintf(stderr, "Error deserializing node, errno = %d", r);
}
// make absolutely sure we crash before doing anything else.
assert(false);
}
/*
int r = toku_deserialize_brtnode_from(fd, nodename, fullhash, node, ndd, bfe);
*/
if (r == 0) {
(*node)->h = bfe->h; // copy reference to header from bfe
*sizep = make_brtnode_pair_attr(*node);
......@@ -1224,12 +1223,19 @@ int toku_brtnode_pf_callback(void* brtnode_pv, void* disk_data, void* read_extra
}
if (e != DS_OK) {
fprintf(stderr, "Unknown failure while reading node in file %s.\n", toku_cachefile_fname_in_env(bfe->h->cf));
if (e == DS_XSUM_FAIL) {
fprintf(stderr,
"Checksum failure while reading node partition in file %s.\n",
toku_cachefile_fname_in_env(bfe->h->cf));
} else if (e == DS_ERRNO) {
fprintf(stderr,
"Error while reading node partition %d\n",
errno);
}
assert(false);
}
}
cilk_sync;
*sizep = make_brtnode_pair_attr(node);
return 0;
......
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