[Sheepdog] [PATCH 09/10] collie: forward READ_VDIS

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Tue Jan 26 05:34:55 CET 2010


Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
---
 collie/store.c |   75 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 72 insertions(+), 3 deletions(-)

diff --git a/collie/store.c b/collie/store.c
index e280e10..05070a9 100644
--- a/collie/store.c
+++ b/collie/store.c
@@ -740,9 +740,78 @@ void so_queue_request(struct work *work, int idx)
 		goto out;
 	}
 
-	result = check_epoch(cluster, req);
-	if (result != SD_RES_SUCCESS)
-		goto out;
+	/*
+	 * FIXME: too hacky; we need to rethink about how to all the
+	 * VDI operaitons
+	 */
+	if (opcode == SD_OP_SO_READ_VDIS) {
+		struct sheepdog_node_list_entry *e;
+		int nr, i, n;
+		int local = 0;
+
+		e = zalloc(SD_MAX_NODES * sizeof(struct sheepdog_node_list_entry));
+		nr = build_node_list(&cluster->node_list, e);
+
+		for (i = 0; i < cluster->nr_sobjs; i++) {
+			n = obj_to_sheep(e, nr, SD_DIR_OID, i);
+
+			if (e[n].id == cluster->this_node.id) {
+				local = 1;
+				break;
+			}
+		}
+
+		if (!local) {
+			struct sd_so_req hdr2;
+			char name[128];
+			int fd;
+			unsigned wlen, rlen;
+
+			n = obj_to_sheep(e, nr, SD_DIR_OID, 0);
+
+			snprintf(name, sizeof(name), "%d.%d.%d.%d",
+				 e[n].addr[12], e[n].addr[13],
+				 e[n].addr[14], e[n].addr[15]);
+
+			eprintf("%s %d\n", name, e[n].port);
+
+			fd = connect_to(name, e[n].port);
+			if (fd < 0) {
+				rsp->result = SD_RES_EIO;
+				goto out;
+			}
+
+			memset(&hdr2, 0, sizeof(hdr2));
+			hdr2.opcode = SD_OP_SO_READ_VDIS;
+			hdr2.epoch = cluster->epoch;
+			hdr2.data_length = hdr->data_length;
+
+			wlen = 0;
+			rlen = hdr->data_length;
+
+			eprintf("%d\n", fd);
+
+			ret = exec_req(fd, (struct sd_req *)&hdr2,
+				       req->data, &wlen, &rlen);
+
+			close(fd);
+
+			rsp->result = ((struct sd_rsp *)&hdr2)->result;
+			rsp->data_length = ((struct sd_rsp *)&hdr2)->data_length;
+
+			eprintf("%d\n", rsp->result);
+		}
+
+		free(e);
+		if (!local)
+			goto out;
+	}
+
+	if (opcode != SD_OP_SO_READ_VDIS) {
+		result = check_epoch(cluster, req);
+		if (result != SD_RES_SUCCESS)
+			goto out;
+	}
 
 	memset(path, 0, sizeof(path));
 	snprintf(path, sizeof(path), "%s", vdi_path);
-- 
1.5.6.5




More information about the sheepdog mailing list