summaryrefslogtreecommitdiffstats
path: root/xlators/features/shard/src
diff options
context:
space:
mode:
authorKotresh HR <khiremat@redhat.com>2015-09-24 15:42:14 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2015-10-29 01:40:02 -0700
commit0ce29bbd6a1cc459d4f4ffc50a4658988ef52039 (patch)
treedf64343cddd9407cf85845f0056ba6abfc50826d /xlators/features/shard/src
parent86b6d13e42c2e0de92a2a2099644fbb75308dd12 (diff)
features/shard: Support geo-rep for sharded volume
Approach: Shard xlator on slave side is by passed for all the fops to geo-rep mount. So each shard on master is considered as a separate file for geo-rep and it syncs them separately on to slave. The extended attribute in which shard maintains the size is also synced from master and shard on slave doesn't calculate by itself. Pre-requisites: 1. If master is sharded volume, slave also should be sharded. 2. Slave's shard configurations should be same as master. 3. Geo-rep config of xattr sync should not be disabled. All other dependant patches: 1. http://review.gluster.org/#/c/12205/ 2. http://review.gluster.org/#/c/12206/ 3. http://review.gluster.org/#/c/12225/ 4. http://review.gluster.org/#/c/12226/ BUG: 1275972 Change-Id: Ieba70e75ebaebd70851454e1b85c0fe86022ad8d Reviewed-on: http://review.gluster.org/12228 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Krutika Dhananjay <kdhananj@redhat.com> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com> Signed-off-by: Kotresh HR <khiremat@redhat.com> Reviewed-on: http://review.gluster.org/12438 Tested-by: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'xlators/features/shard/src')
-rw-r--r--xlators/features/shard/src/shard.c104
1 files changed, 70 insertions, 34 deletions
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c
index f5ac76d974a..a99eaf92bc1 100644
--- a/xlators/features/shard/src/shard.c
+++ b/xlators/features/shard/src/shard.c
@@ -27,6 +27,17 @@ __is_shard_dir (uuid_t gfid)
return _gf_false;
}
+static gf_boolean_t
+__is_gsyncd_on_shard_dir (call_frame_t *frame, loc_t *loc)
+{
+ if (frame->root->pid == GF_CLIENT_PID_GSYNCD &&
+ (__is_shard_dir (loc->pargfid) ||
+ (loc->parent && __is_shard_dir(loc->parent->gfid))))
+ return _gf_true;
+
+ return _gf_false;
+}
+
void
shard_make_block_bname (int block_num, uuid_t gfid, char *buf, size_t len)
{
@@ -753,7 +764,8 @@ shard_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
* and store them in the stbuf appropriately.
*/
- if (dict_get (xdata, GF_XATTR_SHARD_FILE_SIZE))
+ if (dict_get (xdata, GF_XATTR_SHARD_FILE_SIZE) &&
+ frame->root->pid != GF_CLIENT_PID_GSYNCD)
shard_modify_size_and_block_count (buf, xdata);
unwind:
@@ -771,7 +783,9 @@ shard_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc,
uint64_t block_size = 0;
shard_local_t *local = NULL;
- SHARD_ENTRY_FOP_CHECK (loc, op_errno, err);
+ if (frame->root->pid != GF_CLIENT_PID_GSYNCD) {
+ SHARD_ENTRY_FOP_CHECK (loc, op_errno, err);
+ }
local = mem_get0 (this->local_pool);
if (!local)
@@ -797,15 +811,18 @@ shard_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc,
}
}
- ret = dict_set_uint64 (local->xattr_req, GF_XATTR_SHARD_FILE_SIZE,
- 8 * 4);
- if (ret) {
- gf_msg (this->name, GF_LOG_WARNING, 0,
- SHARD_MSG_DICT_SET_FAILED, "Failed to set dict value: "
- "key:%s for path %s.", GF_XATTR_SHARD_FILE_SIZE,
- loc->path);
- goto err;
+ if (frame->root->pid != GF_CLIENT_PID_GSYNCD) {
+ ret = dict_set_uint64 (local->xattr_req,
+ GF_XATTR_SHARD_FILE_SIZE, 8 * 4);
+ if (ret) {
+ gf_msg (this->name, GF_LOG_WARNING, 0,
+ SHARD_MSG_DICT_SET_FAILED,
+ "Failed to set dict value: key:%s for path %s.",
+ GF_XATTR_SHARD_FILE_SIZE, loc->path);
+ goto err;
+ }
}
+
if ((xattr_req) && (dict_get (xattr_req, GF_CONTENT_KEY)))
dict_del (xattr_req, GF_CONTENT_KEY);
@@ -1005,7 +1022,7 @@ shard_stat (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
goto err;
}
- if (!block_size) {
+ if (!block_size || frame->root->pid == GF_CLIENT_PID_GSYNCD) {
STACK_WIND (frame, default_stat_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->stat, loc, xdata);
return 0;
@@ -1059,7 +1076,7 @@ shard_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)
goto err;
}
- if (!block_size) {
+ if (!block_size || frame->root->pid == GF_CLIENT_PID_GSYNCD) {
STACK_WIND (frame, default_fstat_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->fstat, fd, xdata);
return 0;
@@ -1769,7 +1786,7 @@ shard_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,
goto err;
}
- if (!block_size) {
+ if (!block_size || frame->root->pid == GF_CLIENT_PID_GSYNCD) {
STACK_WIND (frame, default_truncate_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->truncate, loc, offset,
xdata);
@@ -1819,7 +1836,7 @@ shard_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,
goto err;
}
- if (!block_size) {
+ if (!block_size || frame->root->pid == GF_CLIENT_PID_GSYNCD) {
STACK_WIND (frame, default_ftruncate_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->ftruncate, fd, offset,
xdata);
@@ -1893,8 +1910,9 @@ shard_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,
goto err;
frame->local = local;
-
- SHARD_INODE_CREATE_INIT (this, local, xdata, loc, err);
+ if (!__is_gsyncd_on_shard_dir (frame, loc)) {
+ SHARD_INODE_CREATE_INIT (this, local, xdata, loc, err);
+ }
STACK_WIND (frame, shard_mknod_cbk, FIRST_CHILD (this),
FIRST_CHILD(this)->fops->mknod, loc, mode, rdev, umask,
@@ -2331,7 +2349,7 @@ shard_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,
goto err;
}
- if (!block_size) {
+ if (!block_size || frame->root->pid == GF_CLIENT_PID_GSYNCD) {
STACK_WIND (frame, default_unlink_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->unlink, loc, xflag, xdata);
return 0;
@@ -2554,7 +2572,8 @@ shard_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,
* a. the src file is not sharded and dst doesn't exist, OR
* b. the src and dst both exist but are not sharded.
*/
- if ((!block_size) && (!dst_block_size)) {
+ if (((!block_size) && (!dst_block_size)) ||
+ frame->root->pid == GF_CLIENT_PID_GSYNCD) {
STACK_WIND (frame, default_rename_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->rename, oldloc, newloc,
xdata);
@@ -2641,7 +2660,9 @@ shard_create (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,
frame->local = local;
- SHARD_INODE_CREATE_INIT (this, local, xdata, loc, err);
+ if (!__is_gsyncd_on_shard_dir (frame, loc)) {
+ SHARD_INODE_CREATE_INIT (this, local, xdata, loc, err);
+ }
STACK_WIND (frame, shard_create_cbk, FIRST_CHILD (this),
FIRST_CHILD(this)->fops->create, loc, flags, mode, umask,
@@ -3201,7 +3222,7 @@ shard_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
goto err;
}
- if (!block_size) {
+ if (!block_size || frame->root->pid == GF_CLIENT_PID_GSYNCD) {
/* block_size = 0 means that the file was created before
* sharding was enabled on the volume.
*/
@@ -3646,7 +3667,7 @@ shard_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,
goto out;
}
- if (!block_size) {
+ if (!block_size || frame->root->pid == GF_CLIENT_PID_GSYNCD) {
/* block_size = 0 means that the file was created before
* sharding was enabled on the volume.
*/
@@ -3830,7 +3851,8 @@ shard_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (IA_ISDIR (entry->d_stat.ia_type))
continue;
- if (dict_get (entry->dict, GF_XATTR_SHARD_FILE_SIZE))
+ if (dict_get (entry->dict, GF_XATTR_SHARD_FILE_SIZE) &&
+ frame->root->pid != GF_CLIENT_PID_GSYNCD)
shard_modify_size_and_block_count (&entry->d_stat,
entry->dict);
@@ -3951,9 +3973,12 @@ shard_removexattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
{
int op_errno = EINVAL;
- GF_IF_NATIVE_XATTR_GOTO (SHARD_XATTR_PREFIX"*", name, op_errno, out);
+ if (frame->root->pid != GF_CLIENT_PID_GSYNCD) {
+ GF_IF_NATIVE_XATTR_GOTO (SHARD_XATTR_PREFIX"*",
+ name, op_errno, out);
+ }
- if (xdata) {
+ if (xdata && (frame->root->pid != GF_CLIENT_PID_GSYNCD)) {
dict_del (xdata, GF_XATTR_SHARD_BLOCK_SIZE);
dict_del (xdata, GF_XATTR_SHARD_FILE_SIZE);
}
@@ -3974,9 +3999,12 @@ shard_fremovexattr (call_frame_t *frame, xlator_t *this, fd_t *fd,
{
int op_errno = EINVAL;
- GF_IF_NATIVE_XATTR_GOTO (SHARD_XATTR_PREFIX"*", name, op_errno, out);
+ if (frame->root->pid != GF_CLIENT_PID_GSYNCD) {
+ GF_IF_NATIVE_XATTR_GOTO (SHARD_XATTR_PREFIX"*",
+ name, op_errno, out);
+ }
- if (xdata) {
+ if (xdata && (frame->root->pid != GF_CLIENT_PID_GSYNCD)) {
dict_del (xdata, GF_XATTR_SHARD_BLOCK_SIZE);
dict_del (xdata, GF_XATTR_SHARD_FILE_SIZE);
}
@@ -3999,7 +4027,7 @@ shard_fgetxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (op_ret < 0)
goto unwind;
- if (dict) {
+ if (dict && (frame->root->pid != GF_CLIENT_PID_GSYNCD)) {
dict_del (dict, GF_XATTR_SHARD_BLOCK_SIZE);
dict_del (dict, GF_XATTR_SHARD_FILE_SIZE);
}
@@ -4015,7 +4043,8 @@ shard_fgetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd,
{
int op_errno = EINVAL;
- if ((name) && (!strncmp (name, SHARD_XATTR_PREFIX,
+ if ((frame->root->pid != GF_CLIENT_PID_GSYNCD) &&
+ (name) && (!strncmp (name, SHARD_XATTR_PREFIX,
strlen (SHARD_XATTR_PREFIX)))) {
op_errno = ENODATA;
goto out;
@@ -4039,7 +4068,7 @@ shard_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (op_ret < 0)
goto unwind;
- if (dict) {
+ if (dict && (frame->root->pid != GF_CLIENT_PID_GSYNCD)) {
dict_del (dict, GF_XATTR_SHARD_BLOCK_SIZE);
dict_del (dict, GF_XATTR_SHARD_FILE_SIZE);
}
@@ -4055,7 +4084,8 @@ shard_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
{
int op_errno = EINVAL;
- if ((name) && (!strncmp (name, SHARD_XATTR_PREFIX,
+ if ((frame->root->pid != GF_CLIENT_PID_GSYNCD) &&
+ (name) && (!strncmp (name, SHARD_XATTR_PREFIX,
strlen (SHARD_XATTR_PREFIX)))) {
op_errno = ENODATA;
goto out;
@@ -4076,7 +4106,10 @@ shard_fsetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,
{
int op_errno = EINVAL;
- GF_IF_INTERNAL_XATTR_GOTO (SHARD_XATTR_PREFIX"*", dict, op_errno, out);
+ if (frame->root->pid != GF_CLIENT_PID_GSYNCD) {
+ GF_IF_INTERNAL_XATTR_GOTO (SHARD_XATTR_PREFIX"*", dict,
+ op_errno, out);
+ }
STACK_WIND_TAIL (frame, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->fsetxattr, fd, dict, flags,
@@ -4094,7 +4127,10 @@ shard_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,
{
int op_errno = EINVAL;
- GF_IF_INTERNAL_XATTR_GOTO (SHARD_XATTR_PREFIX"*", dict, op_errno, out);
+ if (frame->root->pid != GF_CLIENT_PID_GSYNCD) {
+ GF_IF_INTERNAL_XATTR_GOTO (SHARD_XATTR_PREFIX"*", dict,
+ op_errno, out);
+ }
STACK_WIND_TAIL (frame, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->setxattr, loc, dict, flags,
@@ -4191,7 +4227,7 @@ shard_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
goto err;
}
- if (!block_size) {
+ if (!block_size || frame->root->pid == GF_CLIENT_PID_GSYNCD) {
STACK_WIND (frame, default_setattr_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->setattr, loc, stbuf,
valid, xdata);
@@ -4250,7 +4286,7 @@ shard_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd,
goto err;
}
- if (!block_size) {
+ if (!block_size || frame->root->pid == GF_CLIENT_PID_GSYNCD) {
STACK_WIND (frame, default_fsetattr_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->fsetattr, fd, stbuf,
valid, xdata);