uint32_t Infiniband::MemoryManager::Chunk::read(char* buf, uint32_t len)
{
uint32_t left = get_size();
- if (left >= len) {
- memcpy(buf, buffer+offset, len);
- offset += len;
- return len;
- } else {
- memcpy(buf, buffer+offset, left);
- offset = 0;
- bound = 0;
- return left;
- }
+ uint32_t read_len = left <= len ? left : len;
+ memcpy(buf, buffer + offset, read_len);
+ offset += read_len;
+ return read_len;
}
uint32_t Infiniband::MemoryManager::Chunk::write(char* buf, uint32_t len)
chunk->prepare_read(response->byte_len);
worker->perf_logger->inc(l_msgr_rdma_rx_bytes, response->byte_len);
if (response->byte_len == 0) {
+ chunk->clear();
dispatcher->perf_logger->inc(l_msgr_rdma_rx_fin);
if (connected) {
error = ECONNRESET;
ldout(cct, 25) << __func__ << " buffers add a chunk: " << chunk->get_offset() << ":" << chunk->get_bound() << dendl;
} else {
read += chunk->read(buf+read, response->byte_len);
+ chunk->clear();
dispatcher->post_chunk_to_pool(chunk);
update_post_backlog();
}
read += tmp;
ldout(cct, 25) << __func__ << " this iter read: " << tmp << " bytes." << " offset: " << (*c)->get_offset() << " ,bound: " << (*c)->get_bound() << ". Chunk:" << *c << dendl;
if ((*c)->get_size() == 0) {
+ (*c)->clear();
dispatcher->post_chunk_to_pool(*c);
update_post_backlog();
ldout(cct, 25) << __func__ << " one chunk over." << dendl;