/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ // vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4: // verify that cachetable prefetch multiple blocks hits the cachetable size limit // and flushes eventually happen. #ident "$Id$" #ident "Copyright (c) 2007-2012 Tokutek Inc. All rights reserved." #include "includes.h" #include "test.h" static int flush_calls = 0; static int flush_evict_calls = 0; static int evicted_keys = 0; static void flush (CACHEFILE f __attribute__((__unused__)), int UU(fd), CACHEKEY k, void *v __attribute__((__unused__)), void** UU(dd), void *e __attribute__((__unused__)), PAIR_ATTR s __attribute__((__unused__)), PAIR_ATTR* new_size __attribute__((__unused__)), bool w, bool keep, bool f_ckpt __attribute__((__unused__)), bool UU(is_clone) ) { assert(w == false); flush_calls++; if (keep == false) { flush_evict_calls++; if (verbose) printf("%s:%d flush %" PRId64 "\n", __FUNCTION__, __LINE__, k.b); evicted_keys |= 1 << k.b; } } static int fetch_calls = 0; static int fetch (CACHEFILE f __attribute__((__unused__)), int UU(fd), CACHEKEY k, uint32_t fullhash __attribute__((__unused__)), void **value, void** UU(dd), PAIR_ATTR *sizep, int *dirtyp, void *extraargs __attribute__((__unused__)) ) { fetch_calls++; if (verbose) printf("%s:%d %" PRId64 "\n", __FUNCTION__, __LINE__, k.b); *value = 0; *sizep = make_pair_attr(1); *dirtyp = 0; return 0; } // Note: cachetable_size_limit must be a power of 2 static void cachetable_prefetch_flowcontrol_test (int cachetable_size_limit) { int r; CACHETABLE ct; r = toku_create_cachetable(&ct, cachetable_size_limit, ZERO_LSN, NULL_LOGGER); assert(r == 0); char fname1[] = __SRCFILE__ "test1.dat"; unlink(fname1); CACHEFILE f1; r = toku_cachetable_openf(&f1, ct, fname1, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO); assert(r == 0); int i; CACHETABLE_WRITE_CALLBACK wc = def_write_callback(NULL); wc.flush_callback = flush; // prefetch keys 0 .. N-1. they should all fit in the cachetable for (i=0; i