[Sheepdog] [PATCH 3/4] sheep: close cached fd when network error happens

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Thu Dec 15 23:01:19 CET 2011


Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 sheep/sdnet.c      |   21 +++++++++++++++++++--
 sheep/sheep_priv.h |    1 +
 sheep/store.c      |   10 +++++++---
 3 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/sheep/sdnet.c b/sheep/sdnet.c
index 5c97374..66ce6b3 100644
--- a/sheep/sdnet.c
+++ b/sheep/sdnet.c
@@ -791,10 +791,27 @@ int remove_object(struct sheepdog_vnode_list_entry *e,
 	return 0;
 }
 
+static __thread int cached_fds[SD_MAX_NODES];
+static __thread uint32_t cached_epoch = 0;
+
+void del_sheep_fd(int fd)
+{
+	int i;
+
+	for (i = 0; i < SD_MAX_NODES; i++) {
+		if (cached_fds[i] == fd) {
+			if (fd >= 0)
+				close(fd);
+
+			cached_fds[i] = -1;
+
+			return;
+		}
+	}
+}
+
 int get_sheep_fd(uint8_t *addr, uint16_t port, int node_idx, uint32_t epoch)
 {
-	static __thread int cached_fds[SD_MAX_NODES];
-	static __thread uint32_t cached_epoch = 0;
 	int i, fd, ret;
 	char name[INET6_ADDRSTRLEN];
 
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 556d719..a448157 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -268,6 +268,7 @@ int remove_object(struct sheepdog_vnode_list_entry *e,
 		  int vnodes, int zones, uint32_t node_version,
 		  uint64_t oid, int nr);
 
+void del_sheep_fd(int fd);
 int get_sheep_fd(uint8_t *addr, uint16_t port, int node_idx, uint32_t epoch);
 
 /* Operations */
diff --git a/sheep/store.c b/sheep/store.c
index c0d7b62..70f9011 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -260,9 +260,10 @@ static int forward_read_obj_req(struct request *req)
 
 	ret = exec_req(fd, (struct sd_req *)&hdr, req->data, &wlen, &rlen);
 
-	if (ret) /* network errors */
+	if (ret) { /* network errors */
+		del_sheep_fd(fd);
 		ret = SD_RES_NETWORK_ERROR;
-	else {
+	} else {
 		memcpy(&req->rp, rsp, sizeof(*rsp));
 		ret = rsp->result;
 	}
@@ -272,7 +273,7 @@ out:
 
 static int forward_write_obj_req(struct request *req)
 {
-	int i, n, nr, fd, ret;
+	int i, n, nr, fd, ret, pollret;
 	unsigned wlen;
 	char name[128];
 	struct sd_obj_req hdr = *(struct sd_obj_req *)&req->rq;
@@ -323,6 +324,7 @@ static int forward_write_obj_req(struct request *req)
 
 		ret = send_req(fd, (struct sd_req *)&hdr, req->data, &wlen);
 		if (ret) { /* network errors */
+			del_sheep_fd(fd);
 			ret = SD_RES_NETWORK_ERROR;
 			dprintf("fail %"PRIu32"\n", ret);
 			goto out;
@@ -362,6 +364,7 @@ again:
 			break;
 
 		if (pfds[i].revents & POLLERR || pfds[i].revents & POLLHUP || pfds[i].revents & POLLNVAL) {
+			del_sheep_fd(pfds[i].fd);
 			ret = SD_RES_NETWORK_ERROR;
 			break;
 		}
@@ -371,6 +374,7 @@ again:
 
 		if (do_read(pfds[i].fd, rsp, sizeof(*rsp))) {
 			eprintf("failed to read a response: %m\n");
+			del_sheep_fd(pfds[i].fd);
 			ret = SD_RES_NETWORK_ERROR;
 			break;
 		}
-- 
1.7.2.5




More information about the sheepdog mailing list