Commit fbadc9f8 authored by Zardosht Kasheff's avatar Zardosht Kasheff

refs #61, remove test helper function toku_cachefile_flush,

fix tests that use it to not need it
parent b9b60dd9
...@@ -502,18 +502,6 @@ void toku_cachefile_close(CACHEFILE *cfp, bool oplsn_valid, LSN oplsn) { ...@@ -502,18 +502,6 @@ void toku_cachefile_close(CACHEFILE *cfp, bool oplsn_valid, LSN oplsn) {
toku_free(cf); toku_free(cf);
} }
//
// This client calls this function to flush all PAIRs belonging to
// a cachefile from the cachetable. The client must ensure that
// while this function is called, no other thread does work on the
// cachefile.
//
void toku_cachefile_flush (CACHEFILE cf) {
bjm_wait_for_jobs_to_finish(cf->bjm);
CACHETABLE ct = cf->cachetable;
cachetable_flush_cachefile(ct, cf);
}
// This hash function comes from Jenkins: http://burtleburtle.net/bob/c/lookup3.c // This hash function comes from Jenkins: http://burtleburtle.net/bob/c/lookup3.c
// The idea here is to mix the bits thoroughly so that we don't have to do modulo by a prime number. // The idea here is to mix the bits thoroughly so that we don't have to do modulo by a prime number.
// Instead we can use a bitmask on a table of size power of two. // Instead we can use a bitmask on a table of size power of two.
...@@ -2440,10 +2428,10 @@ static void remove_all_pairs_for_close(CACHETABLE ct, CACHEFILE cf) { ...@@ -2440,10 +2428,10 @@ static void remove_all_pairs_for_close(CACHETABLE ct, CACHEFILE cf) {
} }
static void verify_cachefile_flushed(CACHETABLE ct UU(), CACHEFILE cf UU()) { static void verify_cachefile_flushed(CACHETABLE ct UU(), CACHEFILE cf UU()) {
#ifdef TOKU_DEBUG_PARANOID
// assert here that cachefile is flushed by checking // assert here that cachefile is flushed by checking
// pair_list and finding no pairs belonging to this cachefile // pair_list and finding no pairs belonging to this cachefile
// Make a list of pairs that belong to this cachefile. // Make a list of pairs that belong to this cachefile.
#ifdef TOKU_DEBUG_PARANOID
if (cf) { if (cf) {
ct->list.write_list_lock(); ct->list.write_list_lock();
// assert here that cachefile is flushed by checking // assert here that cachefile is flushed by checking
...@@ -2488,14 +2476,11 @@ static void cachetable_flush_cachefile(CACHETABLE ct, CACHEFILE cf) { ...@@ -2488,14 +2476,11 @@ static void cachetable_flush_cachefile(CACHETABLE ct, CACHEFILE cf) {
// //
// first write out dirty PAIRs // first write out dirty PAIRs
write_dirty_pairs_for_close(ct, cf); write_dirty_pairs_for_close(ct, cf);
// now that everything is clean, get rid of everything // now that everything is clean, get rid of everything
remove_all_pairs_for_close(ct, cf); remove_all_pairs_for_close(ct, cf);
verify_cachefile_flushed(ct, cf); verify_cachefile_flushed(ct, cf);
if (cf) {
bjm_reset(cf->bjm);
}
} }
/* Requires that no locks be held that are used by the checkpoint logic */ /* Requires that no locks be held that are used by the checkpoint logic */
......
...@@ -524,12 +524,6 @@ int toku_cachefile_count_pinned (CACHEFILE, int /*printthem*/ ); ...@@ -524,12 +524,6 @@ int toku_cachefile_count_pinned (CACHEFILE, int /*printthem*/ );
// If oplsn_valid is true then use oplsn as the LSN of the close instead of asking the logger. oplsn_valid being true is only allowed during recovery, and requires that you are removing the last reference (otherwise the lsn wouldn't make it in.) // If oplsn_valid is true then use oplsn as the LSN of the close instead of asking the logger. oplsn_valid being true is only allowed during recovery, and requires that you are removing the last reference (otherwise the lsn wouldn't make it in.)
void toku_cachefile_close (CACHEFILE*, bool oplsn_valid, LSN oplsn); void toku_cachefile_close (CACHEFILE*, bool oplsn_valid, LSN oplsn);
// Flush the cachefile.
// Effect: Flush everything owned by the cachefile from the cachetable. All dirty
// blocks are written. All unpinned blocks are evicted from the cachetable.
// Returns: 0 if success, otherwise returns an error number.
void toku_cachefile_flush(CACHEFILE);
// Return on success (different from pread and pwrite) // Return on success (different from pread and pwrite)
//int cachefile_pwrite (CACHEFILE, const void *buf, size_t count, toku_off_t offset); //int cachefile_pwrite (CACHEFILE, const void *buf, size_t count, toku_off_t offset);
//int cachefile_pread (CACHEFILE, void *buf, size_t count, toku_off_t offset); //int cachefile_pread (CACHEFILE, void *buf, size_t count, toku_off_t offset);
......
...@@ -91,6 +91,8 @@ PATENT RIGHTS GRANT: ...@@ -91,6 +91,8 @@ PATENT RIGHTS GRANT:
CACHEFILE f1; CACHEFILE f1;
bool should_close;
static int static int
cleaner_callback( cleaner_callback(
void* UU(ftnode_pv), void* UU(ftnode_pv),
...@@ -99,13 +101,18 @@ cleaner_callback( ...@@ -99,13 +101,18 @@ cleaner_callback(
void* UU(extraargs) void* UU(extraargs)
) )
{ {
int r = toku_test_cachetable_unpin(f1,blocknum, fullhash,CACHETABLE_CLEAN,make_pair_attr(8)); should_close = true;
sleep(2);
PAIR_ATTR attr = make_pair_attr(8);
attr.cache_pressure_size = 8;
int r = toku_test_cachetable_unpin(f1, blocknum, fullhash, CACHETABLE_CLEAN, attr);
assert(r==0); assert(r==0);
return 0; return 0;
} }
static void static void
cachetable_test (void) { cachetable_test (void) {
should_close = false;
const int test_limit = 400; const int test_limit = 400;
int r; int r;
CACHETABLE ct; CACHETABLE ct;
...@@ -117,20 +124,22 @@ cachetable_test (void) { ...@@ -117,20 +124,22 @@ cachetable_test (void) {
r = toku_cachetable_openf(&f1, ct, fname1, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO); assert(r == 0); r = toku_cachetable_openf(&f1, ct, fname1, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO); assert(r == 0);
void* v1; void* v1;
//void* v2;
long s1; long s1;
//long s2; for (int i = 0; i < 10; i++) {
for (int j = 0; j < 50000; j++) { CACHETABLE_WRITE_CALLBACK wc = def_write_callback(NULL);
for (int i = 0; i < 10; i++) { wc.cleaner_callback = cleaner_callback;
CACHETABLE_WRITE_CALLBACK wc = def_write_callback(NULL); r = toku_cachetable_get_and_pin(f1, make_blocknum(i), i, &v1, &s1, wc, def_fetch, def_pf_req_callback, def_pf_callback, true, NULL);
wc.cleaner_callback = cleaner_callback; PAIR_ATTR attr = make_pair_attr(8);
r = toku_cachetable_get_and_pin(f1, make_blocknum(i), i, &v1, &s1, wc, def_fetch, def_pf_req_callback, def_pf_callback, true, NULL); attr.cache_pressure_size = 8;
r = toku_test_cachetable_unpin(f1, make_blocknum(i), i, CACHETABLE_DIRTY, make_pair_attr(8)); r = toku_test_cachetable_unpin(f1, make_blocknum(i), i, CACHETABLE_DIRTY, attr);
} }
toku_cachefile_flush(f1); while (!should_close) {
usleep(1024);
} }
toku_cachetable_verify(ct);
toku_cachefile_close(&f1, false, ZERO_LSN); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_verify(ct);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -142,16 +142,13 @@ test_cachetable_def_flush (int n) { ...@@ -142,16 +142,13 @@ test_cachetable_def_flush (int n) {
} }
// def_flush // def_flush
toku_cachefile_flush(f1); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachefile_verify(f1); toku_cachefile_verify(f2);
// verify keys do not exist in f1 but do exist in f2 // verify keys exist in f2
for (i=0; i<n; i++) { for (i=0; i<n; i++) {
uint32_t hi; uint32_t hi;
void *v; void *v;
hi = toku_cachetable_hash(f1, make_blocknum(i));
r = toku_cachetable_maybe_get_and_pin(f1, make_blocknum(i), hi, PL_WRITE_EXPENSIVE, &v);
assert(r != 0);
hi = toku_cachetable_hash(f2, make_blocknum(i)); hi = toku_cachetable_hash(f2, make_blocknum(i));
r = toku_cachetable_maybe_get_and_pin(f2, make_blocknum(i), hi, PL_WRITE_EXPENSIVE, &v); r = toku_cachetable_maybe_get_and_pin(f2, make_blocknum(i), hi, PL_WRITE_EXPENSIVE, &v);
assert(r == 0); assert(r == 0);
...@@ -159,7 +156,6 @@ test_cachetable_def_flush (int n) { ...@@ -159,7 +156,6 @@ test_cachetable_def_flush (int n) {
assert(r == 0); assert(r == 0);
} }
toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachefile_close(&f2, false, ZERO_LSN); toku_cachefile_close(&f2, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -98,12 +98,12 @@ static void kibbutz_work(void *fe_v) ...@@ -98,12 +98,12 @@ static void kibbutz_work(void *fe_v)
{ {
CACHEFILE CAST_FROM_VOIDP(f1, fe_v); CACHEFILE CAST_FROM_VOIDP(f1, fe_v);
sleep(2); sleep(2);
foo = true;
// note that we make the size 16 to induce an eviction // note that we make the size 16 to induce an eviction
// once evictions are moved to their own thread, we need // once evictions are moved to their own thread, we need
// to modify this test // to modify this test
int r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_CLEAN, make_pair_attr(16)); int r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_CLEAN, make_pair_attr(16));
assert(r==0); assert(r==0);
foo = true;
remove_background_job_from_cf(f1); remove_background_job_from_cf(f1);
} }
...@@ -120,16 +120,8 @@ run_test (void) { ...@@ -120,16 +120,8 @@ run_test (void) {
r = toku_cachetable_openf(&f1, ct, fname1, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO); assert(r == 0); r = toku_cachetable_openf(&f1, ct, fname1, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO); assert(r == 0);
void* v1; void* v1;
//void* v2;
long s1; long s1;
//long s2;
CACHETABLE_WRITE_CALLBACK wc = def_write_callback(NULL); CACHETABLE_WRITE_CALLBACK wc = def_write_callback(NULL);
r = toku_cachetable_get_and_pin(f1, make_blocknum(1), 1, &v1, &s1, wc, def_fetch, def_pf_req_callback, def_pf_callback, true, NULL);
foo = false;
cachefile_kibbutz_enq(f1, kibbutz_work, f1);
toku_cachefile_flush(f1);
assert(foo);
assert(f1);
r = toku_cachetable_get_and_pin(f1, make_blocknum(1), 1, &v1, &s1, wc, def_fetch, def_pf_req_callback, def_pf_callback, true, NULL); r = toku_cachetable_get_and_pin(f1, make_blocknum(1), 1, &v1, &s1, wc, def_fetch, def_pf_req_callback, def_pf_callback, true, NULL);
foo = false; foo = false;
......
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