int sheep_exec_req(const struct node_id *nid, struct sd_req *hdr, void *buf) { struct sd_rsp *rsp = (struct sd_rsp *)hdr; struct sockfd *sfd; int ret; assert(is_worker_thread()); sfd = sockfd_cache_get(nid); if (!sfd) return SD_RES_NETWORK_ERROR; ret = exec_req(sfd->fd, hdr, buf, sheep_need_retry, hdr->epoch, MAX_RETRY_COUNT); if (ret) { sd_dprintf("remote node might have gone away"); sockfd_cache_del(nid, sfd); return SD_RES_NETWORK_ERROR; } ret = rsp->result; if (ret != SD_RES_SUCCESS) sd_eprintf("failed %s", sd_strerror(ret)); sockfd_cache_put(nid, sfd); return ret; }
int dog_exec_req(const uint8_t *addr, int port, struct sd_req *hdr, void *buf) { struct node_id nid = {}; struct sockfd *sfd; int ret; memcpy(nid.addr, addr, sizeof(nid.addr)); nid.port = port; sfd = sockfd_cache_get(&nid); if (!sfd) return -1; /* * Retry forever for dog because * 1. We can't get the newest epoch * 2. Some operations might take unexpected long time */ ret = exec_req(sfd->fd, hdr, buf, NULL, 0, UINT32_MAX); sockfd_cache_put(&nid, sfd); return ret ? -1 : 0; }
int collie_exec_req(const char *host, int port, struct sd_req *hdr, void *buf) { struct node_id nid; struct sockfd *sfd; int ret; memset(&nid, 0, sizeof(nid)); str_to_addr(host, nid.addr); nid.port = port; sfd = sockfd_cache_get(&nid); if (!sfd) return -1; /* * Retry forever for collie because * 1. We can't get the newest epoch * 2. Some operations might take unexpected long time */ ret = exec_req(sfd->fd, hdr, buf, NULL, 0, UINT32_MAX); sockfd_cache_put(&nid, sfd); return ret ? -1 : 0; }
int dog_exec_req(const struct node_id *nid, struct sd_req *hdr, void *buf) { struct sockfd *sfd; int ret; sfd = sockfd_cache_get(nid); if (!sfd) return -1; /* * Retry forever for dog because * 1. We can't get the newest epoch * 2. Some operations might take unexpected long time */ ret = exec_req(sfd->fd, hdr, buf, NULL, 0, UINT32_MAX); sockfd_cache_put(nid, sfd); return ret ? -1 : 0; }
static inline void finish_one_write(struct write_info *wi, int i) { sockfd_cache_put(wi->ent[i].nid, wi->ent[i].sfd); write_info_update(wi, i); }