summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPranith Kumar K <pkarampu@redhat.com>2017-07-06 16:40:07 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2017-07-13 08:10:11 +0000
commitf367671d451ae0fc3e178d26cae1880d59eb6ebd (patch)
treee50d5b7b2bbf654e41933c347012b7651101ecab
parent73b2b7fe57069eb85485465fb92c52a97d4d411c (diff)
cluster/ec: Get size of file in EC [f]xattrop
Problem: For allowing parallel writes we shouldn't depend on ia_size to be same for all the bricks in each write_cbk(). But we need to make sure backend size is correct on all the bricks and no crashes/manual modifications happened. Fix: At the time of get_size_version() we do 1 check to make sure size of the file is same across the bricks. From then on the FOPs will give the status of the fop, so we rely on this information to keep which bricks are good/bad. Updates #251 Change-Id: I1df645347e2e9f2e09cfa4411b6cc305d7f4e4e5 Signed-off-by: Pranith Kumar K <pkarampu@redhat.com> Reviewed-on: https://review.gluster.org/17741 Smoke: Gluster Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Xavier Hernandez <xhernandez@datalab.es>
-rw-r--r--libglusterfs/src/glusterfs.h1
-rw-r--r--xlators/cluster/ec/src/ec-combine.c2
-rw-r--r--xlators/cluster/ec/src/ec-common.c19
-rw-r--r--xlators/storage/posix/src/posix-helpers.c5
4 files changed, 23 insertions, 4 deletions
diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h
index 07c1e944232..2d9ab0eba14 100644
--- a/libglusterfs/src/glusterfs.h
+++ b/libglusterfs/src/glusterfs.h
@@ -271,6 +271,7 @@
#define DHT_SKIP_OPEN_FD_UNLINK "dont-unlink-for-open-fd"
#define DHT_IATT_IN_XDATA_KEY "dht-get-iatt-in-xattr"
#define GET_LINK_COUNT "get-link-count"
+#define GF_GET_SIZE "get-size"
/*CTR and Marker requires inode dentry link count from posix*/
#define GF_RESPONSE_LINK_COUNT_XDATA "gf_response_link_count"
diff --git a/xlators/cluster/ec/src/ec-combine.c b/xlators/cluster/ec/src/ec-combine.c
index 4d0cc076680..01a865628f9 100644
--- a/xlators/cluster/ec/src/ec-combine.c
+++ b/xlators/cluster/ec/src/ec-combine.c
@@ -163,8 +163,6 @@ int32_t ec_iatt_combine(ec_fop_data_t *fop, struct iatt *dst, struct iatt *src,
* inode is not locked. */
if (!failed && ((dst[i].ia_uid != src[i].ia_uid) ||
(dst[i].ia_gid != src[i].ia_gid) ||
- ((dst[i].ia_type == IA_IFREG) &&
- (dst[i].ia_size != src[i].ia_size)) ||
(st_mode_from_ia(dst[i].ia_prot, dst[i].ia_type) !=
st_mode_from_ia(src[i].ia_prot, src[i].ia_type)))) {
if (ec_iatt_is_trusted(fop, dst)) {
diff --git a/xlators/cluster/ec/src/ec-common.c b/xlators/cluster/ec/src/ec-common.c
index 284c2cd5a62..14aefff0ae3 100644
--- a/xlators/cluster/ec/src/ec-common.c
+++ b/xlators/cluster/ec/src/ec-common.c
@@ -1121,6 +1121,7 @@ void ec_get_size_version(ec_lock_link_t *link)
ec_inode_t *ctx;
ec_fop_data_t *fop;
dict_t *dict = NULL;
+ dict_t *xdata = NULL;
ec_t *ec = NULL;
int32_t error = 0;
gf_boolean_t getting_xattr;
@@ -1177,6 +1178,16 @@ void ec_get_size_version(ec_lock_link_t *link)
error = -ENOMEM;
goto out;
}
+
+ if (lock->loc.inode->ia_type == IA_IFREG ||
+ lock->loc.inode->ia_type == IA_INVAL) {
+ xdata = dict_new();
+ if (xdata == NULL || dict_set_int32 (xdata, GF_GET_SIZE, 1)) {
+ error = -ENOMEM;
+ goto out;
+ }
+ }
+
if (lock->query && !ctx->have_info) {
fop->flags |= EC_FLAG_QUERY_METADATA;
/* Once we know that an xattrop will be needed,
@@ -1234,11 +1245,11 @@ void ec_get_size_version(ec_lock_link_t *link)
ec_xattrop (fop->frame, fop->xl, fop->mask, fop->minimum,
ec_prepare_update_cbk, link, &loc,
- GF_XATTROP_ADD_ARRAY64, dict, NULL);
+ GF_XATTROP_ADD_ARRAY64, dict, xdata);
} else {
ec_fxattrop(fop->frame, fop->xl, fop->mask, fop->minimum,
ec_prepare_update_cbk, link, lock->fd,
- GF_XATTROP_ADD_ARRAY64, dict, NULL);
+ GF_XATTROP_ADD_ARRAY64, dict, xdata);
}
error = 0;
@@ -1253,6 +1264,10 @@ out:
dict_unref(dict);
}
+ if (xdata != NULL) {
+ dict_unref(xdata);
+ }
+
if (error != 0) {
ec_fop_set_error(fop, -error);
}
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
index 649107d8cac..8c1a789f70b 100644
--- a/xlators/storage/posix/src/posix-helpers.c
+++ b/xlators/storage/posix/src/posix-helpers.c
@@ -515,6 +515,11 @@ _posix_xattr_get_set (dict_t *xattr_req, char *key, data_t *data,
} else if (strcmp(key, GF_REQUEST_LINK_COUNT_XDATA) == 0) {
ret = dict_set (filler->xattr,
GF_REQUEST_LINK_COUNT_XDATA, data);
+ } else if (strcmp (key, GF_GET_SIZE) == 0) {
+ if (filler->stbuf && IA_ISREG (filler->stbuf->ia_type)) {
+ ret = dict_set_uint64 (filler->xattr, GF_GET_SIZE,
+ filler->stbuf->ia_size);
+ }
} else {
ret = _posix_xattr_get_set_from_backend (filler, key);
}