From: Liu Yuan <[email protected]>

Have all the sd_xxx functions return SD_RES_XXX, we will have a unified error
handling for user program and more importantly, std error can't cover all the
error cases that is specific to the sheepdog cluster, such as SD_RES_NO_VDI
and SD_RES_NO_OBJ.

Signed-off-by: Liu Yuan <[email protected]>
---
 lib/shared/sheep.c | 63 +++++++++++++++++++++++++-----------------------------
 lib/shared/vdi.c   | 35 ++++++++++++++++--------------
 2 files changed, 48 insertions(+), 50 deletions(-)

diff --git a/lib/shared/sheep.c b/lib/shared/sheep.c
index 4c1b1f1..8568436 100644
--- a/lib/shared/sheep.c
+++ b/lib/shared/sheep.c
@@ -62,6 +62,9 @@ static int sheep_submit_sdreq(struct sd_cluster *c, struct 
sd_req *hdr,
                ret = xwrite(c->sockfd, data, wlen);
 out:
        sd_mutex_unlock(&c->submit_mutex);
+       if (unlikely(ret < 0))
+               return -SD_RES_EIO;
+
        return ret;
 }
 
@@ -86,7 +89,7 @@ int sd_run_sdreq(struct sd_cluster *c, struct sd_req *hdr, 
void *data)
 
        ret = xread(c->sockfd, rsp, sizeof(*rsp));
        if (ret < 0)
-               return ret;
+               return SD_RES_SYSTEM_ERROR;
 
        if (rlen > rsp->data_length)
                rlen = rsp->data_length;
@@ -94,20 +97,10 @@ int sd_run_sdreq(struct sd_cluster *c, struct sd_req *hdr, 
void *data)
        if (rlen) {
                ret = xread(c->sockfd, data, rlen);
                if (ret < 0)
-                       return ret;
-       }
-
-       switch (rsp->result) {
-       case SD_RES_SUCCESS:
-               break;
-       case SD_RES_NO_OBJ:
-       case SD_RES_NO_VDI:
-               return -ENOENT;
-       default:
-               return -EIO;
+                       return SD_RES_SYSTEM_ERROR;
        }
 
-       return 0;
+       return rsp->result;
 }
 
 static void aio_end_request(struct sd_request *req, int ret)
@@ -173,7 +166,6 @@ static void end_sheep_request(struct sheep_request *req)
        free(req);
 }
 
-/* FIXME: handle submit failure */
 static int submit_sheep_request(struct sheep_request *req)
 {
        struct sd_req hdr = {};
@@ -282,9 +274,6 @@ static int sheep_aiocb_submit(struct sheep_aiocb *aiocb)
                }
 
                req = alloc_sheep_request(aiocb, oid, cow_oid, len, start);
-               if (IS_ERR(req))
-                       return PTR_ERR(req);
-
                if (vid && !cow_oid)
                        goto submit;
 
@@ -337,9 +326,6 @@ static int submit_request(struct sd_request *req)
 {
        struct sheep_aiocb *aiocb = sheep_aiocb_setup(req);
 
-       if (IS_ERR(aiocb))
-               return PTR_ERR(aiocb);
-
        return sheep_aiocb_submit(aiocb);
 }
 
@@ -429,7 +415,7 @@ static int sheep_handle_reply(struct sd_cluster *c)
        if (ret < 0) {
                req = fetch_first_inflight_request(c);
                if (req != NULL) {
-                       req->aiocb->ret = EIO;
+                       req->aiocb->ret = SD_RES_EIO;
                        goto end_request;
                }
                goto err;
@@ -441,7 +427,7 @@ static int sheep_handle_reply(struct sd_cluster *c)
        if (rsp.data_length > 0) {
                ret = xread(c->sockfd, req->buf, req->length);
                if (ret < 0) {
-                       req->aiocb->ret = EIO;
+                       req->aiocb->ret = SD_RES_EIO;
                        goto end_request;
                }
        }
@@ -513,12 +499,12 @@ static int init_cluster_handlers(struct sd_cluster *c)
 
        c->request_fd = eventfd(0, 0);
        if (c->request_fd < 0)
-               return -errno;
+               return -SD_RES_SYSTEM_ERROR;
 
        c->reply_fd = eventfd(0, 0);
        if (c->reply_fd < 0) {
                close(c->request_fd);
-               return -errno;
+               return -SD_RES_SYSTEM_ERROR;
        }
 
        ret = pthread_create(&thread, NULL, request_handler, c);
@@ -538,7 +524,7 @@ static int init_cluster_handlers(struct sd_cluster *c)
        }
        c->reply_thread = thread;
 
-       return 0;
+       return SD_RES_SUCCESS;
 }
 
 struct sd_cluster *sd_connect(char *host)
@@ -552,33 +538,39 @@ struct sd_cluster *sd_connect(char *host)
 
        ip = strtok(h, ":");
        if (!ip) {
-               errno = EINVAL;
+               errno = SD_RES_INVALID_PARMS;
                goto err;
        }
 
        pt = strtok(NULL, ":");
        if (!pt) {
-               errno = EINVAL;
+               errno = SD_RES_INVALID_PARMS;
                goto err;
        }
 
        if (sscanf(pt, "%u", &port) != 1) {
-               errno = EINVAL;
+               errno = SD_RES_INVALID_PARMS;
                goto err;
        }
 
        fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-       if (fd < 0)
