// Process a batch request. static void batch_process_request(batch_transaction* btr) { // Keep the reaper at bay. btr->fd_h->last_used = cf_getms(); cf_buf_builder* bb = 0; batch_build_response(btr, &bb); int fd = btr->fd_h->fd; if (bb) { int brv = batch_send_header(fd, bb->used_sz); if (brv == 0) { brv = batch_send(fd, bb->buf, bb->used_sz, MSG_NOSIGNAL | MSG_MORE); if (brv == 0) { brv = batch_send_final(fd, 0); } } cf_buf_builder_free(bb); } else { cf_info(AS_BATCH, " batch request: returned no local responses"); batch_send_final(fd, 0); } batch_transaction_done(btr); }
// Process one queue's batch requests. void* batch_process_queue(void* q_to_wait_on) { cf_queue* worker_queue = (cf_queue*)q_to_wait_on; batch_transaction btr; uint64_t start; while (1) { if (cf_queue_pop(worker_queue, &btr, CF_QUEUE_FOREVER) != 0) { cf_crash(AS_BATCH, "Failed to pop from batch worker queue."); } // Check for timeouts. if (btr.end_time != 0 && cf_getns() > btr.end_time) { cf_atomic_int_incr(&g_config.batch_timeout); if (btr.fd_h) { as_msg_send_reply(btr.fd_h, AS_PROTO_RESULT_FAIL_TIMEOUT, 0, 0, 0, 0, 0, 0, 0, btr.trid, NULL); btr.fd_h = 0; } batch_transaction_done(&btr); continue; } // Process batch request. start = cf_getns(); batch_process_request(&btr); histogram_insert_data_point(g_config.batch_q_process_hist, start); } return 0; }
// Process one queue's batch requests. static void batch_worker(void* udata) { batch_transaction* btr = (batch_transaction*)udata; // Check for timeouts. if (btr->end_time != 0 && cf_getns() > btr->end_time) { cf_atomic_int_incr(&g_config.batch_timeout); if (btr->fd_h) { as_msg_send_reply(btr->fd_h, AS_PROTO_RESULT_FAIL_TIMEOUT, 0, 0, 0, 0, 0, 0, 0, btr->trid, NULL); btr->fd_h = 0; } batch_transaction_done(btr, false); return; } // Process batch request. uint64_t start = cf_getns(); batch_process_request(btr); histogram_insert_data_point(g_config.batch_q_process_hist, start); }