diff options
6 files changed, 251 insertions, 100 deletions
diff --git a/tests/basic/afr/split-brain-resolution.t b/tests/basic/afr/split-brain-resolution.t index e75e15aaa97..dbe665e3e51 100644 --- a/tests/basic/afr/split-brain-resolution.t +++ b/tests/basic/afr/split-brain-resolution.t @@ -85,3 +85,6 @@ EXPECT "brick1_alive" cat $M0/data-split-brain.txt  EXPECT 0 get_pending_heal_count $V0  cleanup; + +#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 +#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 diff --git a/tests/bugs/bug-1368312.t b/tests/bugs/bug-1368312.t index 61e56060e81..c60d562bbd7 100644 --- a/tests/bugs/bug-1368312.t +++ b/tests/bugs/bug-1368312.t @@ -82,3 +82,5 @@ EXPECT 0 compare_get_split_brain_status ./tmp1 patchy-client-5  cd -  cleanup +#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 +#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 diff --git a/tests/bugs/replicate/bug-1238398-split-brain-resolution.t b/tests/bugs/replicate/bug-1238398-split-brain-resolution.t index 7ba09f0dc5d..8ef3aae979f 100644 --- a/tests/bugs/replicate/bug-1238398-split-brain-resolution.t +++ b/tests/bugs/replicate/bug-1238398-split-brain-resolution.t @@ -46,3 +46,6 @@ TEST setfattr -n replica.split-brain-choice -v $V0-client-1 $M0/metadata-split-b  EXPECT "666" stat -c %a $M0/metadata-split-brain.txt  cleanup; + +#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 +#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 diff --git a/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t b/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t index 4592ebf8d23..d0e2fee8bcd 100644 --- a/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t +++ b/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t @@ -64,3 +64,6 @@ TEST [ "$SOURCE_BRICK_MD5" == "$B2_MD5" ]  EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0  cleanup; + +#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 +#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 diff --git a/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t b/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t index edfd0d7820d..cdcaf62c925 100644 --- a/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t +++ b/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t @@ -42,5 +42,5 @@ TEST ! getfattr -n trusted.afr.$V0-client-2 $B0/${V0}2/FILE  TEST userdel --force ${NEW_USER}  TEST groupdel ${NEW_USER}-${NEW_GID}  cleanup - - +#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 +#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 diff --git a/xlators/performance/md-cache/src/md-cache.c b/xlators/performance/md-cache/src/md-cache.c index 8cb30e1a2c3..bcd5e85b580 100644 --- a/xlators/performance/md-cache/src/md-cache.c +++ b/xlators/performance/md-cache/src/md-cache.c @@ -77,6 +77,7 @@ struct mdc_conf {          gf_boolean_t cache_statfs;          struct mdc_statfs_cache statfs_cache;          char *mdc_xattr_str; +        gf_atomic_int32_t generation;  }; @@ -110,11 +111,16 @@ struct md_cache {          uint64_t      md_rdev;          uint64_t      md_size;          uint64_t      md_blocks; +        uint64_t      invalidation_time; +        uint64_t      generation;          dict_t       *xattr;          char         *linkname;  	time_t        ia_time;  	time_t        xa_time;          gf_boolean_t  need_lookup; +        gf_boolean_t  valid; +        gf_boolean_t  gen_rollover; +        gf_boolean_t  invalidation_rollover;          gf_lock_t     lock;  }; @@ -126,6 +132,7 @@ struct mdc_local {          char   *linkname;  	char   *key;          dict_t *xattr; +        uint64_t  incident_time;  }; @@ -148,7 +155,10 @@ __mdc_inode_ctx_get (xlator_t *this, inode_t *inode, struct md_cache **mdc_p)  int  mdc_inode_ctx_get (xlator_t *this, inode_t *inode, struct md_cache **mdc_p)  { -	int   ret; +	int   ret = -1; + +        if (!inode) +                goto out;  	LOCK(&inode->lock);  	{ @@ -156,9 +166,58 @@ mdc_inode_ctx_get (xlator_t *this, inode_t *inode, struct md_cache **mdc_p)  	}  	UNLOCK(&inode->lock); +out:  	return ret;  } +uint64_t +__mdc_get_generation (xlator_t *this, struct md_cache *mdc) +{ +        uint64_t         gen  = 0, rollover; +        struct mdc_conf *conf = NULL; + +        conf = this->private; + +        gen = GF_ATOMIC_INC (conf->generation); +        if (gen == 0) { +                mdc->gen_rollover = !mdc->gen_rollover; +                gen = GF_ATOMIC_INC (conf->generation); +                mdc->ia_time = 0; +                mdc->generation = 0; +                mdc->invalidation_time = gen - 1; +        } + +        rollover = mdc->gen_rollover; +        gen |= (rollover << 32); +        return gen; +} + +uint64_t +mdc_get_generation (xlator_t *this, inode_t *inode) +{ +        struct mdc_conf *conf = NULL; +        uint64_t         gen  = 0; +        struct md_cache *mdc  = NULL; + +        conf = this->private; + +        mdc_inode_ctx_get (this, inode, &mdc); + +        if (mdc) { +                LOCK (&mdc->lock); +                { +                        gen = __mdc_get_generation (this, mdc); +                } +                UNLOCK (&mdc->lock); +        } else { +                gen = GF_ATOMIC_INC (conf->generation); +                if (gen == 0) { +                        gen = GF_ATOMIC_INC (conf->generation); +                } +        } + +        return gen; +}  int  __mdc_inode_ctx_set (xlator_t *this, inode_t *inode, struct md_cache *mdc) @@ -189,7 +248,7 @@ mdc_inode_ctx_set (xlator_t *this, inode_t *inode, struct md_cache *mdc)  mdc_local_t * -mdc_local_get (call_frame_t *frame) +mdc_local_get (call_frame_t *frame, inode_t *inode)  {          mdc_local_t *local = NULL; @@ -197,10 +256,12 @@ mdc_local_get (call_frame_t *frame)          if (local)                  goto out; +          local = GF_CALLOC (sizeof (*local), 1, gf_mdc_mt_mdc_local_t);          if (!local)                  goto out; +        local->incident_time = mdc_get_generation (frame->this, inode);          frame->local = local;  out:          return local; @@ -343,9 +404,17 @@ is_md_cache_iatt_valid (xlator_t *this, struct md_cache *mdc)          LOCK (&mdc->lock);          { -                ret = __is_cache_valid (this, mdc->ia_time); -                if (ret == _gf_false) -                        mdc->ia_time = 0; +                if (mdc->valid == _gf_false) { +                        ret = mdc->valid; +                } else { +                        ret = __is_cache_valid (this, mdc->ia_time); +                        if (ret == _gf_false) { +                                mdc->ia_time = 0; +                                mdc->invalidation_time +                                        = __mdc_get_generation (this, mdc) +                                        & 0xffffffff; +                        } +                }          }          UNLOCK (&mdc->lock); @@ -410,10 +479,13 @@ mdc_to_iatt (struct md_cache *mdc, struct iatt *iatt)  int  mdc_inode_iatt_set_validate(xlator_t *this, inode_t *inode, struct iatt *prebuf, -			    struct iatt *iatt, gf_boolean_t update_time) +			    struct iatt *iatt, gf_boolean_t update_time, +                            uint64_t incident_time)  { -        int              ret = 0; -        struct md_cache *mdc = NULL; +        int              ret      = 0; +        struct md_cache *mdc      = NULL; +        uint32_t         rollover = 0; +        uint64_t         gen      = 0;          mdc = mdc_inode_prep (this, inode);          if (!mdc) { @@ -421,12 +493,20 @@ mdc_inode_iatt_set_validate(xlator_t *this, inode_t *inode, struct iatt *prebuf,                  goto out;          } +        rollover = incident_time >> 32; +        incident_time = (incident_time & 0xffffffff); +          LOCK (&mdc->lock);          {                  if (!iatt || !iatt->ia_ctime) { -                        gf_msg_trace ("md-cache", 0, "invalidating iatt(NULL)" -                                      "(%s)", uuid_utoa (inode->gfid)); +                        gf_msg_callingfn ("md-cache", GF_LOG_TRACE, 0, 0, +                                          "invalidating iatt(NULL)" +                                          "(%s)", uuid_utoa (inode->gfid));                          mdc->ia_time = 0; +                        mdc->valid = 0; + +                        gen = __mdc_get_generation (this, mdc); +                        mdc->invalidation_time = (gen & 0xffffffff);                          goto unlock;                  } @@ -442,7 +522,8 @@ mdc_inode_iatt_set_validate(xlator_t *this, inode_t *inode, struct iatt *prebuf,                          gf_msg_callingfn (this->name, GF_LOG_DEBUG, EINVAL,                                            MD_CACHE_MSG_DISCARD_UPDATE,                                            "discarding the iatt validate " -                                          "request"); +                                          "request (%s)", +                                          uuid_utoa (inode->gfid));                          ret = -1;                          goto unlock; @@ -452,7 +533,8 @@ mdc_inode_iatt_set_validate(xlator_t *this, inode_t *inode, struct iatt *prebuf,                          gf_msg_callingfn (this->name, GF_LOG_DEBUG, EINVAL,                                            MD_CACHE_MSG_DISCARD_UPDATE,                                            "discarding the iatt validate " -                                          "request(ctime_nsec)"); +                                          "request(ctime_nsec) (%s)", +                                          uuid_utoa (inode->gfid));                          ret = -1;                          goto unlock;                  } @@ -480,15 +562,37 @@ mdc_inode_iatt_set_validate(xlator_t *this, inode_t *inode, struct iatt *prebuf,  				inode_invalidate(inode);                          } -                mdc_from_iatt (mdc, iatt); - -                if (update_time) -                        time (&mdc->ia_time); - -                gf_msg_callingfn ("md-cache", GF_LOG_TRACE, 0, -                                  MD_CACHE_MSG_CACHE_UPDATE, "Updated iatt(%s)" -                                  " time:%lld ", uuid_utoa (inode->gfid), -                                  (long long)mdc->ia_time); +                if ((mdc->gen_rollover == rollover) && +                    ((incident_time > mdc->generation) && +                     (mdc->valid || +                      (incident_time > mdc->invalidation_time)))) { +                        mdc_from_iatt (mdc, iatt); +                        mdc->generation = incident_time; +                        mdc->valid = _gf_true; +                        if (update_time) +                                time (&mdc->ia_time); + +                        gf_msg_callingfn ("md-cache", GF_LOG_TRACE, 0, +                                          MD_CACHE_MSG_CACHE_UPDATE, +                                          "Updated iatt(%s)" +                                          " time:%lld generation=%lld", +                                          uuid_utoa (iatt->ia_gfid), +                                          (unsigned long long)mdc->ia_time, +                                          (unsigned long long) mdc->generation); +                } else { +                        gf_msg_callingfn ("md-cache", GF_LOG_TRACE, 0, 0, +                                          "not updating cache (%s)" +                                          "mdc-rollover=%u rollover=%u " +                                          "mdc-generation=%llu " +                                          "mdc-ia_time=%llu incident_time=%llu " +                                          "mdc-invalidation-time=%llu", +                                          uuid_utoa (iatt->ia_gfid), +                                          mdc->gen_rollover, rollover, +                                          (unsigned long long) mdc->generation, +                                          (unsigned long long) mdc->ia_time, +                                          (unsigned long long) incident_time, +                                          (unsigned long long) mdc->invalidation_time); +                }          }  unlock:          UNLOCK (&mdc->lock); @@ -497,9 +601,11 @@ out:          return ret;  } -int mdc_inode_iatt_set(xlator_t *this, inode_t *inode, struct iatt *iatt) +int mdc_inode_iatt_set(xlator_t *this, inode_t *inode, struct iatt *iatt, +                       uint64_t incident_time)  { -	return mdc_inode_iatt_set_validate(this, inode, NULL, iatt, _gf_true); +	return mdc_inode_iatt_set_validate(this, inode, NULL, iatt, _gf_true, +                                           incident_time);  }  int @@ -827,14 +933,19 @@ out:  void  mdc_inode_iatt_invalidate (xlator_t *this, inode_t *inode)  { -        struct md_cache *mdc = NULL; +        struct md_cache *mdc  = NULL; +        uint32_t         gen  = 0;          if (mdc_inode_ctx_get (this, inode, &mdc) != 0)                  goto out; +        gen = mdc_get_generation (this, inode) && 0xffffffff; +          LOCK (&mdc->lock);          {  		mdc->ia_time = 0; +                mdc->valid = _gf_false; +                mdc->invalidation_time = gen;          }          UNLOCK (&mdc->lock); @@ -877,7 +988,8 @@ mdc_update_gfid_stat (xlator_t *this, struct iatt *iatt)                  goto out;          }          ret = mdc_inode_iatt_set_validate (this, inode, NULL, -                                           iatt, _gf_true); +                                           iatt, _gf_true, +                                           mdc_get_generation (this, inode));  out:          return ret;  } @@ -1051,7 +1163,7 @@ mdc_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)          mdc_local_t     *local = NULL;          struct mdc_conf *conf  = this->private; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          if (!local) {                  op_ret = -1;                  op_errno = ENOMEM; @@ -1118,11 +1230,13 @@ mdc_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto out;          if (local->loc.parent) { -                mdc_inode_iatt_set (this, local->loc.parent, postparent); +                mdc_inode_iatt_set (this, local->loc.parent, postparent, +                                    local->incident_time);          }          if (local->loc.inode) { -                mdc_inode_iatt_set (this, local->loc.inode, stbuf); +                mdc_inode_iatt_set (this, local->loc.inode, stbuf, +                                    local->incident_time);                  mdc_inode_xatt_set (this, local->loc.inode, dict);          }  out: @@ -1144,7 +1258,7 @@ mdc_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc,          mdc_local_t *local = NULL;          struct mdc_conf *conf = this->private; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          if (!local) {                  GF_ATOMIC_INC (conf->mdc_counter.stat_miss);                  goto uncached; @@ -1225,7 +1339,8 @@ mdc_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto out;          } -        mdc_inode_iatt_set (this, local->loc.inode, buf); +        mdc_inode_iatt_set (this, local->loc.inode, buf, +                            local->incident_time);  out:          MDC_STACK_UNWIND (stat, frame, op_ret, op_errno, buf, xdata); @@ -1242,7 +1357,7 @@ mdc_stat (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)          mdc_local_t  *local = NULL;          struct mdc_conf *conf = this->private; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          if (!local)                  goto uncached; @@ -1290,7 +1405,7 @@ mdc_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto out;          } -        mdc_inode_iatt_set (this, local->fd->inode, buf); +        mdc_inode_iatt_set (this, local->fd->inode, buf, local->incident_time);  out:          MDC_STACK_UNWIND (fstat, frame, op_ret, op_errno, buf, xdata); @@ -1307,7 +1422,7 @@ mdc_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)          mdc_local_t  *local = NULL;          struct mdc_conf *conf = this->private; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);          if (!local)                  goto uncached; @@ -1351,7 +1466,7 @@ mdc_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          mdc_inode_iatt_set_validate(this, local->loc.inode, prebuf, postbuf, -                                    _gf_true); +                                    _gf_true, local->incident_time);  out:          MDC_STACK_UNWIND (truncate, frame, op_ret, op_errno, prebuf, postbuf, @@ -1367,7 +1482,7 @@ mdc_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          local->loc.inode = inode_ref (loc->inode); @@ -1398,7 +1513,7 @@ mdc_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          mdc_inode_iatt_set_validate(this, local->fd->inode, prebuf, postbuf, -                                    _gf_true); +                                    _gf_true, local->incident_time);  out:          MDC_STACK_UNWIND (ftruncate, frame, op_ret, op_errno, prebuf, postbuf, @@ -1414,7 +1529,7 @@ mdc_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);          local->fd = fd_ref (fd); @@ -1447,11 +1562,13 @@ mdc_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          if (local->loc.parent) { -                mdc_inode_iatt_set (this, local->loc.parent, postparent); +                mdc_inode_iatt_set (this, local->loc.parent, postparent, +                                    local->incident_time);          }          if (local->loc.inode) { -                mdc_inode_iatt_set (this, local->loc.inode, buf); +                mdc_inode_iatt_set (this, local->loc.inode, buf, +                                    local->incident_time);                  mdc_inode_xatt_set (this, local->loc.inode, local->xattr);          }  out: @@ -1467,7 +1584,7 @@ mdc_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          loc_copy (&local->loc, loc);          local->xattr = dict_ref (xdata); @@ -1501,11 +1618,13 @@ mdc_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          if (local->loc.parent) { -                mdc_inode_iatt_set (this, local->loc.parent, postparent); +                mdc_inode_iatt_set (this, local->loc.parent, postparent, +                                    local->incident_time);          }          if (local->loc.inode) { -                mdc_inode_iatt_set (this, local->loc.inode, buf); +                mdc_inode_iatt_set (this, local->loc.inode, buf, +                                    local->incident_time);                  mdc_inode_xatt_set (this, local->loc.inode, local->xattr);          }  out: @@ -1521,7 +1640,7 @@ mdc_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          loc_copy (&local->loc, loc);          local->xattr = dict_ref (xdata); @@ -1562,11 +1681,13 @@ mdc_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          if (local->loc.parent) { -                mdc_inode_iatt_set (this, local->loc.parent, postparent); +                mdc_inode_iatt_set (this, local->loc.parent, postparent, +                                    local->incident_time);          }          if (local->loc.inode) { -                mdc_inode_iatt_set (this, local->loc.inode, NULL); +                mdc_inode_iatt_set (this, local->loc.inode, NULL, +                                    local->incident_time);          }  out: @@ -1582,7 +1703,7 @@ mdc_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t xflag,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          loc_copy (&local->loc, loc); @@ -1622,7 +1743,8 @@ mdc_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          if (local->loc.parent) { -                mdc_inode_iatt_set (this, local->loc.parent, postparent); +                mdc_inode_iatt_set (this, local->loc.parent, postparent, +                                    local->incident_time);          }  out: @@ -1638,7 +1760,7 @@ mdc_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flag,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          loc_copy (&local->loc, loc); @@ -1671,11 +1793,13 @@ mdc_symlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          if (local->loc.parent) { -                mdc_inode_iatt_set (this, local->loc.parent, postparent); +                mdc_inode_iatt_set (this, local->loc.parent, postparent, +                                    local->incident_time);          }          if (local->loc.inode) { -                mdc_inode_iatt_set (this, local->loc.inode, buf); +                mdc_inode_iatt_set (this, local->loc.inode, buf, +                                    local->incident_time);          }  out:          MDC_STACK_UNWIND (symlink, frame, op_ret, op_errno, inode, buf, @@ -1690,7 +1814,7 @@ mdc_symlink (call_frame_t *frame, xlator_t *this, const char *linkname,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          loc_copy (&local->loc, loc); @@ -1726,7 +1850,8 @@ mdc_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          if (local->loc.parent) { -                mdc_inode_iatt_set (this, local->loc.parent, postoldparent); +                mdc_inode_iatt_set (this, local->loc.parent, postoldparent, +                                    local->incident_time);          }          if (local->loc.inode) { @@ -1734,11 +1859,13 @@ mdc_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  		   attributes before setting attributes here  		*/ -		mdc_inode_iatt_set (this, local->loc.inode, NULL); +		mdc_inode_iatt_set (this, local->loc.inode, NULL, +                                    local->incident_time);          }          if (local->loc2.parent) { -                mdc_inode_iatt_set (this, local->loc2.parent, postnewparent); +                mdc_inode_iatt_set (this, local->loc2.parent, postnewparent, +                                    local->incident_time);          }  out:          MDC_STACK_UNWIND (rename, frame, op_ret, op_errno, buf, @@ -1754,7 +1881,7 @@ mdc_rename (call_frame_t *frame, xlator_t *this,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, oldloc->inode);          loc_copy (&local->loc, oldloc);          loc_copy (&local->loc2, newloc); @@ -1788,11 +1915,13 @@ mdc_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          if (local->loc.inode) { -                mdc_inode_iatt_set (this, local->loc.inode, buf); +                mdc_inode_iatt_set (this, local->loc.inode, buf, +                                    local->incident_time);          }          if (local->loc2.parent) { -                mdc_inode_iatt_set (this, local->loc2.parent, postparent); +                mdc_inode_iatt_set (this, local->loc2.parent, postparent, +                                    local->incident_time);          }  out:          MDC_STACK_UNWIND (link, frame, op_ret, op_errno, inode, buf, @@ -1807,7 +1936,7 @@ mdc_link (call_frame_t *frame, xlator_t *this,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, oldloc->inode);          loc_copy (&local->loc, oldloc);          loc_copy (&local->loc2, newloc); @@ -1841,11 +1970,12 @@ mdc_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          if (local->loc.parent) { -                mdc_inode_iatt_set (this, local->loc.parent, postparent); +                mdc_inode_iatt_set (this, local->loc.parent, postparent, +                                    local->incident_time);          }          if (local->loc.inode) { -                mdc_inode_iatt_set (this, inode, buf); +                mdc_inode_iatt_set (this, inode, buf, local->incident_time);                  mdc_inode_xatt_set (this, local->loc.inode, local->xattr);          }  out: @@ -1861,7 +1991,7 @@ mdc_create (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          loc_copy (&local->loc, loc);          local->xattr = dict_ref (xdata); @@ -1914,7 +2044,7 @@ mdc_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,                  goto out;          } -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          local->fd = fd_ref (fd); @@ -1944,7 +2074,7 @@ mdc_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto out;          } -        mdc_inode_iatt_set (this, local->fd->inode, stbuf); +        mdc_inode_iatt_set (this, local->fd->inode, stbuf, local->incident_time);  out:          MDC_STACK_UNWIND (readv, frame, op_ret, op_errno, vector, count, @@ -1960,7 +2090,7 @@ mdc_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);          local->fd = fd_ref (fd); @@ -1989,7 +2119,7 @@ mdc_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          mdc_inode_iatt_set_validate(this, local->fd->inode, prebuf, postbuf, -                                    _gf_true); +                                    _gf_true, local->incident_time);  out:          MDC_STACK_UNWIND (writev, frame, op_ret, op_errno, prebuf, postbuf, @@ -2006,7 +2136,7 @@ mdc_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);          local->fd = fd_ref (fd); @@ -2027,7 +2157,8 @@ mdc_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          local = frame->local;          if (op_ret != 0) { -		mdc_inode_iatt_set (this, local->loc.inode, NULL); +		mdc_inode_iatt_set (this, local->loc.inode, NULL, +                                    local->incident_time);                  goto out;  	} @@ -2035,7 +2166,7 @@ mdc_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto out;  	mdc_inode_iatt_set_validate(this, local->loc.inode, prebuf, postbuf, -                                    _gf_true); +                                    _gf_true, local->incident_time);  out:          MDC_STACK_UNWIND (setattr, frame, op_ret, op_errno, prebuf, postbuf, @@ -2051,7 +2182,7 @@ mdc_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          loc_copy (&local->loc, loc); @@ -2080,7 +2211,7 @@ mdc_fsetattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          mdc_inode_iatt_set_validate(this, local->fd->inode, prebuf, postbuf, -                                    _gf_true); +                                    _gf_true, local->incident_time);  out:          MDC_STACK_UNWIND (fsetattr, frame, op_ret, op_errno, prebuf, postbuf, @@ -2096,7 +2227,7 @@ mdc_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);          local->fd = fd_ref (fd); @@ -2125,7 +2256,7 @@ mdc_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          mdc_inode_iatt_set_validate(this, local->fd->inode, prebuf, postbuf, -                                     _gf_true); +                                    _gf_true, local->incident_time);  out:          MDC_STACK_UNWIND (fsync, frame, op_ret, op_errno, prebuf, postbuf, @@ -2141,7 +2272,7 @@ mdc_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int datasync,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);          local->fd = fd_ref (fd); @@ -2177,7 +2308,8 @@ mdc_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (ret >= 0) {                  ret = dict_get_iatt (xdata, GF_POSTSTAT, &poststat);                  mdc_inode_iatt_set_validate (this, local->loc.inode, &prestat, -                                             &poststat, _gf_true); +                                             &poststat, _gf_true, +                                             local->incident_time);          }          if (ret < 0) @@ -2196,7 +2328,7 @@ mdc_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          loc_copy (&local->loc, loc);          local->xattr = dict_ref (xattr); @@ -2234,7 +2366,8 @@ mdc_fsetxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (ret >= 0) {                  ret = dict_get_iatt (xdata, GF_POSTSTAT, &poststat);                  mdc_inode_iatt_set_validate (this, local->fd->inode, &prestat, -                                             &poststat, _gf_true); +                                             &poststat, _gf_true, +                                             local->incident_time);          }          if (ret < 0) @@ -2253,7 +2386,7 @@ mdc_fsetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd,  {          mdc_local_t  *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);  	local->fd = fd_ref (fd);          local->xattr = dict_ref (xattr); @@ -2301,7 +2434,7 @@ mdc_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, const char *key,  	dict_t       *xattr = NULL;          struct mdc_conf *conf = this->private; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          if (!local)                  goto uncached; @@ -2369,7 +2502,7 @@ mdc_fgetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, const char *key,  	int           op_errno = ENODATA;          struct mdc_conf *conf = this->private; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);          if (!local)                  goto uncached; @@ -2428,7 +2561,8 @@ mdc_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (ret >= 0) {                  ret = dict_get_iatt (xdata, GF_POSTSTAT, &poststat);                  mdc_inode_iatt_set_validate (this, local->loc.inode, &prestat, -                                             &poststat, _gf_true); +                                             &poststat, _gf_true, +                                             local->incident_time);          }          if (ret < 0) @@ -2450,7 +2584,7 @@ mdc_removexattr (call_frame_t *frame, xlator_t *this, loc_t *loc,          dict_t       *xattr = NULL;          struct mdc_conf *conf = this->private; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);  	loc_copy (&local->loc, loc); @@ -2510,7 +2644,8 @@ mdc_fremovexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (ret >= 0) {                  ret = dict_get_iatt (xdata, GF_POSTSTAT, &poststat);                  mdc_inode_iatt_set_validate (this, local->fd->inode, &prestat, -                                             &poststat, _gf_true); +                                             &poststat, _gf_true, +                                             local->incident_time);          }          if (ret < 0) @@ -2533,7 +2668,7 @@ mdc_fremovexattr (call_frame_t *frame, xlator_t *this, fd_t *fd,          dict_t       *xattr = NULL;          struct mdc_conf *conf = this->private; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);  	local->fd = fd_ref (fd); @@ -2593,7 +2728,7 @@ mdc_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc,          dict_t      *xattr_alloc = NULL;          mdc_local_t *local       = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);  	loc_copy (&local->loc, loc); @@ -2630,14 +2765,15 @@ mdc_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  	if (op_ret <= 0) {                  if ((op_ret == -1) && ((op_errno == ENOENT)                                         || (op_errno == ESTALE))) -                    mdc_inode_iatt_invalidate (this, local->fd->inode); +                        mdc_inode_iatt_invalidate (this, local->fd->inode);  		goto unwind;          }          list_for_each_entry (entry, &entries->list, list) {                  if (!entry->inode)  			continue; -                mdc_inode_iatt_set (this, entry->inode, &entry->d_stat); +                mdc_inode_iatt_set (this, entry->inode, &entry->d_stat, +                                    local->incident_time);                  mdc_inode_xatt_set (this, entry->inode, entry->dict);          } @@ -2654,7 +2790,7 @@ mdc_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd,  	dict_t      *xattr_alloc = NULL;          mdc_local_t *local       = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);          if (!local)                  goto out; @@ -2704,7 +2840,7 @@ mdc_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd,          mdc_local_t     *local      = NULL;  	struct mdc_conf *conf       = this->private; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);          if (!local)                  goto unwind; @@ -2756,7 +2892,7 @@ mdc_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          }          mdc_inode_iatt_set_validate(this, local->fd->inode, prebuf, postbuf, -                                    _gf_true); +                                    _gf_true, local->incident_time);  out:          MDC_STACK_UNWIND (fallocate, frame, op_ret, op_errno, prebuf, postbuf, @@ -2770,7 +2906,7 @@ int mdc_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode,  {  	mdc_local_t *local; -	local = mdc_local_get(frame); +	local = mdc_local_get (frame, fd->inode);  	local->fd = fd_ref(fd);  	STACK_WIND(frame, mdc_fallocate_cbk, FIRST_CHILD(this), @@ -2798,7 +2934,7 @@ mdc_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          }          mdc_inode_iatt_set_validate(this, local->fd->inode, prebuf, postbuf, -                                    _gf_true); +                                    _gf_true, local->incident_time);  out:          MDC_STACK_UNWIND(discard, frame, op_ret, op_errno, prebuf, postbuf, @@ -2812,7 +2948,7 @@ int mdc_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,  {  	mdc_local_t *local; -	local = mdc_local_get(frame); +	local = mdc_local_get (frame, fd->inode);  	local->fd = fd_ref(fd);  	STACK_WIND(frame, mdc_discard_cbk, FIRST_CHILD(this), @@ -2840,7 +2976,7 @@ mdc_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          }          mdc_inode_iatt_set_validate(this, local->fd->inode, prebuf, postbuf, -                                    _gf_true); +                                    _gf_true, local->incident_time);  out:          MDC_STACK_UNWIND(zerofill, frame, op_ret, op_errno, prebuf, postbuf, @@ -2854,7 +2990,7 @@ int mdc_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,  {          mdc_local_t *local; -        local = mdc_local_get(frame); +        local = mdc_local_get (frame, fd->inode);          local->fd = fd_ref(fd);          STACK_WIND(frame, mdc_zerofill_cbk, FIRST_CHILD(this), @@ -2893,7 +3029,7 @@ mdc_readlink (call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,  {          mdc_local_t *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          if (!local)                  goto unwind; @@ -2936,7 +3072,7 @@ mdc_fsyncdir (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags,  {          mdc_local_t *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, fd->inode);          if (!local)                  goto unwind; @@ -2980,7 +3116,7 @@ mdc_access (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask,  {          mdc_local_t *local = NULL; -        local = mdc_local_get (frame); +        local = mdc_local_get (frame, loc->inode);          if (!local)                  goto unwind; @@ -3176,6 +3312,7 @@ mdc_invalidate (xlator_t *this, void *data)          struct set                           tmp        = {0, };          inode_table_t                       *itable     = NULL;          struct mdc_conf                     *conf       = this->private; +        uint64_t                             gen        = 0;          up_data = (struct gf_upcall *)data; @@ -3211,8 +3348,10 @@ mdc_invalidate (xlator_t *this, void *data)          }          if (up_ci->flags & IATT_UPDATE_FLAGS) { +                gen = mdc_get_generation (this, inode);                  ret = mdc_inode_iatt_set_validate (this, inode, NULL, -                                                   &up_ci->stat, _gf_false); +                                                   &up_ci->stat, _gf_false, +                                                   gen);                  /* one of the scenarios where ret < 0 is when this invalidate                   * is older than the current stat, in that case do not                   * update the xattrs as well @@ -3486,6 +3625,7 @@ mdc_init (xlator_t *this)          GF_ATOMIC_INIT (conf->mdc_counter.stat_invals, 0);          GF_ATOMIC_INIT (conf->mdc_counter.xattr_invals, 0);          GF_ATOMIC_INIT (conf->mdc_counter.need_lookup, 0); +        GF_ATOMIC_INIT (conf->generation, 0);          /* If timeout is greater than 60s (default before the patch that added           * cache invalidation support was added) then, cache invalidation  | 
