diff options
-rw-r--r-- | xlators/performance/readdir-ahead/src/readdir-ahead.c | 97 | ||||
-rw-r--r-- | xlators/performance/readdir-ahead/src/readdir-ahead.h | 2 |
2 files changed, 93 insertions, 6 deletions
diff --git a/xlators/performance/readdir-ahead/src/readdir-ahead.c b/xlators/performance/readdir-ahead/src/readdir-ahead.c index dee977c6e21..2d2c807ccd6 100644 --- a/xlators/performance/readdir-ahead/src/readdir-ahead.c +++ b/xlators/performance/readdir-ahead/src/readdir-ahead.c @@ -145,7 +145,8 @@ __rda_inode_ctx_update_iatts(inode_t *inode, xlator_t *this, goto out; } } else { - if (generation != GF_ATOMIC_GET(ctx_p->generation)) + if ((generation != -1) && + (generation != GF_ATOMIC_GET(ctx_p->generation))) goto out; } @@ -201,6 +202,60 @@ rda_reset_ctx(xlator_t *this, struct rda_fd_ctx *ctx) } } +static void +rda_mark_inode_dirty(xlator_t *this, inode_t *inode) +{ + inode_t *parent = NULL; + fd_t *fd = NULL; + uint64_t val = 0; + int32_t ret = 0; + struct rda_fd_ctx *fd_ctx = NULL; + char gfid[GF_UUID_BUF_SIZE] = {0}; + + parent = inode_parent(inode, NULL, NULL); + if (parent) { + LOCK(&parent->lock); + { + list_for_each_entry(fd, &parent->fd_list, inode_list) + { + val = 0; + fd_ctx_get(fd, this, &val); + if (val == 0) + continue; + + fd_ctx = (void *)val; + uuid_utoa_r(inode->gfid, gfid); + if (!GF_ATOMIC_GET(fd_ctx->prefetching)) + continue; + + LOCK(&fd_ctx->lock); + { + if (GF_ATOMIC_GET(fd_ctx->prefetching)) { + if (fd_ctx->writes_during_prefetch == NULL) + fd_ctx->writes_during_prefetch = dict_new(); + + ret = dict_set_int8(fd_ctx->writes_during_prefetch, + gfid, 1); + if (ret < 0) { + gf_log(this->name, GF_LOG_WARNING, + "marking to invalidate stats of %s from an " + "in progress " + "prefetching has failed, might result in " + "stale stat to " + "application", + gfid); + } + } + } + UNLOCK(&fd_ctx->lock); + } + } + UNLOCK(&parent->lock); + } + + return; +} + /* * Check whether we can handle a request. Offset verification is done by the * caller, so we only check whether the preload buffer has completion status @@ -433,6 +488,10 @@ rda_fill_fd_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int ret = 0; gf_boolean_t serve = _gf_false; call_stub_t *stub = NULL; + char gfid[GF_UUID_BUF_SIZE] = { + 0, + }; + uint64_t generation = 0; INIT_LIST_HEAD(&serve_entries.list); LOCK(&ctx->lock); @@ -460,8 +519,16 @@ rda_fill_fd_cbk(call_frame_t *frame, void *cookie, xlator_t *this, * request was initiated. So, we pass 0 for * generation number */ + generation = -1; + if (ctx->writes_during_prefetch) { + memset(gfid, 0, sizeof(gfid)); + uuid_utoa_r(dirent->inode->gfid, gfid); + if (dict_get(ctx->writes_during_prefetch, gfid)) + generation = 0; + } + rda_inode_ctx_update_iatts(dirent->inode, this, &dirent->d_stat, - &dirent->d_stat, 0); + &dirent->d_stat, generation); } dirent_size = gf_dirent_size(dirent->d_name); @@ -474,6 +541,13 @@ rda_fill_fd_cbk(call_frame_t *frame, void *cookie, xlator_t *this, } } + if (ctx->writes_during_prefetch) { + dict_unref(ctx->writes_during_prefetch); + ctx->writes_during_prefetch = NULL; + } + + GF_ATOMIC_DEC(ctx->prefetching); + if (ctx->cur_size >= priv->rda_high_wmark) ctx->state &= ~RDA_FD_PLUGGED; @@ -603,6 +677,7 @@ rda_fill_fd(call_frame_t *frame, xlator_t *this, fd_t *fd) } local->offset = offset; + GF_ATOMIC_INC(ctx->prefetching); UNLOCK(&ctx->lock); @@ -685,6 +760,9 @@ rda_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; + + rda_mark_inode_dirty(this, local->inode); + rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); @@ -720,6 +798,7 @@ rda_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; + rda_mark_inode_dirty(this, local->inode); rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); @@ -755,6 +834,7 @@ rda_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; + rda_mark_inode_dirty(this, local->inode); rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); @@ -790,6 +870,7 @@ rda_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; + rda_mark_inode_dirty(this, local->inode); rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); @@ -824,6 +905,7 @@ rda_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; + rda_mark_inode_dirty(this, local->inode); rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); @@ -859,6 +941,7 @@ rda_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; + rda_mark_inode_dirty(this, local->inode); rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); if (postbuf_out.ia_ctime == 0) @@ -889,7 +972,7 @@ rda_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; - + rda_mark_inode_dirty(this, local->inode); rda_inode_ctx_update_iatts(local->inode, this, NULL, NULL, local->generation); unwind: @@ -916,7 +999,7 @@ rda_fsetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; - + rda_mark_inode_dirty(this, local->inode); rda_inode_ctx_update_iatts(local->inode, this, NULL, NULL, local->generation); unwind: @@ -947,6 +1030,7 @@ rda_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; + rda_mark_inode_dirty(this, local->inode); rda_inode_ctx_update_iatts(local->inode, this, statpost, &postbuf_out, local->generation); if (postbuf_out.ia_ctime == 0) @@ -981,6 +1065,7 @@ rda_fsetattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; + rda_mark_inode_dirty(this, local->inode); rda_inode_ctx_update_iatts(local->inode, this, statpost, &postbuf_out, local->generation); if (postbuf_out.ia_ctime == 0) @@ -1011,7 +1096,7 @@ rda_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; - + rda_mark_inode_dirty(this, local->inode); rda_inode_ctx_update_iatts(local->inode, this, NULL, NULL, local->generation); unwind: @@ -1038,7 +1123,7 @@ rda_fremovexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; local = frame->local; - + rda_mark_inode_dirty(this, local->inode); rda_inode_ctx_update_iatts(local->inode, this, NULL, NULL, local->generation); unwind: diff --git a/xlators/performance/readdir-ahead/src/readdir-ahead.h b/xlators/performance/readdir-ahead/src/readdir-ahead.h index b5e13800826..619c41059ff 100644 --- a/xlators/performance/readdir-ahead/src/readdir-ahead.h +++ b/xlators/performance/readdir-ahead/src/readdir-ahead.h @@ -67,6 +67,8 @@ struct rda_fd_ctx { call_stub_t *stub; int op_errno; dict_t *xattrs; /* md-cache keys to be sent in readdirp() */ + dict_t *writes_during_prefetch; + gf_atomic_t prefetching; }; struct rda_local { |