[sheepdog] [PATCH v2 05/11] gateway: support forward read request

Liu Yuan namei.unix at gmail.com
Thu Sep 26 09:25:42 CEST 2013


Signed-off-by: Liu Yuan <namei.unix at gmail.com>
---
 sheep/gateway.c |   25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/sheep/gateway.c b/sheep/gateway.c
index fb1b839..39de820 100644
--- a/sheep/gateway.c
+++ b/sheep/gateway.c
@@ -89,6 +89,7 @@ struct forward_info_entry {
 	struct pollfd pfd;
 	const struct node_id *nid;
 	struct sockfd *sfd;
+	void *buf;
 };
 
 struct forward_info {
@@ -116,6 +117,17 @@ static inline void finish_one_entry_err(struct forward_info *fi, int i)
 	forward_info_update(fi, i);
 }
 
+static inline struct forward_info_entry *
+forward_info_find(struct forward_info *fi, int fd)
+{
+	for (int i = 0; i < fi->nr_sent; i++)
+		if (fi->ent[i].pfd.fd == fd)
+			return &fi->ent[i];
+
+	panic("can't find entry for %d", fd);
+	return NULL;
+}
+
 struct pfd_info {
 	struct pollfd pfds[SD_MAX_NODES];
 	int nr;
@@ -192,6 +204,19 @@ again:
 			goto out;
 		}
 
+		if (rsp->data_length) {
+			struct forward_info_entry *ent;
+
+			ent = forward_info_find(fi, pi.pfds[i].fd);
+			if (do_read(pi.pfds[i].fd, ent->buf, rsp->data_length,
+				    sheep_need_retry, req->rq.epoch,
+				    MAX_RETRY_COUNT)) {
+				sd_err("remote node might have gone away");
+				err_ret = SD_RES_NETWORK_ERROR;
+				finish_one_entry_err(fi, i);
+				goto out;
+			}
+		}
 		ret = rsp->result;
 		if (ret != SD_RES_SUCCESS) {
 			sd_err("fail %"PRIx64", %s", req->rq.obj.oid,
-- 
1.7.9.5




More information about the sheepdog mailing list