[Sheepdog] [PATCH 06/18] collie: support SD_OP_GET_EPOCH_LIST

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Thu Mar 11 07:48:05 CET 2010


This supports getting epoch number list stored in the epoch directory.
Start up routines use this feature.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 collie/collie.h          |    3 +++
 collie/net.c             |    3 +++
 collie/store.c           |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 include/sheepdog_proto.h |   28 ++++++++++++++++++++++++++++
 4 files changed, 80 insertions(+), 0 deletions(-)

diff --git a/collie/collie.h b/collie/collie.h
index 89eb8f8..37e9dd1 100644
--- a/collie/collie.h
+++ b/collie/collie.h
@@ -96,6 +96,9 @@ void so_queue_request(struct work *work, int idx);
 
 void store_queue_request(struct work *work, int idx);
 
+int get_epoch_list(uint32_t *epoch_list, int *size);
+void epoch_queue_request(struct work *work, int idx);
+
 void cluster_queue_request(struct work *work, int idx);
 
 int update_epoch_store(uint32_t epoch);
diff --git a/collie/net.c b/collie/net.c
index 84eecdc..70082ad 100644
--- a/collie/net.c
+++ b/collie/net.c
@@ -49,6 +49,9 @@ static void queue_request(struct request *req)
 	case SD_OP_GET_OBJ_LIST:
 		req->work.fn = store_queue_request;
 		break;
+	case SD_OP_GET_EPOCH_LIST:
+		req->work.fn = epoch_queue_request;
+		break;
 	case SD_OP_GET_NODE_LIST:
 	case SD_OP_GET_VM_LIST:
 	case SD_OP_NEW_VDI:
diff --git a/collie/store.c b/collie/store.c
index e46ca46..280fc4a 100644
--- a/collie/store.c
+++ b/collie/store.c
@@ -1574,3 +1574,49 @@ int init_store(char *d)
 
 	return ret;
 }
+
+int get_epoch_list(uint32_t *epoch_list, int *size)
+{
+	struct dirent **dent;
+	int i, n;
+
+	n = scandir(epoch_path, &dent, filter, alphasort);
+	if (n < 0)
+		return SD_RES_NO_MEM;
+
+	/* FIXME: handle more epochs */
+	if (n > *size) {
+		eprintf("too many epoch\n");
+		n = *size;
+	}
+
+	for (i = 0; i < n; i++)
+		epoch_list[i] = atoi(dent[i]->d_name);
+
+	*size = n;
+
+	free(dent);
+
+	return SD_RES_SUCCESS;
+}
+
+void epoch_queue_request(struct work *work, int idx)
+{
+	struct request *req = container_of(work, struct request, work);
+	int ret = SD_RES_SUCCESS, n;
+	struct sd_epoch_req *hdr = (struct sd_epoch_req *)&req->rq;
+	struct sd_epoch_rsp *rsp = (struct sd_epoch_rsp *)&req->rp;
+	uint32_t opcode = hdr->opcode;
+
+	switch (opcode) {
+	case SD_OP_GET_EPOCH_LIST:
+		n = hdr->data_length / sizeof(uint32_t);
+		ret = get_epoch_list(req->data, &n);
+		rsp->data_length = n * sizeof(uint32_t);
+		break;
+	}
+	if (ret != SD_RES_SUCCESS) {
+		dprintf("failed, %d, %x, %x\n", idx, opcode, ret);
+		rsp->result = ret;
+	}
+}
diff --git a/include/sheepdog_proto.h b/include/sheepdog_proto.h
index cf803b7..64d0016 100644
--- a/include/sheepdog_proto.h
+++ b/include/sheepdog_proto.h
@@ -36,6 +36,8 @@
 #define SD_OP_GET_EPOCH      0x23
 #define SD_OP_SHUTDOWN       0x24
 
+#define SD_OP_GET_EPOCH_LIST 0x25
+
 #define SD_OP_DEBUG_INC_NVER 0xA0
 #define SD_OP_DEBUG_SET_NODE 0xA1
 
@@ -87,6 +89,7 @@
 #define SD_RES_NO_EPOCH      0x16 /* Requested epoch is not found */
 #define SD_RES_VDI_NOT_LOCKED   0x17 /* Vdi is not locked */
 #define SD_RES_SHUTDOWN      0x18 /* Sheepdog is shutting down */
+#define SD_RES_NO_MEM        0x19 /* Cannot allocate memory */
 
 #define SD_VDI_RSP_FLAG_CURRENT 0x01
 
@@ -111,6 +114,31 @@ struct sd_rsp {
 	uint32_t	opcode_specific[7];
 };
 
+struct sd_epoch_req {
+	uint8_t		proto_ver;
+	uint8_t		opcode;
+	uint16_t	flags;
+	uint32_t	epoch;
+	uint32_t        id;
+	uint32_t        data_length;
+	uint32_t        request_epoch;
+	uint32_t	pad[7];
+};
+
+struct sd_epoch_rsp {
+	uint8_t		proto_ver;
+	uint8_t		opcode;
+	uint16_t	flags;
+	uint32_t	epoch;
+	uint32_t        id;
+	uint32_t        data_length;
+	uint32_t        result;
+	uint32_t        is_updated;
+	uint64_t        ctime;
+	uint64_t        hval;
+	uint32_t	pad[2];
+};
+
 struct sd_so_req {
 	uint8_t		proto_ver;
 	uint8_t		opcode;
-- 
1.5.6.5




More information about the sheepdog mailing list