add hacky garbage collection mechanism
git-svn-id: svn+ssh://svn.corp.yahoo.com/yahoo/yrl/labs/pnuts/code/logstore@2484 8dad8b1f-cf64-0410-95b6-bcf113ffbcfe
This commit is contained in:
parent
c910a7af8f
commit
ae7c827ab5
3 changed files with 24 additions and 3 deletions
18
logstore.cpp
18
logstore.cpp
|
@ -538,7 +538,21 @@ datatuple * logtable<TUPLE>::findTuple_first(int xid, datatuple::key_t key, size
|
||||||
template<class TUPLE>
|
template<class TUPLE>
|
||||||
datatuple * logtable<TUPLE>::insertTupleHelper(datatuple *tuple)
|
datatuple * logtable<TUPLE>::insertTupleHelper(datatuple *tuple)
|
||||||
{
|
{
|
||||||
//find the previous tuple with same key in the memtree if exists
|
bool need_free = true;
|
||||||
|
if(!tuple->isDelete() && expiry != 0) {
|
||||||
|
// XXX hack for paper experiment
|
||||||
|
current_timestamp++;
|
||||||
|
size_t ts_sz = sizeof(int64_t);
|
||||||
|
int64_t ts = current_timestamp;
|
||||||
|
int64_t kl = tuple->strippedkeylen();
|
||||||
|
byte * newkey = (byte*)malloc(kl + 1 + ts_sz);
|
||||||
|
memcpy(newkey, tuple->strippedkey(), kl);
|
||||||
|
newkey[kl] = 0;
|
||||||
|
memcpy(newkey+kl+1, &ts, ts_sz);
|
||||||
|
tuple = datatuple::create(newkey, kl+ 1+ ts_sz, tuple->data(), tuple->datalen());
|
||||||
|
free(newkey);
|
||||||
|
need_free = true;
|
||||||
|
} //find the previous tuple with same key in the memtree if exists
|
||||||
memTreeComponent<datatuple>::rbtree_t::iterator rbitr = tree_c0->find(tuple);
|
memTreeComponent<datatuple>::rbtree_t::iterator rbitr = tree_c0->find(tuple);
|
||||||
datatuple * t = 0;
|
datatuple * t = 0;
|
||||||
datatuple * pre_t = 0;
|
datatuple * pre_t = 0;
|
||||||
|
@ -562,6 +576,8 @@ datatuple * logtable<TUPLE>::insertTupleHelper(datatuple *tuple)
|
||||||
tree_c0->insert(t);
|
tree_c0->insert(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(need_free) { TUPLE::freetuple(tuple); }
|
||||||
|
|
||||||
return pre_t;
|
return pre_t;
|
||||||
}
|
}
|
||||||
template<class TUPLE>
|
template<class TUPLE>
|
||||||
|
|
|
@ -33,7 +33,7 @@ bool insert_filter(logtable<datatuple> * ltable, datatuple * t, bool dropDeletes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!ltable->expiry) { return true; }
|
if(!ltable->expiry) { return true; }
|
||||||
if(t->timestamp() > ltable->current_timestamp + ltable->expiry) { return false; }
|
if(t->timestamp() < ltable->current_timestamp - ltable->expiry) { return false; }
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ int main(int argc, char *argv[])
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
int64_t c0_size = 1024 * 1024 * 512 * 1;
|
int64_t c0_size = 1024 * 1024 * 512 * 1;
|
||||||
int log_mode = 0; // do not log by default.
|
int log_mode = 0; // do not log by default.
|
||||||
|
int64_t expiry_delta = 0; // do not gc by default
|
||||||
stasis_buffer_manager_size = 1 * 1024 * 1024 * 1024 / PAGE_SIZE; // 1.5GB total
|
stasis_buffer_manager_size = 1 * 1024 * 1024 * 1024 / PAGE_SIZE; // 1.5GB total
|
||||||
|
|
||||||
for(int i = 1; i < argc; i++) {
|
for(int i = 1; i < argc; i++) {
|
||||||
|
@ -37,8 +38,11 @@ int main(int argc, char *argv[])
|
||||||
} else if(!strcmp(argv[i], "--log-mode")) {
|
} else if(!strcmp(argv[i], "--log-mode")) {
|
||||||
i++;
|
i++;
|
||||||
log_mode = atoi(argv[i]);
|
log_mode = atoi(argv[i]);
|
||||||
|
} else if(!strcmp(argv[i], "--expiry-delta")) {
|
||||||
|
i++;
|
||||||
|
expiry_delta = atoi(argv[i]);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Usage: %s [--test|--benchmark] [--log-mode <int>]", argv[0]);
|
fprintf(stderr, "Usage: %s [--test|--benchmark] [--log-mode <int>] [--expiry-delta <int>]", argv[0]);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,6 +55,7 @@ int main(int argc, char *argv[])
|
||||||
recordid table_root = ROOT_RECORD;
|
recordid table_root = ROOT_RECORD;
|
||||||
{
|
{
|
||||||
logtable<datatuple> ltable(log_mode, c0_size);
|
logtable<datatuple> ltable(log_mode, c0_size);
|
||||||
|
ltable.expiry = expiry_delta;
|
||||||
|
|
||||||
if(TrecordType(xid, ROOT_RECORD) == INVALID_SLOT) {
|
if(TrecordType(xid, ROOT_RECORD) == INVALID_SLOT) {
|
||||||
printf("Creating empty logstore\n");
|
printf("Creating empty logstore\n");
|
||||||
|
|
Loading…
Reference in a new issue