// Make sure that the pending stuff gets checkpointed, but subsequent changes don't, even with concurrent updates. #ident "$Id$" #ident "Copyright (c) 2007-2011 Tokutek Inc. All rights reserved." #include "test.h" #include #include #include "checkpoint.h" #include "toku_atomic.h" static int N; // how many items in the table static CACHEFILE cf; static CACHETABLE ct; int *values; static const int item_size = sizeof(int); static volatile int n_flush, n_write_me, n_keep_me, n_fetch; static void sleep_random (void) { #if TOKU_WINDOWS usleep(random() % 1000); //Will turn out to be almost always 1ms. #else toku_timespec_t req = {.tv_sec = 0, .tv_nsec = random()%1000000}; //Max just under 1ms nanosleep(&req, NULL); #endif } int expect_value = 42; // initially 42, later 43 static void flush (CACHEFILE UU(thiscf), int UU(fd), CACHEKEY UU(key), void *value, void *UU(extraargs), long size, long* UU(new_size), BOOL write_me, BOOL keep_me, BOOL UU(for_checkpoint)) { // printf("f"); assert(size == item_size); int *v = value; if (*v!=expect_value) printf("got %d expect %d\n", *v, expect_value); assert(*v==expect_value); (void)toku_sync_fetch_and_increment_int32(&n_flush); if (write_me) (void)toku_sync_fetch_and_increment_int32(&n_write_me); if (keep_me) (void)toku_sync_fetch_and_increment_int32(&n_keep_me); sleep_random(); } static int fetch (CACHEFILE UU(thiscf), int UU(fd), CACHEKEY UU(key), u_int32_t UU(fullhash), void **UU(value), long *UU(sizep), int *UU(dirtyp), void *UU(extraargs)) { assert(0); // should not be called return 0; } static void pe_est_callback( void* UU(brtnode_pv), long* bytes_freed_estimate, enum partial_eviction_cost *cost, void* UU(write_extraargs) ) { *bytes_freed_estimate = 0; *cost = PE_CHEAP; } static int pe_callback ( void *brtnode_pv __attribute__((__unused__)), long bytes_to_free __attribute__((__unused__)), long* bytes_freed, void* extraargs __attribute__((__unused__)) ) { *bytes_freed = bytes_to_free; return 0; } static BOOL pf_req_callback(void* UU(brtnode_pv), void* UU(read_extraargs)) { // placeholder for now return FALSE; } static int pf_callback(void* UU(brtnode_pv), void* UU(read_extraargs), int UU(fd), long* UU(sizep)) { assert(FALSE); } static void* do_update (void *UU(ignore)) { while (n_flush==0); // wait until the first checkpoint ran int i; for (i=0; i