+       if (fd < 0) {
+               errno = SD_RES_SYSTEM_ERROR;
                goto err;
+       }
 
        ret = setsockopt(fd, SOL_SOCKET, SO_LINGER, &linger_opt,
                         sizeof(linger_opt));
-       if (ret < 0)
+       if (ret < 0) {
+               errno = SD_RES_SYSTEM_ERROR;
                goto err_close;
+       }
 
        ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &value, sizeof(value));
-       if (ret < 0)
+       if (ret < 0) {
+               errno = SD_RES_SYSTEM_ERROR;
                goto err_close;
+       }
 
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
@@ -587,13 +579,15 @@ struct sd_cluster *sd_connect(char *host)
        case 1:
                break;
        default:
-               errno = EINVAL;
+               errno = SD_RES_INVALID_PARMS;
                goto err_close;
        }
 
        ret = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
-       if (ret < 0)
+       if (ret < 0) {
+               errno = SD_RES_SYSTEM_ERROR;
                goto err_close;
+       }
 
        c = xzalloc(sizeof(*c));
        c->sockfd = fd;
@@ -638,5 +632,6 @@ int sd_disconnect(struct sd_cluster *c)
        close(c->reply_fd);
        close(c->sockfd);
        free(c);
-       return 0;
+
+       return SD_RES_SUCCESS;
 }
diff --git a/lib/shared/vdi.c b/lib/shared/vdi.c
index 39b8acb..ce10e35 100644
--- a/lib/shared/vdi.c
+++ b/lib/shared/vdi.c
@@ -23,12 +23,12 @@ static int lock_vdi(struct sd_vdi *vdi)
        hdr.data_length = SD_MAX_VDI_LEN;
        hdr.flags = SD_FLAG_CMD_WRITE;
        ret = sd_run_sdreq(vdi->cluster, &hdr, vdi->name);
-       if (ret < 0)
+       if (ret != SD_RES_SUCCESS)
                return ret;
 
        vdi->vid = rsp->vdi.vdi_id;
 
-       return 0;
+       return SD_RES_SUCCESS;
 }
 
 static int unlock_vdi(struct sd_vdi *vdi)
@@ -40,9 +40,10 @@ static int unlock_vdi(struct sd_vdi *vdi)
        hdr.vdi.type = LOCK_TYPE_NORMAL;
        hdr.vdi.base_vdi_id = vdi->vid;
        ret = sd_run_sdreq(vdi->cluster, &hdr, NULL);
-       if (ret < 0)
+       if (ret != SD_RES_SUCCESS)
                return ret;
-       return 0;
+
+       return SD_RES_SUCCESS;
 }
 
 static struct sd_vdi *alloc_vdi(struct sd_cluster *c, char *name)
@@ -71,8 +72,8 @@ struct sd_vdi *sd_vdi_open(struct sd_cluster *c, char *name)
        int ret;
 
        ret = lock_vdi(new);
-       if (ret < 0) {
-               errno = -ret;
+       if (ret != SD_RES_SUCCESS) {
+               errno = ret;
                goto out_free;
        }
 
@@ -81,13 +82,13 @@ struct sd_vdi *sd_vdi_open(struct sd_cluster *c, char *name)
        hdr.obj.oid = vid_to_vdi_oid(new->vid);
        hdr.obj.offset = 0;
        ret = sd_run_sdreq(c, &hdr, new->inode);
-       if (ret < 0) {
-               errno = -ret;
+       if (ret != SD_RES_SUCCESS) {
+               errno = ret;
                goto out_unlock;
        }
 
        if (vdi_is_snapshot(new->inode)) {
-               errno = EINVAL;
+               errno = SD_RES_INVALID_PARMS;
                goto out_unlock;
        }
 
@@ -123,8 +124,10 @@ static struct sd_request *alloc_request(struct sd_vdi 
*vdi, void *buf,
        int fd;
 
        fd = eventfd(0, 0);
-       if (fd < 0)
-               return ERR_PTR(-errno);
+       if (fd < 0) {
+               errno = SD_RES_SYSTEM_ERROR;
+               return NULL;
+       }
        req = xzalloc(sizeof(*req));
        req->efd = fd;
        req->data = buf;
@@ -142,8 +145,8 @@ int sd_vdi_read(struct sd_vdi *vdi, void *buf, size_t 
count, off_t offset)
        struct sd_request *req = alloc_request(vdi, buf, count, offset, false);
        int ret;
 
-       if (IS_ERR(req))
-               return PTR_ERR(req);
+       if (!req)
+               return errno;
 
        queue_request(req);
 
@@ -159,8 +162,8 @@ int sd_vdi_write(struct sd_vdi *vdi, void *buf, size_t 
count, off_t offset)
        struct sd_request *req = alloc_request(vdi, buf, count, offset, true);
        int ret;
 
-       if (IS_ERR(req))
-               return PTR_ERR(req);
+       if (!req)
+               return errno;
 
        queue_request(req);
 
@@ -176,7 +179,7 @@ int sd_vdi_close(struct sd_vdi *vdi)
        int ret;
 
        ret = unlock_vdi(vdi);
-       if (ret < 0) {
+       if (ret != SD_RES_SUCCESS) {
                fprintf(stderr, "failed to unlock %s\n", vdi->name);
                return ret;
        }
-- 
1.9.1

-- 
sheepdog mailing list
[email protected]
https://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to