/* -*- 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__)), int UU(fd), 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__)), int UU(fd), CACHEKEY k, u_int32_t fullhash __attribute__((__unused__)), void **value, long *sizep, int *dirtyp, void *extraargs __attribute__((__unused__)) ) { fetch_calls++; if (verbose) printf("%s:%d %"PRId64"\n", __FUNCTION__, __LINE__, k.b); *value = 0; *sizep = 1; *dirtyp = 0; return 0; } static int pe_callback ( void *brtnode_pv __attribute__((__unused__)), long bytes_to_free __attribute__((__unused__)), long* bytes_freed, void* extraargs __attribute__((__unused__)) ) { *bytes_freed = 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[] = __FILE__ "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; // prefetch keys 0 .. N-1. they should all fit in the cachetable for (i=0; i