/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ // vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4: // Make sure that the pending stuff gets checkpointed, but subsequent changes don't, even with concurrent updates. #ident "$Id$" #ident "Copyright (c) 2007-2012 Tokutek Inc. All rights reserved." #include "test.h" #include #include #include "cachetable-test.h" #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(dd), void *UU(extraargs), PAIR_ATTR size, PAIR_ATTR* UU(new_size), bool write_me, bool keep_me, bool UU(for_checkpoint), bool UU(is_clone) ) { // printf("f"); assert(size.size== item_size); int *CAST_FROM_VOIDP(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 void* do_update (void *UU(ignore)) { while (n_flush==0); // wait until the first checkpoint ran int i; for (i=0; i