diff options
| -rw-r--r-- | tests/basic/ec/nfs.t | 18 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-helpers.c | 14 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-inode-read.c | 71 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-inode-write.c | 55 | 
4 files changed, 69 insertions, 89 deletions
diff --git a/tests/basic/ec/nfs.t b/tests/basic/ec/nfs.t new file mode 100644 index 00000000000..53ec30c92b0 --- /dev/null +++ b/tests/basic/ec/nfs.t @@ -0,0 +1,18 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../nfs.rc + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 redundancy 2 $H0:$B0/${V0}{0..5} +TEST $CLI volume start $V0 + +EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; +TEST mount_nfs $H0:/$V0 $N0 + +TEST dd if=/dev/zero of=$N0/test bs=1024k count=1k + +cleanup diff --git a/xlators/cluster/ec/src/ec-helpers.c b/xlators/cluster/ec/src/ec-helpers.c index cd0ac41ebe7..6eb836a1c62 100644 --- a/xlators/cluster/ec/src/ec-helpers.c +++ b/xlators/cluster/ec/src/ec-helpers.c @@ -531,6 +531,11 @@ ec_fd_t * __ec_fd_get(fd_t * fd, xlator_t * xl)      ec_fd_t * ctx = NULL;      uint64_t value = 0; +    if (fd->anonymous) +    { +        return NULL; +    } +      if ((__fd_ctx_get(fd, xl, &value) != 0) || (value == 0))      {          ctx = GF_MALLOC(sizeof(*ctx), ec_mt_ec_fd_t); @@ -559,11 +564,14 @@ ec_fd_t * ec_fd_get(fd_t * fd, xlator_t * xl)  {      ec_fd_t * ctx = NULL; -    LOCK(&fd->lock); +    if (!fd->anonymous) +    { +        LOCK(&fd->lock); -    ctx = __ec_fd_get(fd, xl); +        ctx = __ec_fd_get(fd, xl); -    UNLOCK(&fd->lock); +        UNLOCK(&fd->lock); +    }      return ctx;  } diff --git a/xlators/cluster/ec/src/ec-inode-read.c b/xlators/cluster/ec/src/ec-inode-read.c index 46f904cf321..484c5e40189 100644 --- a/xlators/cluster/ec/src/ec-inode-read.c +++ b/xlators/cluster/ec/src/ec-inode-read.c @@ -973,11 +973,10 @@ out:  int32_t ec_readv_rebuild(ec_t * ec, ec_fop_data_t * fop, ec_cbk_data_t * cbk)  {      ec_cbk_data_t * ans = NULL; -    struct iobuf_pool * pool = NULL;      struct iobref * iobref = NULL;      struct iobuf * iobuf = NULL;      uint8_t * ptr = NULL, * buff = NULL; -    size_t fsize = 0, size = 0, max = 0, slice = 0; +    size_t fsize = 0, size = 0, max = 0;      int32_t i = 0;      if (cbk->op_ret < 0) @@ -989,7 +988,7 @@ int32_t ec_readv_rebuild(ec_t * ec, ec_fop_data_t * fop, ec_cbk_data_t * cbk)      if (cbk->op_ret > 0)      { -        struct iovec vector[cbk->int32 * cbk->count]; +        struct iovec vector[1];          uint8_t * blocks[cbk->count];          uint32_t values[cbk->count]; @@ -1001,50 +1000,33 @@ int32_t ec_readv_rebuild(ec_t * ec, ec_fop_data_t * fop, ec_cbk_data_t * cbk)              goto out;          }          buff = GF_ALIGN_BUF(ptr, EC_BUFFER_ALIGN_SIZE); +        for (i = 0, ans = cbk; ans != NULL; i++, ans = ans->next) +        { +            values[i] = ans->idx; +            blocks[i] = buff; +            buff += ec_iov_copy_to(buff, ans->vector, ans->int32, 0, fsize); +        }          iobref = iobref_new();          if (iobref == NULL)          {              goto out;          } - -        for (i = 0, ans = cbk; ans != NULL; i++, ans = ans->next) +        iobuf = iobuf_get2(fop->xl->ctx->iobuf_pool, size); +        if (iobuf == NULL)          { -            values[i] = ans->idx; -            blocks[i] = buff; -            buff += ec_iov_copy_to(buff, ans->vector, ans->int32, 0, fsize); +            goto out;          } - -        pool = fop->xl->ctx->iobuf_pool; -        max = iobpool_default_pagesize(pool) / ec->stripe_size; -        max *= ec->fragment_size; -        i = 0; -        do +        if (iobref_add(iobref, iobuf) != 0)          { -            iobuf = iobuf_get(pool); -            if (iobuf == NULL) -            { -                goto out; -            } -            if (iobref_add(iobref, iobuf) != 0) -            { -                goto out; -            } - -            slice = fsize; -            if (slice > max) -            { -                slice = max; -            } -            fsize -= slice; +            goto out; +        } -            vector[i].iov_base = iobuf->ptr; -            vector[i].iov_len = ec_method_decode(slice, ec->fragments, values, -                                                 blocks, iobuf->ptr); -            i++; +        vector[0].iov_base = iobuf->ptr; +        vector[0].iov_len = ec_method_decode(fsize, ec->fragments, values, +                                             blocks, iobuf->ptr); -            iobuf_unref(iobuf); -        } while (fsize > 0); +        iobuf_unref(iobuf);          GF_FREE(ptr);          ptr = NULL; @@ -1063,27 +1045,20 @@ int32_t ec_readv_rebuild(ec_t * ec, ec_fop_data_t * fop, ec_cbk_data_t * cbk)              max = fop->user_size;          }          size -= fop->head; -        while (size > max) +        if (size > max)          { -            if (size - max >= vector[i - 1].iov_len) -            { -                size -= vector[--i].iov_len; -            } -            else -            { -                vector[i - 1].iov_len -= size - max; -                size = max; -            } +            vector[0].iov_len -= size - max; +            size = max;          }          cbk->op_ret = size; -        cbk->int32 = i; +        cbk->int32 = 1;          iobref_unref(cbk->buffers);          cbk->buffers = iobref;          GF_FREE(cbk->vector); -        cbk->vector = iov_dup(vector, i); +        cbk->vector = iov_dup(vector, 1);          if (cbk->vector == NULL)          {              cbk->op_ret = -1; diff --git a/xlators/cluster/ec/src/ec-inode-write.c b/xlators/cluster/ec/src/ec-inode-write.c index c0694531151..06a2fef8d17 100644 --- a/xlators/cluster/ec/src/ec-inode-write.c +++ b/xlators/cluster/ec/src/ec-inode-write.c @@ -1932,18 +1932,10 @@ void ec_wind_writev(ec_t * ec, ec_fop_data_t * fop, int32_t idx)  {      ec_trace("WIND", fop, "idx=%d", idx); -    struct iovec vector[fop->int32]; -    struct iobuf_pool * pool = NULL; +    struct iovec vector[1];      struct iobref * iobref = NULL;      struct iobuf * iobuf = NULL; -    uint8_t * ptr = NULL; -    ssize_t size = 0, slice = 0, pagesize = 0, maxsize = 0; -    int32_t count = 0; - -    pool = fop->xl->ctx->iobuf_pool; - -    pagesize = iobpool_default_pagesize(pool); -    maxsize = pagesize * ec->fragments; +    ssize_t size = 0, bufsize = 0;      iobref = iobref_new();      if (iobref == NULL) @@ -1951,43 +1943,30 @@ void ec_wind_writev(ec_t * ec, ec_fop_data_t * fop, int32_t idx)          goto out;      } -    ptr = fop->vector[0].iov_base;      size = fop->vector[0].iov_len; +    bufsize = size / ec->fragments; -    count = 0; -    while (size > 0) +    iobuf = iobuf_get2(fop->xl->ctx->iobuf_pool, bufsize); +    if (iobuf == NULL)      { -        iobuf = iobuf_get(pool); -        if (iobuf == NULL) -        { -            goto out; -        } -        if (iobref_add(iobref, iobuf) != 0) -        { -            goto out; -        } - -        slice = size; -        if (slice > maxsize) -        { -            slice = maxsize; -        } - -        ec_method_encode(slice, ec->fragments, idx, ptr, iobuf->ptr); -        ptr += slice; +        goto out; +    } +    if (iobref_add(iobref, iobuf) != 0) +    { +        goto out; +    } -        vector[count].iov_base = iobuf->ptr; -        vector[count].iov_len = slice / ec->fragments; -        count++; +    ec_method_encode(size, ec->fragments, idx, fop->vector[0].iov_base, +                     iobuf->ptr); -        iobuf_unref(iobuf); +    vector[0].iov_base = iobuf->ptr; +    vector[0].iov_len = bufsize; -        size -= slice; -    } +    iobuf_unref(iobuf);      STACK_WIND_COOKIE(fop->frame, ec_writev_cbk, (void *)(uintptr_t)idx,                        ec->xl_list[idx], ec->xl_list[idx]->fops->writev, -                      fop->fd, vector, count, fop->offset / ec->fragments, +                      fop->fd, vector, 1, fop->offset / ec->fragments,                        fop->uint32, iobref, fop->xdata);      iobref_unref(iobref);  | 
