remove the NO_SNOWSHOVEL c-preprocessor stuff. There is no way it was working anyway...
git-svn-id: svn+ssh://svn.corp.yahoo.com/yahoo/yrl/labs/pnuts/code/logstore@1480 8dad8b1f-cf64-0410-95b6-bcf113ffbcfe
This commit is contained in:
parent
a00531ae6d
commit
347a4126f3
3 changed files with 5 additions and 122 deletions
31
logstore.cpp
31
logstore.cpp
|
@ -176,9 +176,6 @@ void logtable<TUPLE>::flushTable()
|
||||||
gettimeofday(&start_tv,0);
|
gettimeofday(&start_tv,0);
|
||||||
start = tv_to_double(start_tv);
|
start = tv_to_double(start_tv);
|
||||||
|
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
merge_mgr->finished_merge(0); // XXX will deadlock..
|
|
||||||
#endif
|
|
||||||
|
|
||||||
flushing = true;
|
flushing = true;
|
||||||
bool blocked = false;
|
bool blocked = false;
|
||||||
|
@ -187,11 +184,7 @@ void logtable<TUPLE>::flushTable()
|
||||||
//this waits for the previous merger of the mem-tree
|
//this waits for the previous merger of the mem-tree
|
||||||
//hopefullly this wont happen
|
//hopefullly this wont happen
|
||||||
|
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
while(get_tree_c0_mergeable()) {
|
|
||||||
#else
|
|
||||||
while(get_c0_is_merging()) {
|
while(get_c0_is_merging()) {
|
||||||
#endif
|
|
||||||
rwlc_cond_wait(&c0_needed, header_mut);
|
rwlc_cond_wait(&c0_needed, header_mut);
|
||||||
blocked = true;
|
blocked = true;
|
||||||
if(expmcount != merge_count) {
|
if(expmcount != merge_count) {
|
||||||
|
@ -205,16 +198,10 @@ void logtable<TUPLE>::flushTable()
|
||||||
|
|
||||||
gettimeofday(&stop_tv,0);
|
gettimeofday(&stop_tv,0);
|
||||||
stop = tv_to_double(stop_tv);
|
stop = tv_to_double(stop_tv);
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
set_tree_c0_mergeable(get_tree_c0());
|
|
||||||
#endif
|
|
||||||
pthread_cond_signal(&c0_ready);
|
pthread_cond_signal(&c0_ready);
|
||||||
DEBUG("Signaled c0-c1 merge thread\n");
|
DEBUG("Signaled c0-c1 merge thread\n");
|
||||||
|
|
||||||
merge_count ++;
|
merge_count ++;
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
set_tree_c0(new memTreeComponent<datatuple>::rbtree_t);
|
|
||||||
#endif
|
|
||||||
c0_stats->starting_merge();
|
c0_stats->starting_merge();
|
||||||
|
|
||||||
tsize = 0;
|
tsize = 0;
|
||||||
|
@ -540,23 +527,6 @@ datatuple * logtable<TUPLE>::insertTupleHelper(datatuple *tuple)
|
||||||
}
|
}
|
||||||
merge_mgr->wrote_tuple(0, t); // needs to be here; doesn't grab a mutex.
|
merge_mgr->wrote_tuple(0, t); // needs to be here; doesn't grab a mutex.
|
||||||
|
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
//flushing logic
|
|
||||||
if(tree_bytes >= max_c0_size )
|
|
||||||
{
|
|
||||||
DEBUG("tree size before merge %d tuples %lld bytes.\n", tsize, tree_bytes);
|
|
||||||
|
|
||||||
// NOTE: we hold rb_mut across the (blocking on merge) flushTable. Therefore:
|
|
||||||
// *** Blocking in flushTable is REALLY BAD ***
|
|
||||||
// Because it blocks readers and writers.
|
|
||||||
// The merge policy does its best to make sure flushTable does not block.
|
|
||||||
rwlc_writelock(header_mut);
|
|
||||||
// the test of tree size needs to be atomic with the flushTable, and flushTable needs a writelock.
|
|
||||||
if(tree_bytes >= max_c0_size) {
|
|
||||||
flushTable(); // this needs to hold rb_mut if snowshoveling is disabled, but can't hold rb_mut if snowshoveling is enabled.
|
|
||||||
}
|
|
||||||
rwlc_unlock(header_mut);
|
|
||||||
#endif
|
|
||||||
return pre_t;
|
return pre_t;
|
||||||
}
|
}
|
||||||
template<class TUPLE>
|
template<class TUPLE>
|
||||||
|
@ -590,7 +560,6 @@ void logtable<TUPLE>::insertTuple(datatuple *tuple)
|
||||||
pre_t = insertTupleHelper(tuple);
|
pre_t = insertTupleHelper(tuple);
|
||||||
pthread_mutex_unlock(&rb_mut);
|
pthread_mutex_unlock(&rb_mut);
|
||||||
|
|
||||||
// XXX is it OK to move this after the NO_SNOWSHOVEL block?
|
|
||||||
if(pre_t) {
|
if(pre_t) {
|
||||||
// needs to be here; calls update_progress, which sometimes grabs mutexes..
|
// needs to be here; calls update_progress, which sometimes grabs mutexes..
|
||||||
merge_mgr->read_tuple_from_large_component(0, pre_t); // was interspersed with the erase, insert above...
|
merge_mgr->read_tuple_from_large_component(0, pre_t); // was interspersed with the erase, insert above...
|
||||||
|
|
|
@ -75,15 +75,6 @@ void mergeManager::sleep_on_mini_delta(mergeStats *s, int delta) {
|
||||||
}
|
}
|
||||||
void mergeManager::update_progress(mergeStats * s, int delta) {
|
void mergeManager::update_progress(mergeStats * s, int delta) {
|
||||||
s->delta += delta;
|
s->delta += delta;
|
||||||
#if 0
|
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
if(merge_level < 2 && delta) {
|
|
||||||
#else
|
|
||||||
if(merge_level == 1 && delta) {
|
|
||||||
#endif
|
|
||||||
sleep_on_mini_delta(s, delta);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if((!delta) || s->delta > UPDATE_PROGRESS_DELTA) {
|
if((!delta) || s->delta > UPDATE_PROGRESS_DELTA) {
|
||||||
rwlc_writelock(ltable->header_mut);
|
rwlc_writelock(ltable->header_mut);
|
||||||
|
@ -92,9 +83,6 @@ void mergeManager::update_progress(mergeStats * s, int delta) {
|
||||||
if(!s->need_tick) { s->need_tick = 1; }
|
if(!s->need_tick) { s->need_tick = 1; }
|
||||||
}
|
}
|
||||||
if(s->merge_level == 2
|
if(s->merge_level == 2
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
|| s->merge_level == 1
|
|
||||||
#endif
|
|
||||||
) {
|
) {
|
||||||
if(s->active) {
|
if(s->active) {
|
||||||
s->in_progress = ((double)(s->bytes_in_large + s->bytes_in_small)) / (double)(get_merge_stats(s->merge_level-1)->mergeable_size + s->base_size);
|
s->in_progress = ((double)(s->bytes_in_large + s->bytes_in_small)) / (double)(get_merge_stats(s->merge_level-1)->mergeable_size + s->base_size);
|
||||||
|
@ -104,22 +92,17 @@ void mergeManager::update_progress(mergeStats * s, int delta) {
|
||||||
} else if(s->merge_level == 1) { // C0-C1 merge (c0 is continuously growing...)
|
} else if(s->merge_level == 1) { // C0-C1 merge (c0 is continuously growing...)
|
||||||
if(s->active) {
|
if(s->active) {
|
||||||
s->in_progress = ((double)(s->bytes_in_large+s->bytes_in_small)) / (double)(s->base_size+ltable->mean_c0_effective_size);
|
s->in_progress = ((double)(s->bytes_in_large+s->bytes_in_small)) / (double)(s->base_size+ltable->mean_c0_effective_size);
|
||||||
// if(s->in_progress > 0.95) { s->in_progress = 0.95; }
|
|
||||||
// assert(s->in_progress > -0.01 && s->in_progress < 1.02);
|
|
||||||
} else {
|
} else {
|
||||||
s->in_progress = 0;
|
s->in_progress = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
s->current_size = s->base_size + s->bytes_out - s->bytes_in_large;
|
|
||||||
#else
|
|
||||||
if(s->merge_level == 0) {
|
if(s->merge_level == 0) {
|
||||||
s->current_size = ltable->tree_bytes; // we need to track the number of bytes consumed by the merger; this data is not present in s, so fall back on ltable's aggregate.
|
s->current_size = ltable->tree_bytes; // we need to track the number of bytes consumed by the merger; this data is not present in s, so fall back on ltable's aggregate.
|
||||||
} else {
|
} else {
|
||||||
s->current_size = s->base_size + s->bytes_out - s->bytes_in_large;
|
s->current_size = s->base_size + s->bytes_out - s->bytes_in_large;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
s->out_progress = ((double)s->current_size) / (double)s->target_size;
|
s->out_progress = ((double)s->current_size) / (double)s->target_size;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
gettimeofday(&now, 0);
|
gettimeofday(&now, 0);
|
||||||
|
@ -270,12 +253,7 @@ void mergeManager::tick_based_on_merge_progress(mergeStats *s) {
|
||||||
*/
|
*/
|
||||||
void mergeManager::tick(mergeStats * s) {
|
void mergeManager::tick(mergeStats * s) {
|
||||||
if(s->need_tick) {
|
if(s->need_tick) {
|
||||||
#ifdef NO_SNOWSHOVEL
|
if(s->merge_level == 1) { // apply backpressure based on merge progress.
|
||||||
bool snowshovel = false;
|
|
||||||
#else
|
|
||||||
bool snowshovel = true;
|
|
||||||
#endif
|
|
||||||
if((!snowshovel) || s->merge_level == 1) { // apply backpressure based on merge progress.
|
|
||||||
tick_based_on_merge_progress(s);
|
tick_based_on_merge_progress(s);
|
||||||
} else if(s->merge_level == 0) {
|
} else if(s->merge_level == 0) {
|
||||||
// Simple backpressure algorithm based on how full C0 is.
|
// Simple backpressure algorithm based on how full C0 is.
|
||||||
|
@ -437,7 +415,7 @@ void mergeManager::pretty_print(FILE * out) {
|
||||||
// ((double)c1_totalConsumed)/((double)c1_totalWorktime),
|
// ((double)c1_totalConsumed)/((double)c1_totalWorktime),
|
||||||
// ((double)c2_totalConsumed)/((double)c2_totalWorktime));
|
// ((double)c2_totalConsumed)/((double)c2_totalWorktime));
|
||||||
fflush(out);
|
fflush(out);
|
||||||
#ifdef NO_SNOWSHOVEL
|
#if 0 // XXX would like to bring this back somehow...
|
||||||
assert((!c1->active) || (c1->in_progress >= -0.01 && c1->in_progress < 1.02));
|
assert((!c1->active) || (c1->in_progress >= -0.01 && c1->in_progress < 1.02));
|
||||||
#endif
|
#endif
|
||||||
assert((!c2->active) || (c2->in_progress >= -0.01 && c2->in_progress < 1.10));
|
assert((!c2->active) || (c2->in_progress >= -0.01 && c2->in_progress < 1.10));
|
||||||
|
|
68
merger.cpp
68
merger.cpp
|
@ -72,30 +72,10 @@ void * merge_scheduler::memMergeThread() {
|
||||||
ltable_->merge_mgr->new_merge(1);
|
ltable_->merge_mgr->new_merge(1);
|
||||||
int done = 0;
|
int done = 0;
|
||||||
// 2: wait for c0_mergable
|
// 2: wait for c0_mergable
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
while(!ltable_->get_tree_c0_mergeable())
|
|
||||||
{
|
|
||||||
pthread_cond_signal(<able_->c0_needed);
|
|
||||||
|
|
||||||
if(!ltable_->is_still_running()){
|
|
||||||
done = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DEBUG("mmt:\twaiting for block ready cond\n");
|
|
||||||
|
|
||||||
rwlc_cond_wait(<able_->c0_ready, ltable_->header_mut);
|
|
||||||
|
|
||||||
DEBUG("mmt:\tblock ready\n");
|
|
||||||
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// the merge iterator will wait until c0 is big enough for us to proceed.
|
// the merge iterator will wait until c0 is big enough for us to proceed.
|
||||||
if(!ltable_->is_still_running()) {
|
if(!ltable_->is_still_running()) {
|
||||||
done = 1;
|
done = 1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if(done==1)
|
if(done==1)
|
||||||
{
|
{
|
||||||
pthread_cond_signal(<able_->c1_ready); // no block is ready. this allows the other thread to wake up, and see that we're shutting down.
|
pthread_cond_signal(<able_->c1_ready); // no block is ready. this allows the other thread to wake up, and see that we're shutting down.
|
||||||
|
@ -112,15 +92,6 @@ void * merge_scheduler::memMergeThread() {
|
||||||
|
|
||||||
//create the iterators
|
//create the iterators
|
||||||
diskTreeComponent::iterator *itrA = ltable_->get_tree_c1()->open_iterator();
|
diskTreeComponent::iterator *itrA = ltable_->get_tree_c1()->open_iterator();
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
memTreeComponent<datatuple>::iterator *itrB =
|
|
||||||
new memTreeComponent<datatuple>::iterator(ltable_->get_tree_c0_mergeable());
|
|
||||||
#else
|
|
||||||
// memTreeComponent<datatuple>::revalidatingIterator *itrB =
|
|
||||||
// new memTreeComponent<datatuple>::revalidatingIterator(ltable_->get_tree_c0(), <able_->rb_mut);
|
|
||||||
// memTreeComponent<datatuple>::batchedRevalidatingIterator *itrB =
|
|
||||||
// new memTreeComponent<datatuple>::batchedRevalidatingIterator(ltable_->get_tree_c0(), <able_->tree_bytes, ltable_->max_c0_size, <able_->flushing, 100, <able_->rb_mut);
|
|
||||||
#endif
|
|
||||||
const int64_t min_bloom_target = ltable_->max_c0_size;
|
const int64_t min_bloom_target = ltable_->max_c0_size;
|
||||||
|
|
||||||
//create a new tree
|
//create a new tree
|
||||||
|
@ -129,11 +100,11 @@ void * merge_scheduler::memMergeThread() {
|
||||||
ltable_->set_tree_c1_prime(c1_prime);
|
ltable_->set_tree_c1_prime(c1_prime);
|
||||||
|
|
||||||
rwlc_unlock(ltable_->header_mut);
|
rwlc_unlock(ltable_->header_mut);
|
||||||
#ifndef NO_SNOWSHOVEL
|
|
||||||
// needs to be past the rwlc_unlock...
|
// needs to be past the rwlc_unlock...
|
||||||
memTreeComponent<datatuple>::batchedRevalidatingIterator *itrB =
|
memTreeComponent<datatuple>::batchedRevalidatingIterator *itrB =
|
||||||
new memTreeComponent<datatuple>::batchedRevalidatingIterator(ltable_->get_tree_c0(), <able_->tree_bytes, ltable_->max_c0_size, <able_->flushing, 100, <able_->rb_mut);
|
new memTreeComponent<datatuple>::batchedRevalidatingIterator(ltable_->get_tree_c0(), <able_->tree_bytes, ltable_->max_c0_size, <able_->flushing, 100, <able_->rb_mut);
|
||||||
#endif
|
|
||||||
//: do the merge
|
//: do the merge
|
||||||
DEBUG("mmt:\tMerging:\n");
|
DEBUG("mmt:\tMerging:\n");
|
||||||
|
|
||||||
|
@ -164,12 +135,6 @@ void * merge_scheduler::memMergeThread() {
|
||||||
ltable_->set_tree_c1(c1_prime);
|
ltable_->set_tree_c1(c1_prime);
|
||||||
ltable_->set_tree_c1_prime(0);
|
ltable_->set_tree_c1_prime(0);
|
||||||
|
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
// 11.5: delete old c0_mergeable
|
|
||||||
memTreeComponent<datatuple>::tearDownTree(ltable_->get_tree_c0_mergeable());
|
|
||||||
// 11: c0_mergeable = NULL
|
|
||||||
ltable_->set_tree_c0_mergeable(NULL);
|
|
||||||
#endif
|
|
||||||
ltable_->set_c0_is_merging(false);
|
ltable_->set_c0_is_merging(false);
|
||||||
double new_c1_size = stats->output_size();
|
double new_c1_size = stats->output_size();
|
||||||
pthread_cond_signal(<able_->c0_needed);
|
pthread_cond_signal(<able_->c0_needed);
|
||||||
|
@ -289,11 +254,7 @@ void * merge_scheduler::diskMergeThread()
|
||||||
// 4: do the merge.
|
// 4: do the merge.
|
||||||
//create the iterators
|
//create the iterators
|
||||||
diskTreeComponent::iterator *itrA = ltable_->get_tree_c2()->open_iterator();
|
diskTreeComponent::iterator *itrA = ltable_->get_tree_c2()->open_iterator();
|
||||||
#ifdef NO_SNOWSHOVEL
|
|
||||||
diskTreeComponent::iterator *itrB = ltable_->get_tree_c1_mergeable()->open_iterator();
|
|
||||||
#else
|
|
||||||
diskTreeComponent::iterator *itrB = ltable_->get_tree_c1_mergeable()->open_iterator(<able_->merge_mgr->cur_c1_c2_progress_delta, 0.05, <able_->shutting_down_);
|
diskTreeComponent::iterator *itrB = ltable_->get_tree_c1_mergeable()->open_iterator(<able_->merge_mgr->cur_c1_c2_progress_delta, 0.05, <able_->shutting_down_);
|
||||||
#endif
|
|
||||||
|
|
||||||
//create a new tree
|
//create a new tree
|
||||||
diskTreeComponent * c2_prime = new diskTreeComponent(xid, ltable_->internal_region_size, ltable_->datapage_region_size, ltable_->datapage_size, stats, (ltable_->max_c0_size * *ltable_->R() + stats->base_size)/ 1000);
|
diskTreeComponent * c2_prime = new diskTreeComponent(xid, ltable_->internal_region_size, ltable_->datapage_region_size, ltable_->datapage_size, stats, (ltable_->max_c0_size * *ltable_->R() + stats->base_size)/ 1000);
|
||||||
|
@ -463,39 +424,14 @@ void merge_iterators(int xid,
|
||||||
periodically_force(xid, &i, forceMe, log);
|
periodically_force(xid, &i, forceMe, log);
|
||||||
// cannot free any tuples here; they may still be read through a lookup
|
// cannot free any tuples here; they may still be read through a lookup
|
||||||
}
|
}
|
||||||
#ifndef NO_SNOWSHOVEL
|
|
||||||
if(stats->merge_level == 1) {
|
if(stats->merge_level == 1) {
|
||||||
next_garbage = garbage_collect(ltable, garbage, garbage_len, next_garbage);
|
next_garbage = garbage_collect(ltable, garbage, garbage_len, next_garbage);
|
||||||
garbage[next_garbage] = t2;
|
garbage[next_garbage] = t2;
|
||||||
next_garbage++;
|
next_garbage++;
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
pthread_mutex_lock(<able->rb_mut);
|
|
||||||
if(stats->merge_level == 1) {
|
|
||||||
datatuple * t2tmp = NULL;
|
|
||||||
{
|
|
||||||
memTreeComponent<datatuple>::rbtree_t::iterator rbitr = ltable->get_tree_c0()->find(t2);
|
|
||||||
if(rbitr != ltable->get_tree_c0()->end()) {
|
|
||||||
t2tmp = *rbitr;
|
|
||||||
if((t2tmp->datalen() == t2->datalen()) &&
|
|
||||||
!memcmp(t2tmp->data(), t2->data(), t2->datalen())) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(t2tmp) {
|
|
||||||
ltable->get_tree_c0()->erase(t2);
|
|
||||||
ltable->tree_bytes -= t2->byte_length();
|
|
||||||
datatuple::freetuple(t2tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(<able->rb_mut);
|
|
||||||
#endif
|
|
||||||
if(stats->merge_level != 1) {
|
if(stats->merge_level != 1) {
|
||||||
datatuple::freetuple(t2);
|
datatuple::freetuple(t2);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
datatuple::freetuple(t2);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue