[Sheepdog] [PATCH 1/2] store: split store_queue_request_local

Christoph Hellwig hch at infradead.org
Fri Nov 11 13:49:26 CET 2011


Split store_queue_request_local into one function for each command.  While
this leads to a small amount of duplication it keeps the code nicely
separated and helps with adding new commands.

Signed-off-by: Christoph Hellwig <hch at lst.de>

Index: sheepdog/sheep/store.c
===================================================================
--- sheepdog.orig/sheep/store.c	2011-11-11 13:30:05.000000000 +0100
+++ sheepdog/sheep/store.c	2011-11-11 13:33:37.650025624 +0100
@@ -574,163 +574,227 @@ int read_object_local(uint64_t oid, char
 	return rsp_data_length;
 }
 
-static int store_queue_request_local(struct request *req, uint32_t epoch)
+static int store_remove_obj(struct request *req, uint32_t epoch)
+{
+	struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
+	char path[1024];
+
+	snprintf(path, sizeof(path), "%s%08u/%016" PRIx64, obj_path,
+		 epoch, hdr->oid);
+
+	if (unlink(path) < 0) {
+		if (errno == ENOENT)
+			return SD_RES_NO_OBJ;
+		eprintf("%m\n");
+		return SD_RES_EIO;
+	}
+
+	return SD_RES_SUCCESS;
+}
+
+static int store_read_obj(struct request *req, uint32_t epoch)
 {
-	int fd = -1;
-	int ret = SD_RES_SUCCESS;
 	struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
 	struct sd_obj_rsp *rsp = (struct sd_obj_rsp *)&req->rp;
-	uint64_t oid = hdr->oid;
-	uint32_t opcode = hdr->opcode;
-	char path[1024], *buf = NULL;
+	int ret = SD_RES_SUCCESS;
+	int fd = -1;
 
-	dprintf("%x, %" PRIx64" , %u\n", opcode, oid, epoch);
+	fd = ob_open(epoch, hdr->oid, 0, &ret);
+	if (fd < 0)
+		return ret;
+
+	ret = pread64(fd, req->data, hdr->data_length, hdr->offset);
+	if (ret < 0) {
+		eprintf("%m\n");
+		ret = SD_RES_EIO;
+		goto out;
+	}
 
-	switch (opcode) {
-	case SD_OP_WRITE_OBJ:
-	case SD_OP_READ_OBJ:
-		fd = ob_open(epoch, oid, 0, &ret);
-		if (fd < 0)
-			goto out;
-		break;
-	case SD_OP_CREATE_AND_WRITE_OBJ:
-		if (!hdr->copies) {
-			eprintf("the number of copies cannot be zero\n");
-			ret = SD_RES_INVALID_PARMS;
-			goto out;
-		}
+	rsp->data_length = ret;
+	rsp->copies = sys->nr_sobjs;
 
-		fd = ob_open(epoch, oid, O_CREAT|O_TRUNC, &ret);
-		if (fd < 0)
-			goto out;
-
-		if (hdr->flags & SD_FLAG_CMD_COW) {
-			dprintf("%" PRIu64 ", %" PRIx64 "\n", oid, hdr->cow_oid);
-
-			buf = valloc(SD_DATA_OBJ_SIZE);
-			if (!buf) {
-				eprintf("failed to allocate memory\n");
-				ret = SD_RES_NO_MEM;
-				goto out;
-			}
-			ret = read_from_other_sheep(req, hdr->epoch, hdr->cow_oid, buf,
-						     hdr->copies);
-			if (ret) {
-				eprintf("failed to read old object\n");
-				ret = SD_RES_EIO;
-				goto out;
-			}
-			ret = pwrite64(fd, buf, SD_DATA_OBJ_SIZE, 0);
-			if (ret != SD_DATA_OBJ_SIZE) {
-				if (errno == ENOSPC)
-					ret = SD_RES_NO_SPACE;
-				else {
-					eprintf("%m\n");
-					ret = SD_RES_EIO;
-				}
-				goto out;
-			}
-			free(buf);
-			buf = NULL;
-		} else {
-			int size = SECTOR_SIZE;
-			buf = valloc(size);
-			if (!buf) {
-				eprintf("failed to allocate memory\n");
-				ret = SD_RES_NO_MEM;
-				goto out;
-			}
-			memset(buf, 0, size);
-			ret = pwrite64(fd, buf, size, SD_DATA_OBJ_SIZE - size);
-			free(buf);
-			buf = NULL;
-
-			if (ret != size) {
-				if (errno == ENOSPC)
-					ret = SD_RES_NO_SPACE;
-				else {
-					eprintf("%m\n");
-					ret = SD_RES_EIO;
-				}
-				goto out;
-			}
-		}
+	ret = SD_RES_SUCCESS;
+out:
+	close(fd);
+	return ret;
+}
 
-	default:
-		break;
+static int store_write_obj_fd(int fd, struct request *req, uint32_t epoch)
+{
+	struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
+	uint64_t oid = hdr->oid;
+	int ret = SD_RES_SUCCESS;
+
+	if (hdr->flags & SD_FLAG_CMD_TRUNCATE) {
+		ret = ftruncate(fd, hdr->offset + hdr->data_length);
+		if (ret) {
+			eprintf("%m\n");
+			return SD_RES_EIO;
+		}
 	}
 
-	switch (opcode) {
-	case SD_OP_REMOVE_OBJ:
+	if (is_vdi_obj(oid)) {
+		char path[1024];
+
 		snprintf(path, sizeof(path), "%s%08u/%016" PRIx64, obj_path,
 			 epoch, oid);
-		ret = unlink(path);
-		if (ret) {
-			if (errno == ENOENT)
-				ret = SD_RES_NO_OBJ;
-			else {
-				eprintf("%m\n");
-				ret = SD_RES_EIO;
-			}
-		}
-		break;
-	case SD_OP_READ_OBJ:
-		ret = pread64(fd, req->data, hdr->data_length, hdr->offset);
-		if (ret < 0) {
+		ret = jrnl_perform(fd, req->data, hdr->data_length,
+				   hdr->offset, path, jrnl_path);
+		if (ret)
+			return ret;
+	} else {
+		ret = pwrite64(fd, req->data, hdr->data_length, hdr->offset);
+		if (ret != hdr->data_length) {
+			if (errno == ENOSPC)
+				return SD_RES_NO_SPACE;
 			eprintf("%m\n");
-			ret = SD_RES_EIO;
-			goto out;
+			return SD_RES_EIO;
 		}
+	}
 
-		rsp->data_length = ret;
-		rsp->copies = sys->nr_sobjs;
+	return SD_RES_SUCCESS;
+}
 
-		ret = SD_RES_SUCCESS;
-		break;
-	case SD_OP_WRITE_OBJ:
-	case SD_OP_CREATE_AND_WRITE_OBJ:
-		if (hdr->flags & SD_FLAG_CMD_TRUNCATE) {
-			ret = ftruncate(fd, hdr->offset + hdr->data_length);
-			if (ret) {
-				eprintf("%m\n");
-				ret = SD_RES_EIO;
-				goto out;
-			}
-		}
+static int store_write_obj(struct request *req, uint32_t epoch)
+{
+	struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
+	int ret = SD_RES_SUCCESS;
+	int fd = -1;
 
-		if (is_vdi_obj(oid)) {
-			snprintf(path, sizeof(path), "%s%08u/%016" PRIx64, obj_path,
-				 epoch, oid);
-			ret = jrnl_perform(fd, req->data, hdr->data_length,
-					   hdr->offset, path, jrnl_path);
-			if (ret)
-				goto out;
-		} else {
-			ret = pwrite64(fd, req->data, hdr->data_length,
-				       hdr->offset);
-			if (ret != hdr->data_length) {
-				if (errno == ENOSPC)
-					ret = SD_RES_NO_SPACE;
-				else {
-					eprintf("%m\n");
-					ret = SD_RES_EIO;
-				}
-				goto out;
-			}
-		}
+	fd = ob_open(epoch, hdr->oid, 0, &ret);
+	if (fd < 0)
+		return ret;
 
-		ret = SD_RES_SUCCESS;
-		break;
+	ret = store_write_obj_fd(fd, req, epoch);
+
+	close(fd);
+	return ret;
+}
+
+static int store_create_and_write_obj_cow(struct request *req, uint32_t epoch)
+{
+	struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
+	int ret = SD_RES_SUCCESS;
+	int fd = -1;
+	char *buf = NULL;
+
+	if (!hdr->copies) {
+		eprintf("the number of copies cannot be zero\n");
+		return SD_RES_INVALID_PARMS;
+	}
+
+	fd = ob_open(epoch, hdr->oid, O_CREAT|O_TRUNC, &ret);
+	if (fd < 0)
+		return ret;
+
+	dprintf("%" PRIu64 ", %" PRIx64 "\n", hdr->oid, hdr->cow_oid);
+
+	buf = valloc(SD_DATA_OBJ_SIZE);
+	if (!buf) {
+		eprintf("failed to allocate memory\n");
+		ret = SD_RES_NO_MEM;
+		goto out;
+	}
+	ret = read_from_other_sheep(req, hdr->epoch, hdr->cow_oid, buf,
+				     hdr->copies);
+	if (ret) {
+		eprintf("failed to read old object\n");
+		ret = SD_RES_EIO;
+		goto out;
 	}
+	ret = pwrite64(fd, buf, SD_DATA_OBJ_SIZE, 0);
+	if (ret != SD_DATA_OBJ_SIZE) {
+		if (errno == ENOSPC)
+			ret = SD_RES_NO_SPACE;
+		else {
+			eprintf("%m\n");
+			ret = SD_RES_EIO;
+		}
+		goto out;
+	}
+	free(buf);
+	buf = NULL;
+
+	ret = store_write_obj_fd(fd, req, epoch);
 out:
 	if (buf)
 		free(buf);
+	close(fd);
+	return ret;
+}
+
+
+static int store_create_and_write_obj(struct request *req, uint32_t epoch)
+{
+	struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
+	const int size = SECTOR_SIZE;
+	int ret = SD_RES_SUCCESS;
+	int fd = -1;
+	char *buf = NULL;
+
+	if (!hdr->copies) {
+		eprintf("the number of copies cannot be zero\n");
+		return SD_RES_INVALID_PARMS;
+	}
+
+	fd = ob_open(epoch, hdr->oid, O_CREAT|O_TRUNC, &ret);
+	if (fd < 0)
+		return ret;
+
+	buf = valloc(size);
+	if (!buf) {
+		eprintf("failed to allocate memory\n");
+		ret = SD_RES_NO_MEM;
+		goto out;
+	}
+	memset(buf, 0, size);
+	ret = pwrite64(fd, buf, size, SD_DATA_OBJ_SIZE - size);
+	free(buf);
+
+	if (ret != size) {
+		if (errno == ENOSPC)
+			ret = SD_RES_NO_SPACE;
+		else {
+			eprintf("%m\n");
+			ret = SD_RES_EIO;
+		}
+		goto out;
+	}
 
-	if (fd != -1)
-		close(fd);
+	ret = store_write_obj_fd(fd, req, epoch);
+out:
+	close(fd);
+	return ret;
+}
+
+static int store_queue_request_local(struct request *req, uint32_t epoch)
+{
+	struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
+	int ret = SD_RES_SUCCESS;
+
+	dprintf("%x, %" PRIx64" , %u\n", hdr->opcode, hdr->oid, epoch);
+
+	switch (hdr->opcode) {
+	case SD_OP_WRITE_OBJ:
+		ret = store_write_obj(req, epoch);
+		break;
+	case SD_OP_REMOVE_OBJ:
+		ret = store_remove_obj(req, epoch);
+		break;
+	case SD_OP_READ_OBJ:
+		ret = store_read_obj(req, epoch);
+		break;
+	case SD_OP_CREATE_AND_WRITE_OBJ:
+		if (hdr->flags & SD_FLAG_CMD_COW)
+			ret = store_create_and_write_obj_cow(req, epoch);
+		else
+			ret = store_create_and_write_obj(req, epoch);
+		break;
+	}
 
 	if (ret == SD_RES_NO_OBJ && hdr->flags & SD_FLAG_CMD_RECOVERY) {
-		int len  = epoch_log_read(epoch - 1, req->data, hdr->data_length);
+		struct sd_obj_rsp *rsp = (struct sd_obj_rsp *)&req->rp;
+		int len = epoch_log_read(epoch - 1, req->data, hdr->data_length);
 		if (len < 0)
 			len = 0;
 		rsp->data_length = len;



More information about the sheepdog mailing list