Commit 1a4a5ecf authored by John Esmet's avatar John Esmet Committed by Yoni Fogel

refs #5500 close userdata and checkpoint userdata do not fail, so cachefile...

refs #5500 close userdata and checkpoint userdata do not fail, so cachefile close and ft evict from memory do not fail


git-svn-id: file:///svn/toku/tokudb@48237 c7de825b-a66e-492c-adef-691d508d4ae1
parent d9841ada
...@@ -440,9 +440,7 @@ static void remove_cf_from_cachefiles_list (CACHEFILE cf) { ...@@ -440,9 +440,7 @@ static void remove_cf_from_cachefiles_list (CACHEFILE cf) {
ct->cf_list.write_unlock(); ct->cf_list.write_unlock();
} }
// TODO: (Zardosht) review locking of this function carefully in code review void toku_cachefile_close(CACHEFILE *cfp, bool oplsn_valid, LSN oplsn) {
int
toku_cachefile_close(CACHEFILE *cfp, bool oplsn_valid, LSN oplsn) {
CACHEFILE cf = *cfp; CACHEFILE cf = *cfp;
CACHETABLE ct = cf->cachetable; CACHETABLE ct = cf->cachetable;
...@@ -480,9 +478,6 @@ toku_cachefile_close(CACHEFILE *cfp, bool oplsn_valid, LSN oplsn) { ...@@ -480,9 +478,6 @@ toku_cachefile_close(CACHEFILE *cfp, bool oplsn_valid, LSN oplsn) {
} }
toku_free(cf->fname_in_env); toku_free(cf->fname_in_env);
toku_free(cf); toku_free(cf);
// TODO: can't fail
return 0;
} }
// //
......
...@@ -452,8 +452,7 @@ int toku_cachefile_count_pinned (CACHEFILE, int /*printthem*/ ); ...@@ -452,8 +452,7 @@ int toku_cachefile_count_pinned (CACHEFILE, int /*printthem*/ );
// close function does not return until all of the objects are evicted. The cachefile // close function does not return until all of the objects are evicted. The cachefile
// object is freed. // object is freed.
// 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.)
// Returns: 0 if success, otherwise returns an error number. void toku_cachefile_close (CACHEFILE*, bool oplsn_valid, LSN oplsn);
int toku_cachefile_close (CACHEFILE*, bool oplsn_valid, LSN oplsn);
// Flush the cachefile. // Flush the cachefile.
// Effect: Flush everything owned by the cachefile from the cachetable. All dirty // Effect: Flush everything owned by the cachefile from the cachetable. All dirty
......
...@@ -3201,9 +3201,8 @@ ft_handle_open(FT_HANDLE ft_h, const char *fname_in_env, int is_create, int only ...@@ -3201,9 +3201,8 @@ ft_handle_open(FT_HANDLE ft_h, const char *fname_in_env, int is_create, int only
bool needed = toku_ft_needed_unlocked(ft); bool needed = toku_ft_needed_unlocked(ft);
toku_ft_release_reflock(ft); toku_ft_release_reflock(ft);
if (!needed) { if (!needed) {
//Close immediately. // close immediately.
r = toku_ft_evict_from_memory(ft, false, ZERO_LSN); toku_ft_evict_from_memory(ft, false, ZERO_LSN);
lazy_assert_zero(r);
} }
} }
else { else {
......
...@@ -467,11 +467,9 @@ toku_ft_has_one_reference_unlocked(FT ft) { ...@@ -467,11 +467,9 @@ toku_ft_has_one_reference_unlocked(FT ft) {
// evict a ft from memory by closing its cachefile. any future work // evict a ft from memory by closing its cachefile. any future work
// will have to read in the ft in a new cachefile and new FT object. // will have to read in the ft in a new cachefile and new FT object.
int toku_ft_evict_from_memory(FT ft, bool oplsn_valid, LSN oplsn) { void toku_ft_evict_from_memory(FT ft, bool oplsn_valid, LSN oplsn) {
int r = 0;
assert(ft->cf); assert(ft->cf);
r = toku_cachefile_close(&ft->cf, oplsn_valid, oplsn); toku_cachefile_close(&ft->cf, oplsn_valid, oplsn);
return r;
} }
// Verifies there exists exactly one ft handle and returns it. // Verifies there exists exactly one ft handle and returns it.
...@@ -876,8 +874,7 @@ toku_ft_remove_reference(FT ft, bool oplsn_valid, LSN oplsn, remove_ft_ref_callb ...@@ -876,8 +874,7 @@ toku_ft_remove_reference(FT ft, bool oplsn_valid, LSN oplsn, remove_ft_ref_callb
} }
if (!needed) { if (!needed) {
// close header // close header
int r = toku_ft_evict_from_memory(ft, oplsn_valid, oplsn); toku_ft_evict_from_memory(ft, oplsn_valid, oplsn);
assert_zero(r);
} }
toku_ft_open_close_unlock(); toku_ft_open_close_unlock();
......
...@@ -39,7 +39,7 @@ bool toku_ft_has_one_reference_unlocked(FT ft); ...@@ -39,7 +39,7 @@ bool toku_ft_has_one_reference_unlocked(FT ft);
// evict a ft from memory by closing its cachefile. any future work // evict a ft from memory by closing its cachefile. any future work
// will have to read in the ft in a new cachefile and new FT object. // will have to read in the ft in a new cachefile and new FT object.
int toku_ft_evict_from_memory(FT ft, bool oplsn_valid, LSN oplsn) __attribute__ ((warn_unused_result)); void toku_ft_evict_from_memory(FT ft, bool oplsn_valid, LSN oplsn);
FT_HANDLE toku_ft_get_only_existing_ft_handle(FT h); FT_HANDLE toku_ft_get_only_existing_ft_handle(FT h);
......
...@@ -88,7 +88,7 @@ run_test (void) { ...@@ -88,7 +88,7 @@ run_test (void) {
); );
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -61,7 +61,7 @@ cachetable_test (void) { ...@@ -61,7 +61,7 @@ cachetable_test (void) {
assert_zero(r); assert_zero(r);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -86,7 +86,7 @@ cachetable_test (void) { ...@@ -86,7 +86,7 @@ cachetable_test (void) {
r = toku_test_cachetable_unpin(f1, make_blocknum(1), toku_cachetable_hash(f1, make_blocknum(1)), CACHETABLE_CLEAN, make_pair_attr(2)); r = toku_test_cachetable_unpin(f1, make_blocknum(1), toku_cachetable_hash(f1, make_blocknum(1)), CACHETABLE_CLEAN, make_pair_attr(2));
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -118,8 +118,7 @@ cachetable_test (void) { ...@@ -118,8 +118,7 @@ cachetable_test (void) {
usleep(2*1024*1024); usleep(2*1024*1024);
check_flush = true; check_flush = true;
r = toku_cachefile_close(&f1, false, ZERO_LSN); toku_cachefile_close(&f1, false, ZERO_LSN);
assert(r == 0);
assert(dirty_flush_called); assert(dirty_flush_called);
check_flush = false; check_flush = false;
...@@ -129,7 +128,7 @@ cachetable_test (void) { ...@@ -129,7 +128,7 @@ cachetable_test (void) {
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f2, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f2, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -52,7 +52,7 @@ cachetable_test (void) { ...@@ -52,7 +52,7 @@ cachetable_test (void) {
//r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_CLEAN, 8); //r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_CLEAN, 8);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -153,7 +153,7 @@ static void checkpoint_pending(void) { ...@@ -153,7 +153,7 @@ static void checkpoint_pending(void) {
assert(r == 0); assert(r == 0);
assert(n_flush == 0 && n_write_me == 0 && n_keep_me == 0); assert(n_flush == 0 && n_write_me == 0 && n_keep_me == 0);
r = toku_cachefile_close(&cf, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&cf, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -110,7 +110,7 @@ cachetable_test (void) { ...@@ -110,7 +110,7 @@ cachetable_test (void) {
check_me = false; check_me = false;
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -111,7 +111,7 @@ cachetable_test (void) { ...@@ -111,7 +111,7 @@ cachetable_test (void) {
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -131,7 +131,7 @@ static void cachetable_checkpoint_test(int n, enum cachetable_dirty dirty) { ...@@ -131,7 +131,7 @@ static void cachetable_checkpoint_test(int n, enum cachetable_dirty dirty) {
assert(r == 0); assert(r == 0);
assert(n_flush == 0 && n_write_me == 0 && n_keep_me == 0); assert(n_flush == 0 && n_write_me == 0 && n_keep_me == 0);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0 ); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -96,7 +96,7 @@ cachetable_test (void) { ...@@ -96,7 +96,7 @@ cachetable_test (void) {
assert(r==0); assert(r==0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -96,7 +96,7 @@ cachetable_test (void) { ...@@ -96,7 +96,7 @@ cachetable_test (void) {
assert(r==0); assert(r==0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -126,7 +126,7 @@ run_test (void) { ...@@ -126,7 +126,7 @@ run_test (void) {
assert(STATUS_VALUE(CT_SIZE_CACHEPRESSURE) == (uint64_t) expect.cache_pressure_size); assert(STATUS_VALUE(CT_SIZE_CACHEPRESSURE) == (uint64_t) expect.cache_pressure_size);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -36,7 +36,7 @@ cachetable_test (void) { ...@@ -36,7 +36,7 @@ cachetable_test (void) {
assert(r==0); assert(r==0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -62,7 +62,7 @@ run_test (void) { ...@@ -62,7 +62,7 @@ run_test (void) {
} }
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -60,7 +60,7 @@ run_test (void) { ...@@ -60,7 +60,7 @@ run_test (void) {
usleep(4000000); usleep(4000000);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -80,7 +80,7 @@ run_test (void) { ...@@ -80,7 +80,7 @@ run_test (void) {
assert(my_cleaner_callback_called); assert(my_cleaner_callback_called);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0 ); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -34,7 +34,7 @@ cachetable_test (void) { ...@@ -34,7 +34,7 @@ cachetable_test (void) {
} }
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0 ); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -100,7 +100,7 @@ cachetable_test (void) { ...@@ -100,7 +100,7 @@ cachetable_test (void) {
usleep(1*1024*1024); usleep(1*1024*1024);
check_flush = false; check_flush = false;
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0 ); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -152,7 +152,7 @@ cachetable_test (void) { ...@@ -152,7 +152,7 @@ cachetable_test (void) {
assert(expected_bytes_to_free == 0); assert(expected_bytes_to_free == 0);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -180,7 +180,7 @@ cachetable_test (void) { ...@@ -180,7 +180,7 @@ cachetable_test (void) {
assert(expected_bytes_to_free == 3); assert(expected_bytes_to_free == 3);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -134,7 +134,7 @@ cachetable_test (void) { ...@@ -134,7 +134,7 @@ cachetable_test (void) {
r = toku_test_cachetable_unpin(f1, make_blocknum(5), 5, CACHETABLE_CLEAN, make_pair_attr(4)); r = toku_test_cachetable_unpin(f1, make_blocknum(5), 5, CACHETABLE_CLEAN, make_pair_attr(4));
check_flush = false; check_flush = false;
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0 ); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -99,7 +99,7 @@ cachetable_test (void) { ...@@ -99,7 +99,7 @@ cachetable_test (void) {
assert(clone_flush_started && clone_flush_completed); assert(clone_flush_started && clone_flush_completed);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -101,7 +101,7 @@ cachetable_test (void) { ...@@ -101,7 +101,7 @@ cachetable_test (void) {
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -102,7 +102,7 @@ cachetable_test (void) { ...@@ -102,7 +102,7 @@ cachetable_test (void) {
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -81,7 +81,7 @@ cachetable_test (enum cachetable_dirty dirty, bool cloneable) { ...@@ -81,7 +81,7 @@ cachetable_test (enum cachetable_dirty dirty, bool cloneable) {
); );
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -90,7 +90,7 @@ cachetable_test (void) { ...@@ -90,7 +90,7 @@ cachetable_test (void) {
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -47,7 +47,7 @@ cachetable_count_pinned_test (int n) { ...@@ -47,7 +47,7 @@ cachetable_count_pinned_test (int n) {
assert(toku_cachefile_count_pinned(f1, 1) == 0); assert(toku_cachefile_count_pinned(f1, 1) == 0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -52,7 +52,7 @@ cachetable_debug_test (int n) { ...@@ -52,7 +52,7 @@ cachetable_debug_test (int n) {
} }
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -132,7 +132,7 @@ static void cachetable_eviction_full_test (void) { ...@@ -132,7 +132,7 @@ static void cachetable_eviction_full_test (void) {
// close with the eviction in progress. the close should block until // close with the eviction in progress. the close should block until
// all of the reads and writes are complete. // all of the reads and writes are complete.
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -146,7 +146,7 @@ static void cachetable_eviction_full_test (void) { ...@@ -146,7 +146,7 @@ static void cachetable_eviction_full_test (void) {
// close with the eviction in progress. the close should block until // close with the eviction in progress. the close should block until
// all of the reads and writes are complete. // all of the reads and writes are complete.
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -119,7 +119,7 @@ static void cachetable_predef_fetch_maybegetandpin_test (void) { ...@@ -119,7 +119,7 @@ static void cachetable_predef_fetch_maybegetandpin_test (void) {
assert(r == 0); assert(r == 0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -148,7 +148,7 @@ static void cachetable_prefetch_maybegetandpin_test (void) { ...@@ -148,7 +148,7 @@ static void cachetable_prefetch_maybegetandpin_test (void) {
assert(r == 0); assert(r == 0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -44,7 +44,7 @@ cachetable_fd_test (void) { ...@@ -44,7 +44,7 @@ cachetable_fd_test (void) {
r = toku_cachefile_of_filenum(ct, fn, &newcf); r = toku_cachefile_of_filenum(ct, fn, &newcf);
assert(r == ENOENT); assert(r == ENOENT);
r = toku_cachefile_close(&cf, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&cf, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -100,7 +100,7 @@ cachetable_test (enum pin_evictor_test_type test_type, bool nonblocking) { ...@@ -100,7 +100,7 @@ cachetable_test (enum pin_evictor_test_type test_type, bool nonblocking) {
} }
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -46,7 +46,7 @@ cachetable_test (void) { ...@@ -46,7 +46,7 @@ cachetable_test (void) {
toku_cachefile_flush(f1); toku_cachefile_flush(f1);
} }
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -72,8 +72,8 @@ test_cachetable_def_flush (int n) { ...@@ -72,8 +72,8 @@ test_cachetable_def_flush (int n) {
assert(r == 0); assert(r == 0);
} }
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
r = toku_cachefile_close(&f2, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f2, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -73,7 +73,7 @@ cachetable_getandpin_test (int n) { ...@@ -73,7 +73,7 @@ cachetable_getandpin_test (int n) {
} }
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -50,7 +50,7 @@ run_test (void) { ...@@ -50,7 +50,7 @@ run_test (void) {
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;
cachefile_kibbutz_enq(f1, kibbutz_work, f1); cachefile_kibbutz_enq(f1, kibbutz_work, f1);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
assert(foo); assert(foo);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -128,7 +128,7 @@ cachetable_test (void) { ...@@ -128,7 +128,7 @@ cachetable_test (void) {
r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_CLEAN, make_pair_attr(8)); r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_CLEAN, make_pair_attr(8));
// close and reopen cachefile so we can do some simple prefetch tests // close and reopen cachefile so we can do some simple prefetch tests
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
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);
// //
// verify that a prefetch of the node will succeed // verify that a prefetch of the node will succeed
...@@ -176,7 +176,7 @@ cachetable_test (void) { ...@@ -176,7 +176,7 @@ cachetable_test (void) {
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -381,7 +381,7 @@ cachetable_test (void) { ...@@ -381,7 +381,7 @@ cachetable_test (void) {
} }
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
sum_vals(); sum_vals();
......
...@@ -67,7 +67,7 @@ run_test (void) { ...@@ -67,7 +67,7 @@ run_test (void) {
assert(r==0); assert(r==0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -146,7 +146,7 @@ static void cachetable_prefetch_checkpoint_test(int n, enum cachetable_dirty dir ...@@ -146,7 +146,7 @@ static void cachetable_prefetch_checkpoint_test(int n, enum cachetable_dirty dir
assert(r == 0); assert(r == 0);
assert(n_flush == 0 && n_write_me == 0 && n_keep_me == 0); assert(n_flush == 0 && n_write_me == 0 && n_keep_me == 0);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -70,7 +70,7 @@ static void cachetable_prefetch_close_leak_test (void) { ...@@ -70,7 +70,7 @@ static void cachetable_prefetch_close_leak_test (void) {
// close with the prefetch in progress. the close should block until // close with the prefetch in progress. the close should block until
// all of the reads and writes are complete. // all of the reads and writes are complete.
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -97,7 +97,7 @@ static void cachetable_prefetch_full_test (bool partial_fetch) { ...@@ -97,7 +97,7 @@ static void cachetable_prefetch_full_test (bool partial_fetch) {
// close with the prefetch in progress. the close should block until // close with the prefetch in progress. the close should block until
// all of the reads and writes are complete. // all of the reads and writes are complete.
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -103,7 +103,7 @@ static void cachetable_prefetch_flowcontrol_test (int cachetable_size_limit) { ...@@ -103,7 +103,7 @@ static void cachetable_prefetch_flowcontrol_test (int cachetable_size_limit) {
} }
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
if (verbose) printf("%s:%d 0x%x 0x%x\n", __FUNCTION__, __LINE__, if (verbose) printf("%s:%d 0x%x 0x%x\n", __FUNCTION__, __LINE__,
evicted_keys, (1 << (2*cachetable_size_limit))-1); evicted_keys, (1 << (2*cachetable_size_limit))-1);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -137,7 +137,7 @@ static void cachetable_prefetch_maybegetandpin_test (bool do_partial_fetch) { ...@@ -137,7 +137,7 @@ static void cachetable_prefetch_maybegetandpin_test (bool do_partial_fetch) {
assert(r == 0); assert(r == 0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -63,7 +63,7 @@ static void cachetable_prefetch_maybegetandpin_test (void) { ...@@ -63,7 +63,7 @@ static void cachetable_prefetch_maybegetandpin_test (void) {
assert(r == 0); assert(r == 0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -73,7 +73,7 @@ static void cachetable_prefetch_maybegetandpin_test (void) { ...@@ -73,7 +73,7 @@ static void cachetable_prefetch_maybegetandpin_test (void) {
assert(r == 0); assert(r == 0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -515,7 +515,7 @@ cachetable_test (void) { ...@@ -515,7 +515,7 @@ cachetable_test (void) {
} }
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
sum_vals(); sum_vals();
......
...@@ -44,7 +44,7 @@ cachetable_put_test (int n) { ...@@ -44,7 +44,7 @@ cachetable_put_test (int n) {
assert(toku_cachefile_count_pinned(f1, 1) == 0); assert(toku_cachefile_count_pinned(f1, 1) == 0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -101,7 +101,7 @@ static void readit (void) { ...@@ -101,7 +101,7 @@ static void readit (void) {
r=toku_cachetable_get_and_pin(f, key, fullhash, &block, &current_size, wc, f_fetch, def_pf_req_callback, def_pf_callback, true, 0); assert(r==0); r=toku_cachetable_get_and_pin(f, key, fullhash, &block, &current_size, wc, f_fetch, def_pf_req_callback, def_pf_callback, true, 0); assert(r==0);
r=toku_test_cachetable_unpin(f, key, fullhash, CACHETABLE_CLEAN, make_pair_attr(BLOCKSIZE)); assert(r==0); r=toku_test_cachetable_unpin(f, key, fullhash, CACHETABLE_CLEAN, make_pair_attr(BLOCKSIZE)); assert(r==0);
} }
r = toku_cachefile_close(&f, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f, false, ZERO_LSN);
toku_cachetable_close(&t); toku_cachetable_close(&t);
gettimeofday(&end, 0); gettimeofday(&end, 0);
toku_os_get_process_times(&end_usertime, &end_systime); toku_os_get_process_times(&end_usertime, &end_systime);
......
...@@ -140,7 +140,7 @@ test_clean (enum cachetable_dirty dirty, bool cloneable) { ...@@ -140,7 +140,7 @@ test_clean (enum cachetable_dirty dirty, bool cloneable) {
check_flush = false; check_flush = false;
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -89,7 +89,7 @@ test_clean (enum cachetable_dirty dirty, bool cloneable) { ...@@ -89,7 +89,7 @@ test_clean (enum cachetable_dirty dirty, bool cloneable) {
flush_called = false; flush_called = false;
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0 ); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
if (flush_expected) assert(flush_called); if (flush_expected) assert(flush_called);
} }
......
...@@ -66,7 +66,7 @@ cachetable_test (void) { ...@@ -66,7 +66,7 @@ cachetable_test (void) {
); );
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -81,8 +81,7 @@ run_test (pair_lock_type lock_type) { ...@@ -81,8 +81,7 @@ run_test (pair_lock_type lock_type) {
} }
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); toku_cachefile_close(&f1, false, ZERO_LSN);
assert(r == 0);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -154,7 +154,7 @@ cachetable_test (bool write_first, bool write_second, bool start_checkpoint) { ...@@ -154,7 +154,7 @@ cachetable_test (bool write_first, bool write_second, bool start_checkpoint) {
} }
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -109,8 +109,7 @@ run_test (void) { ...@@ -109,8 +109,7 @@ run_test (void) {
run_case_that_should_fail(f1, PL_WRITE_EXPENSIVE, PL_WRITE_EXPENSIVE); run_case_that_should_fail(f1, PL_WRITE_EXPENSIVE, PL_WRITE_EXPENSIVE);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); toku_cachefile_close(&f1, false, ZERO_LSN);
assert(r == 0);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -120,8 +120,7 @@ run_test (void) { ...@@ -120,8 +120,7 @@ run_test (void) {
); );
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); toku_cachefile_close(&f1, false, ZERO_LSN);
assert(r == 0);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -102,7 +102,7 @@ run_test (void) { ...@@ -102,7 +102,7 @@ run_test (void) {
); );
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -162,7 +162,7 @@ cachetable_test (bool write_first, bool write_second, bool start_checkpoint) { ...@@ -162,7 +162,7 @@ cachetable_test (bool write_first, bool write_second, bool start_checkpoint) {
} }
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -112,7 +112,7 @@ run_test (void) { ...@@ -112,7 +112,7 @@ run_test (void) {
assert_zero(r); assert_zero(r);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -122,7 +122,7 @@ run_test (void) { ...@@ -122,7 +122,7 @@ run_test (void) {
assert_zero(r); assert_zero(r);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -56,7 +56,7 @@ cachetable_test (void) { ...@@ -56,7 +56,7 @@ cachetable_test (void) {
r = toku_test_cachetable_unpin_and_remove(f1, make_blocknum(1), remove_key_expect_no_checkpoint, NULL); r = toku_test_cachetable_unpin_and_remove(f1, make_blocknum(1), remove_key_expect_no_checkpoint, NULL);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -24,7 +24,7 @@ cachetable_test (void) { ...@@ -24,7 +24,7 @@ cachetable_test (void) {
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);
r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_DIRTY, make_pair_attr(8)); r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_DIRTY, make_pair_attr(8));
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -114,7 +114,7 @@ static void test_nested_pin (void) { ...@@ -114,7 +114,7 @@ static void test_nested_pin (void) {
toku_cachetable_put(f, make_blocknum(2), f2hash, &i1, make_pair_attr(test_object_size), wc, put_callback_nop); toku_cachetable_put(f, make_blocknum(2), f2hash, &i1, make_pair_attr(test_object_size), wc, put_callback_nop);
r = toku_test_cachetable_unpin(f, make_blocknum(2), f2hash, CACHETABLE_CLEAN, make_pair_attr(test_object_size)); r = toku_test_cachetable_unpin(f, make_blocknum(2), f2hash, CACHETABLE_CLEAN, make_pair_attr(test_object_size));
assert(r==0); assert(r==0);
r = toku_cachefile_close(&f, false, ZERO_LSN); assert(r==0); toku_cachefile_close(&f, false, ZERO_LSN);
toku_cachetable_close(&t); toku_cachetable_close(&t);
} }
...@@ -193,10 +193,10 @@ static void test_multi_filehandles (void) { ...@@ -193,10 +193,10 @@ static void test_multi_filehandles (void) {
// we support only one close for a file handle // we support only one close for a file handle
r = toku_test_cachetable_unpin(f1, make_blocknum(1), toku_cachetable_hash(f1, make_blocknum(1)), CACHETABLE_CLEAN, make_pair_attr(0)); assert(r==0); r = toku_test_cachetable_unpin(f1, make_blocknum(1), toku_cachetable_hash(f1, make_blocknum(1)), CACHETABLE_CLEAN, make_pair_attr(0)); assert(r==0);
r = toku_test_cachetable_unpin(f2, make_blocknum(2), toku_cachetable_hash(f2, make_blocknum(2)), CACHETABLE_CLEAN, make_pair_attr(0)); assert(r==0); r = toku_test_cachetable_unpin(f2, make_blocknum(2), toku_cachetable_hash(f2, make_blocknum(2)), CACHETABLE_CLEAN, make_pair_attr(0)); assert(r==0);
r = toku_cachefile_close(&f2, false, ZERO_LSN); assert(r==0); toku_cachefile_close(&f2, false, ZERO_LSN);
r = toku_test_cachetable_unpin(f3, make_blocknum(2), toku_cachetable_hash(f3, make_blocknum(2)), CACHETABLE_CLEAN, make_pair_attr(0)); assert(r==0); r = toku_test_cachetable_unpin(f3, make_blocknum(2), toku_cachetable_hash(f3, make_blocknum(2)), CACHETABLE_CLEAN, make_pair_attr(0)); assert(r==0);
r = toku_cachefile_close(&f3, false, ZERO_LSN); assert(r==0); toku_cachefile_close(&f3, false, ZERO_LSN);
toku_cachetable_close(&t); toku_cachetable_close(&t);
} }
...@@ -474,8 +474,7 @@ static void test_size_flush(void) { ...@@ -474,8 +474,7 @@ static void test_size_flush(void) {
assert(r == 0); assert(r == 0);
} }
r = toku_cachefile_close(&f, false, ZERO_LSN); toku_cachefile_close(&f, false, ZERO_LSN);
assert(r == 0);
toku_cachetable_close(&t); toku_cachetable_close(&t);
} }
......
...@@ -74,7 +74,7 @@ cachetable_unpin_and_remove_test (int n) { ...@@ -74,7 +74,7 @@ cachetable_unpin_and_remove_test (int n) {
toku_cachetable_get_state(ct, &nentries, NULL, NULL, NULL); toku_cachetable_get_state(ct, &nentries, NULL, NULL, NULL);
assert(nentries == 0); assert(nentries == 0);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
...@@ -114,7 +114,7 @@ cachetable_put_evict_remove_test (int n) { ...@@ -114,7 +114,7 @@ cachetable_put_evict_remove_test (int n) {
r = toku_test_cachetable_unpin_and_remove(f1, make_blocknum(0), NULL, NULL); r = toku_test_cachetable_unpin_and_remove(f1, make_blocknum(0), NULL, NULL);
assert(r == 0); assert(r == 0);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -69,7 +69,7 @@ run_test (void) { ...@@ -69,7 +69,7 @@ run_test (void) {
assert(r==0); assert(r==0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
......
...@@ -45,7 +45,7 @@ cachetable_unpin_test (int n) { ...@@ -45,7 +45,7 @@ cachetable_unpin_test (int n) {
assert(toku_cachefile_count_pinned(f1, 1) == 0); assert(toku_cachefile_count_pinned(f1, 1) == 0);
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
...@@ -112,7 +112,7 @@ unpin_and_evictor_test(enum unpin_evictor_test_type test_type) { ...@@ -112,7 +112,7 @@ unpin_and_evictor_test(enum unpin_evictor_test_type test_type) {
} }
toku_cachetable_verify(ct); toku_cachetable_verify(ct);
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
...@@ -54,7 +54,7 @@ cachetable_test (void) { ...@@ -54,7 +54,7 @@ cachetable_test (void) {
r = toku_test_cachetable_unpin(f1, make_blocknum(i), i, CACHETABLE_DIRTY, make_pair_attr(4)); r = toku_test_cachetable_unpin(f1, make_blocknum(i), i, CACHETABLE_DIRTY, make_pair_attr(4));
} }
r = toku_cachefile_close(&f1, false, ZERO_LSN); assert(r == 0); toku_cachefile_close(&f1, false, ZERO_LSN);
toku_cachetable_close(&ct); toku_cachetable_close(&ct);
} }
......
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