summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/features/shard/src/shard.c154
-rw-r--r--xlators/features/shard/src/shard.h1
2 files changed, 96 insertions, 59 deletions
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c
index 33c501f8498..4dd581dd19e 100644
--- a/xlators/features/shard/src/shard.c
+++ b/xlators/features/shard/src/shard.c
@@ -1693,11 +1693,30 @@ shard_common_lookup_shards_cbk (call_frame_t *frame, void *cookie,
if (op_ret < 0) {
/* Ignore absence of shards in the backend in truncate fop. */
- if (((local->fop == GF_FOP_TRUNCATE) ||
- (local->fop == GF_FOP_FTRUNCATE) ||
- (local->fop == GF_FOP_RENAME) ||
- (local->fop == GF_FOP_UNLINK)) && (op_errno == ENOENT))
- goto done;
+ switch (local->fop) {
+ case GF_FOP_TRUNCATE:
+ case GF_FOP_FTRUNCATE:
+ case GF_FOP_RENAME:
+ case GF_FOP_UNLINK:
+ if (op_errno == ENOENT)
+ goto done;
+ break;
+ case GF_FOP_WRITE:
+ case GF_FOP_READ:
+ case GF_FOP_ZEROFILL:
+ case GF_FOP_DISCARD:
+ case GF_FOP_FALLOCATE:
+ if ((!local->first_lookup_done) &&
+ (op_errno == ENOENT)) {
+ local->create_count++;
+ goto done;
+ }
+ break;
+ default:
+ break;
+ }
+
+ /* else */
gf_msg (this->name, GF_LOG_ERROR, op_errno,
SHARD_MSG_LOOKUP_SHARD_FAILED, "Lookup on shard %d "
"failed. Base file gfid = %s", shard_block_num,
@@ -1714,6 +1733,8 @@ shard_common_lookup_shards_cbk (call_frame_t *frame, void *cookie,
done:
call_count = shard_call_count_return (frame);
if (call_count == 0) {
+ if (!local->first_lookup_done)
+ local->first_lookup_done = _gf_true;
if (local->op_ret < 0)
goto unwind;
else
@@ -3197,47 +3218,6 @@ next:
}
int
-shard_post_lookup_shards_readv_handler (call_frame_t *frame, xlator_t *this)
-{
- shard_local_t *local = NULL;
-
- local = frame->local;
-
- if (local->op_ret < 0) {
- SHARD_STACK_UNWIND (readv, frame, local->op_ret,
- local->op_errno, NULL, 0, NULL, NULL, NULL);
- return 0;
- }
-
- shard_readv_do (frame, this);
-
- return 0;
-}
-
-int
-shard_post_mknod_readv_handler (call_frame_t *frame, xlator_t *this)
-{
- shard_local_t *local = NULL;
-
- local = frame->local;
-
- if (local->op_ret < 0) {
- SHARD_STACK_UNWIND (readv, frame, local->op_ret,
- local->op_errno, NULL, 0, NULL, NULL, NULL);
- return 0;
- }
-
- if (!local->eexist_count) {
- shard_readv_do (frame, this);
- } else {
- local->call_count = local->eexist_count;
- shard_common_lookup_shards (frame, this, local->loc.inode,
- shard_post_lookup_shards_readv_handler);
- }
- return 0;
-}
-
-int
shard_common_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, inode_t *inode,
struct iatt *buf, struct iatt *preparent,
@@ -3267,6 +3247,7 @@ done:
call_count = shard_call_count_return (frame);
if (call_count == 0) {
SHARD_UNSET_ROOT_FS_ID (frame, local);
+ local->create_count = 0;
local->post_mknod_handler (frame, this);
}
@@ -3397,6 +3378,55 @@ err:
}
int
+shard_post_mknod_readv_handler (call_frame_t *frame, xlator_t *this);
+
+int
+shard_post_lookup_shards_readv_handler (call_frame_t *frame, xlator_t *this)
+{
+ shard_local_t *local = NULL;
+
+ local = frame->local;
+
+ if (local->op_ret < 0) {
+ SHARD_STACK_UNWIND (readv, frame, local->op_ret,
+ local->op_errno, NULL, 0, NULL, NULL, NULL);
+ return 0;
+ }
+
+ if (local->create_count) {
+ shard_common_resume_mknod (frame, this,
+ shard_post_mknod_readv_handler);
+ } else {
+ shard_readv_do (frame, this);
+ }
+
+ return 0;
+}
+
+int
+shard_post_mknod_readv_handler (call_frame_t *frame, xlator_t *this)
+{
+ shard_local_t *local = NULL;
+
+ local = frame->local;
+
+ if (local->op_ret < 0) {
+ SHARD_STACK_UNWIND (readv, frame, local->op_ret,
+ local->op_errno, NULL, 0, NULL, NULL, NULL);
+ return 0;
+ }
+
+ if (!local->eexist_count) {
+ shard_readv_do (frame, this);
+ } else {
+ local->call_count = local->eexist_count;
+ shard_common_lookup_shards (frame, this, local->loc.inode,
+ shard_post_lookup_shards_readv_handler);
+ }
+ return 0;
+}
+
+int
shard_post_resolve_readv_handler (call_frame_t *frame, xlator_t *this)
{
shard_local_t *local = NULL;
@@ -3422,9 +3452,9 @@ shard_post_resolve_readv_handler (call_frame_t *frame, xlator_t *this)
}
if (local->call_count) {
- local->create_count = local->call_count;
- shard_common_resume_mknod (frame, this,
- shard_post_mknod_readv_handler);
+ shard_common_lookup_shards (frame, this,
+ local->resolver_base_inode,
+ shard_post_lookup_shards_readv_handler);
} else {
shard_readv_do (frame, this);
}
@@ -3576,14 +3606,11 @@ shard_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
shard_lookup_base_file (frame, this, &local->loc,
shard_post_lookup_readv_handler);
-
return 0;
-
err:
SHARD_STACK_UNWIND (readv, frame, -1, ENOMEM, NULL, 0, NULL, NULL,
NULL);
return 0;
-
}
int
@@ -3876,6 +3903,10 @@ next:
}
int
+shard_common_inode_write_post_mknod_handler (call_frame_t *frame,
+ xlator_t *this);
+
+int
shard_common_inode_write_post_lookup_shards_handler (call_frame_t *frame,
xlator_t *this)
{
@@ -3890,7 +3921,12 @@ shard_common_inode_write_post_lookup_shards_handler (call_frame_t *frame,
return 0;
}
- shard_common_inode_write_do (frame, this);
+ if (local->create_count) {
+ shard_common_resume_mknod (frame, this,
+ shard_common_inode_write_post_mknod_handler);
+ } else {
+ shard_common_inode_write_do (frame, this);
+ }
return 0;
}
@@ -3938,11 +3974,13 @@ shard_common_inode_write_post_lookup_handler (call_frame_t *frame,
local->postbuf = local->prebuf;
- if (local->create_count)
- shard_common_resume_mknod (frame, this,
- shard_common_inode_write_post_mknod_handler);
- else
+ if (local->call_count) {
+ shard_common_lookup_shards (frame, this,
+ local->resolver_base_inode,
+ shard_common_inode_write_post_lookup_shards_handler);
+ } else {
shard_common_inode_write_do (frame, this);
+ }
return 0;
}
@@ -3962,8 +4000,6 @@ shard_common_inode_write_post_resolve_handler (call_frame_t *frame,
return 0;
}
- local->create_count = local->call_count;
-
shard_lookup_base_file (frame, this, &local->loc,
shard_common_inode_write_post_lookup_handler);
return 0;
diff --git a/xlators/features/shard/src/shard.h b/xlators/features/shard/src/shard.h
index 09232a45f24..73195983aa4 100644
--- a/xlators/features/shard/src/shard.h
+++ b/xlators/features/shard/src/shard.h
@@ -255,6 +255,7 @@ typedef struct shard_local {
shard_lock_t *shard_lock;
} lock;
inode_t *resolver_base_inode;
+ gf_boolean_t first_lookup_done;
} shard_local_t;
typedef struct shard_inode_ctx {