// 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" 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), PAIR_ATTR size, PAIR_ATTR* UU(new_size), BOOL write_me, BOOL keep_me, BOOL UU(for_checkpoint) ) { // printf("f"); assert(size.size== item_size); int *v = value; if (*v!=expect_value) printf("got %d expect %d\n", *v, expect_value); assert(*v==expect_value); (void)__sync_fetch_and_add(&n_flush, 1); if (write_me) (void)__sync_fetch_and_add(&n_write_me, 1); if (keep_me) (void)__sync_fetch_and_add(&n_keep_me, 1); sleep_random(); } static int fetch ( CACHEFILE UU(thiscf), int UU(fd), CACHEKEY UU(key), u_int32_t UU(fullhash), void **UU(value), PAIR_ATTR *UU(sizep), int *UU(dirtyp), void *UU(extraargs) ) { assert(0); // should not be called return 0; } static void* do_update (void *UU(ignore)) { while (n_flush==0); // wait until the first checkpoint ran int i; for (i=0; i