/* -*- mode: C; c-basic-offset: 4 -*- */ // verify that cachetable prefetch multiple blocks hits the cachetable size limit // and flushes eventually happen. #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__)), CACHEKEY k, void *v __attribute__((__unused__)), void *e __attribute__((__unused__)), long s __attribute__((__unused__)), BOOL w, BOOL keep, BOOL f_ckpt __attribute__((__unused__)) ) { 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__)), CACHEKEY k, u_int32_t fullhash __attribute__((__unused__)), void **value, long *sizep, void *extraargs __attribute__((__unused__)) ) { fetch_calls++; if (verbose) printf("%s:%d %"PRId64"\n", __FUNCTION__, __LINE__, k.b); *value = 0; *sizep = 1; 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[] = __FILE__ "test1.dat"; unlink(fname1); CACHEFILE f1; r = toku_cachetable_openf(&f1, ct, fname1, fname1, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO); assert(r == 0); int i; // prefetch keys 0 .. N-1. they should all fit in the cachetable for (i=0; i