summaryrefslogtreecommitdiffstats
path: root/xlators/features/shard
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/features/shard')
-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);