| 37 | } sim_mt_params_t; |
| 38 | |
| 39 | static void _simulate(gpointer data, gpointer user_data) { |
| 40 | sim_mt_params_t *params = (sim_mt_params_t *)user_data; |
| 41 | int idx = GPOINTER_TO_UINT(data) - 1; |
| 42 | if (params->use_random_seed) { |
| 43 | set_rand_seed(rand()); |
| 44 | } else { |
| 45 | set_rand_seed(1); |
| 46 | } |
| 47 | |
| 48 | cache_stat_t *result = params->result; |
| 49 | /* If an array of readers is provided, use the one corresponding to this cache; otherwise, use the single reader */ |
| 50 | reader_t *source_reader = params->readers ? params->readers[idx] : params->reader; |
| 51 | reader_t *cloned_reader = clone_reader(source_reader); |
| 52 | request_t *req = new_request(); |
| 53 | cache_t *local_cache = params->caches[idx]; |
| 54 | strncpy(result[idx].cache_name, local_cache->cache_name, CACHE_NAME_ARRAY_LEN); |
| 55 | |
| 56 | /* warm up using warmup_reader */ |
| 57 | if (params->warmup_reader) { |
| 58 | reader_t *warmup_cloned_reader = clone_reader(params->warmup_reader); |
| 59 | read_one_req(warmup_cloned_reader, req); |
| 60 | while (req->valid) { |
| 61 | local_cache->get(local_cache, req); |
| 62 | result[idx].n_warmup_req += 1; |
| 63 | read_one_req(warmup_cloned_reader, req); |
| 64 | } |
| 65 | close_reader(warmup_cloned_reader); |
| 66 | INFO("cache %s (size %" PRIu64 |
| 67 | ") finishes warm up using warmup reader " |
| 68 | "with %" PRIu64 " requests\n", |
| 69 | local_cache->cache_name, local_cache->cache_size, result[idx].n_warmup_req); |
| 70 | } |
| 71 | |
| 72 | read_one_req(cloned_reader, req); |
| 73 | int64_t start_ts = (int64_t)req->clock_time; |
| 74 | |
| 75 | /* using warmup_frac or warmup_sec of requests from reader to warm up */ |
| 76 | if (params->n_warmup_req > 0 || params->warmup_sec > 0) { |
| 77 | uint64_t n_warmup = 0; |
| 78 | while (req->valid && (n_warmup < params->n_warmup_req || req->clock_time - start_ts < params->warmup_sec)) { |
| 79 | req->clock_time -= start_ts; |
| 80 | local_cache->get(local_cache, req); |
| 81 | n_warmup += 1; |
| 82 | read_one_req(cloned_reader, req); |
| 83 | } |
| 84 | result[idx].n_warmup_req += n_warmup; |
| 85 | INFO("cache %s (size %" PRIu64 |
| 86 | ") finishes warm up using " |
| 87 | "with %" PRIu64 " requests, %.2lf hour trace time\n", |
| 88 | local_cache->cache_name, local_cache->cache_size, n_warmup, (double)(req->clock_time - start_ts) / 3600.0); |
| 89 | } |
| 90 | |
| 91 | while (req->valid) { |
| 92 | result[idx].n_req++; |
| 93 | result[idx].n_req_byte += req->obj_size; |
| 94 | |
| 95 | req->clock_time -= start_ts; |
| 96 | if (local_cache->get(local_cache, req) == false) { |
nothing calls this directly
no test coverage detected