Commit d5312ffb authored by Zardosht Kasheff's avatar Zardosht Kasheff

addresses #523

address CR comments from previous checkin

git-svn-id: file:///svn/tokudb@2791 c7de825b-a66e-492c-adef-691d508d4ae1
parent c3f89d45
......@@ -22,6 +22,25 @@
struct __toku_range_tree_local {
//Logarithmic non-overlapping version only fields:
struct toku_rbt_tree* rbt;
/*
* if iter_at_beginning is TRUE, then iteration is at beginning,
* if iter_at_beginning is FALSE and iterator_finger is NOT NULL,
* iteration is ongoing,
* if iter_at_beginning is FALSE and iterator_finger is NULL,
* iteration has ended or in invalid state.
*/
/*
* BOOL that says if iteration is at beginning.
* If at beginning, toku_rt_next returns first element
* in the range_tree, otherwise returns successor of curr_range
*/
BOOL iter_at_beginning;
/**
* The range we are currently at in the iterator, if it is set to NULL, that means
* the iteration is no longer valid and/or the iteration is done
* */
struct toku_rbt_node* iterator_finger;
};
#include <rangetree-internal.h>
......@@ -61,8 +80,8 @@ int toku_rt_create(toku_range_tree** ptree,
* Start range tree in invalid iteration state, toku_rt_start_scan must
* be called to start iteration
*/
temptree->iter_at_beginning = FALSE;
temptree->successor_finger = NULL;
temptree->i.iter_at_beginning = FALSE;
temptree->i.iterator_finger = NULL;
*ptree = temptree;
r = 0;
cleanup:
......@@ -191,7 +210,7 @@ int toku_rt_insert(toku_range_tree* tree, toku_range* range) {
/*
* invalidate iteration, because we have inserted node
*/
tree->successor_finger = NULL;
tree->i.iterator_finger = NULL;
r = 0;
cleanup:
return r;
......@@ -232,7 +251,7 @@ int toku_rt_delete(toku_range_tree* tree, toku_range* range) {
/*
* invalidate iteration, because we have deleted node
*/
tree->successor_finger = NULL;
tree->i.iterator_finger = NULL;
tree->numelements--;
r = 0;
cleanup:
......@@ -343,8 +362,9 @@ int toku_rt_get_size(toku_range_tree* tree, u_int32_t* size) {
}
void toku_rt_start_scan (toku_range_tree* range_tree) {
range_tree->iter_at_beginning = TRUE;
range_tree->successor_finger = NULL;
assert(range_tree);
range_tree->i.iter_at_beginning = TRUE;
range_tree->i.iterator_finger = NULL;
return;
}
......@@ -354,12 +374,13 @@ int toku_rt_next (toku_range_tree* range_tree, toku_range* out_range) {
struct toku_rbt_node* ignore_insert = NULL;
if (!range_tree || !out_range) { r = EINVAL; goto cleanup; }
/* Check to see if range tree is in invalid iteation state */
if (!range_tree->iter_at_beginning && !range_tree->successor_finger)
{ r = EDOM; goto cleanup; }
if (!range_tree->i.iter_at_beginning && !range_tree->i.iterator_finger){
r = EDOM; goto cleanup;
}
if (range_tree->iter_at_beginning) {
if (range_tree->i.iter_at_beginning) {
r = toku_rbt_lookup(RB_LUFIRST, NULL, range_tree->i.rbt,
&ignore_insert, &range_tree->successor_finger, &ret_range);
&ignore_insert, &range_tree->i.iterator_finger, &ret_range);
if (r != 0) { goto cleanup; }
}
else {
......@@ -368,7 +389,7 @@ int toku_rt_next (toku_range_tree* range_tree, toku_range* out_range) {
* or because of some unexpected error, ret_range will have the value of NULL,
* which we want to return to the user in such cases
*/
r = toku_rbt_finger_successor(&range_tree->successor_finger, &ret_range);
r = toku_rbt_finger_successor(&range_tree->i.iterator_finger, &ret_range);
if (r != 0) { goto cleanup; }
}
......
......@@ -35,25 +35,6 @@ struct __toku_range_tree {
/** The user realloc function */
void* (*realloc)(void*, size_t);
/*
* if iter_at_beginning is TRUE, then iteration is at beginning,
* if iter_at_beginning is FALSE and successor_finger is NOT NULL,
* iteration is ongoing,
* if iter_at_beginning is FALSE and successor_finger is NULL,
* iteration has ended or in invalid state.
*/
/*
* BOOL that says if iteration is at beginning.
* If at beginning, toku_rt_next returns first element
* in the range_tree, otherwise returns successor of curr_range
*/
BOOL iter_at_beginning;
/**
* The range we are currently at in the iterator, if it is set to NULL, that means
* the iteration is no longer valid and/or the iteration is done
* */
struct toku_rbt_node* successor_finger;
toku_range_tree_local i;
};
......
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