#include #include #include #include #include "logstore.h" #include "datapage.cpp" #include "logiterators.cpp" #include "merger.h" #include #include #include #include #include #include #undef begin #undef end bool mycmp(const std::string & k1,const std::string & k2) { //for char* ending with \0 return strcmp(k1.c_str(),k2.c_str()) < 0; //for int32_t //printf("%d\t%d\n",(*((int32_t*)k1)) ,(*((int32_t*)k2))); //return (*((int32_t*)k1)) <= (*((int32_t*)k2)); } //must be given a sorted array void removeduplicates(std::vector *arr) { for(int i=arr->size()-1; i>0; i--) { if(! (mycmp((*arr)[i], (*arr)[i-1]) || mycmp((*arr)[i-1], (*arr)[i]))) arr->erase(arr->begin()+i); } } void getnextdata(std::string &data, int avg_len) { int str_len = (rand()%(avg_len*2)) + 3; data = std::string(str_len, rand()%10+48); /* char *rc = (char*)malloc(str_len); for(int i=0; i *arr, int avg_len=50) { for ( int j=0; jpush_back(str); } } void insertProbeIter(int NUM_ENTRIES) { srand(1000); unlink("storefile.txt"); unlink("logfile.txt"); sync(); //data generation // std::vector * data_arr = new std::vector; std::vector * key_arr = new std::vector; // preprandstr(NUM_ENTRIES, data_arr, 10*8192); preprandstr(NUM_ENTRIES+200, key_arr, 100); std::sort(key_arr->begin(), key_arr->end(), &mycmp); removeduplicates(key_arr); if(key_arr->size() > NUM_ENTRIES) key_arr->erase(key_arr->begin()+NUM_ENTRIES, key_arr->end()); NUM_ENTRIES=key_arr->size(); bufferManagerNonBlockingSlowHandleType = IO_HANDLE_PFILE; Tinit(); int xid = Tbegin(); merge_scheduler mscheduler; logtable ltable; int pcount = 100; ltable.set_fixed_page_count(pcount); recordid table_root = ltable.allocTable(xid); Tcommit(xid); //xid = Tbegin(); int lindex = mscheduler.addlogtable(<able); ltable.setMergeData(mscheduler.getMergeData(lindex)); mscheduler.startlogtable(lindex); printf("Stage 1: Writing %d keys\n", NUM_ENTRIES); struct timeval start_tv, stop_tv, ti_st, ti_end; double insert_time = 0; int dpages = 0; int npages = 0; DataPage *dp=0; int64_t datasize = 0; std::vector dsp; gettimeofday(&start_tv,0); for(int i = 0; i < NUM_ENTRIES; i++) { //prepare the key datatuple newtuple; uint32_t keylen = (*key_arr)[i].length()+1; newtuple.keylen = &keylen; newtuple.key = (datatuple::key_t) malloc(keylen); memcpy((byte*)newtuple.key, (*key_arr)[i].c_str(), keylen); //for(int j=0; jprint_tree(xid); printf("datasize: %lld\n", datasize); //sleep(20); /* //Tcommit(xid); xid = Tbegin(); printf("Stage 2: Looking up %d keys:\n", NUM_ENTRIES); int found_tuples=0; for(int i=NUM_ENTRIES-1; i>=0; i--) { int ri = i; //printf("key index%d\n", i); fflush(stdout); //get the key uint32_t keylen = (*key_arr)[ri].length()+1; datatuple::key_t rkey = (datatuple::key_t) malloc(keylen); memcpy((byte*)rkey, (*key_arr)[ri].c_str(), keylen); //for(int j=0; jkeylen) == (*key_arr)[ri].length()+1); //assert(*(dt->datalen) == (*data_arr)[ri].length()+1); free(dt->keylen); free(dt); } dt = 0; free(rkey); } printf("found %d\n", found_tuples); key_arr->clear(); //data_arr->clear(); delete key_arr; //delete data_arr; */ mscheduler.shutdown(); printf("merge threads finished.\n"); gettimeofday(&stop_tv,0); printf("run time: %6.1f\n", (tv_to_double(stop_tv) - tv_to_double(start_tv))); //Tcommit(xid); Tdeinit(); } /** @test */ int main() { insertProbeIter(25000); return 0; }