read one request from trace file return 0 if success, 1 if error
| 126 | // read one request from trace file |
| 127 | // return 0 if success, 1 if error |
| 128 | int lcs_read_one_req(reader_t *reader, request_t *req) { |
| 129 | char *record = read_bytes(reader, reader->item_size); |
| 130 | |
| 131 | if (record == NULL) { |
| 132 | req->valid = FALSE; |
| 133 | return 1; |
| 134 | } |
| 135 | |
| 136 | if (reader->lcs_ver == 1) { |
| 137 | lcs_req_v1_t *req_v1 = (lcs_req_v1_t *)record; |
| 138 | req->clock_time = req_v1->clock_time; |
| 139 | req->obj_id = req_v1->obj_id; |
| 140 | req->obj_size = req_v1->obj_size; |
| 141 | req->next_access_vtime = req_v1->next_access_vtime; |
| 142 | } else if (reader->lcs_ver == 2) { |
| 143 | lcs_req_v2_t *req_v2 = (lcs_req_v2_t *)record; |
| 144 | req->clock_time = req_v2->clock_time; |
| 145 | req->obj_id = req_v2->obj_id; |
| 146 | req->obj_size = req_v2->obj_size; |
| 147 | req->next_access_vtime = req_v2->next_access_vtime; |
| 148 | req->tenant_id = req_v2->tenant; |
| 149 | req->op = req_v2->op; |
| 150 | } else if (reader->lcs_ver == 3) { |
| 151 | lcs_req_v3_t *req_v3 = (lcs_req_v3_t *)record; |
| 152 | req->clock_time = req_v3->clock_time; |
| 153 | req->obj_id = req_v3->obj_id; |
| 154 | req->obj_size = req_v3->obj_size; |
| 155 | req->next_access_vtime = req_v3->next_access_vtime; |
| 156 | req->tenant_id = req_v3->tenant; |
| 157 | req->op = req_v3->op; |
| 158 | req->ttl = req_v3->ttl; |
| 159 | } else if (reader->lcs_ver >= 4 && reader->lcs_ver <= 8) { |
| 160 | lcs_req_v3_t *req_v3 = (lcs_req_v3_t *)record; |
| 161 | req->clock_time = req_v3->clock_time; |
| 162 | req->obj_id = req_v3->obj_id; |
| 163 | req->obj_size = req_v3->obj_size; |
| 164 | req->next_access_vtime = req_v3->next_access_vtime; |
| 165 | req->tenant_id = req_v3->tenant; |
| 166 | req->op = req_v3->op; |
| 167 | req->ttl = req_v3->ttl; |
| 168 | |
| 169 | int n_features = LCS_VER_TO_N_FEATURES[reader->lcs_ver]; |
| 170 | int32_t *features = (int32_t *)(record + sizeof(lcs_req_v3_t)); |
| 171 | req->n_features = n_features; |
| 172 | for (int i = 0; i < n_features; i++) { |
| 173 | req->features[i] = *(int32_t *)(features + i * sizeof(int32_t)); |
| 174 | } |
| 175 | } else { |
| 176 | ERROR("invalid lcs version %ld\n", (unsigned long)reader->lcs_ver); |
| 177 | return 1; |
| 178 | } |
| 179 | |
| 180 | if (req->next_access_vtime == -1 || req->next_access_vtime == INT64_MAX) { |
| 181 | req->next_access_vtime = MAX_REUSE_DISTANCE; |
| 182 | } |
| 183 | |
| 184 | if (req->obj_size == 0 && reader->ignore_size_zero_req && reader->read_direction == READ_FORWARD) { |
| 185 | return lcs_read_one_req(reader, req); |
no test coverage detected