diff options
Diffstat (limited to 'xlators/storage')
-rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 52 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-messages.h | 3 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-metadata.c | 34 |
3 files changed, 62 insertions, 27 deletions
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 0ca9169e2f4..00118b2d123 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -1620,14 +1620,14 @@ unlock: } static int -is_fresh_file (struct stat *stat) +is_fresh_file (int64_t ctime_sec) { struct timeval tv; gettimeofday (&tv, NULL); - if ((stat->st_ctime >= (tv.tv_sec - 1)) - && (stat->st_ctime <= tv.tv_sec)) + if ((ctime_sec >= (tv.tv_sec - 1)) + && (ctime_sec <= tv.tv_sec)) return 1; return 0; @@ -1665,19 +1665,51 @@ posix_gfid_heal (xlator_t *this, const char *path, loc_t *loc, dict_t *xattr_req uuid_t uuid_curr; int ret = 0; struct stat stat = {0, }; + struct iatt stbuf = {0, }; + struct posix_private *priv = NULL; + + priv = this->private; if (!xattr_req) return 0; - if (sys_lstat (path, &stat) != 0) { - return -errno; - } - - ret = sys_lgetxattr (path, GFID_XATTR_KEY, uuid_curr, 16); - if (ret != 16) { - if (is_fresh_file (&stat)) { + if (loc->inode && priv->ctime) { + if (sys_lstat (path, &stat) != 0) { + return -errno; + } + /* stbuf is only to compare ctime, don't use it to access + * other fields as they are zero. */ + ret = posix_get_mdata_xattr (this, path, -1, loc->inode, + &stbuf); + if (ret) { + gf_msg (this->name, GF_LOG_WARNING, errno, + P_MSG_GETMDATA_FAILED, + "posix get mdata failed on gfid: %s", + uuid_utoa(loc->inode->gfid)); return -ENOENT; } + ret = sys_lgetxattr (path, GFID_XATTR_KEY, uuid_curr, 16); + if (ret != 16) { + if (is_fresh_file (stbuf.ia_ctime)) { + gf_msg (this->name, GF_LOG_ERROR, ENOENT, + P_MSG_FRESHFILE, + "Fresh file: %s", path); + return -ENOENT; + } + } + } else { + if (sys_lstat (path, &stat) != 0) { + return -errno; + } + ret = sys_lgetxattr (path, GFID_XATTR_KEY, uuid_curr, 16); + if (ret != 16) { + if (is_fresh_file (stat.st_ctime)) { + gf_msg (this->name, GF_LOG_ERROR, ENOENT, + P_MSG_FRESHFILE, + "Fresh file: %s", path); + return -ENOENT; + } + } } posix_gfid_set (this, path, loc, xattr_req); diff --git a/xlators/storage/posix/src/posix-messages.h b/xlators/storage/posix/src/posix-messages.h index 2c23387f7e7..38e6d3113d3 100644 --- a/xlators/storage/posix/src/posix-messages.h +++ b/xlators/storage/posix/src/posix-messages.h @@ -140,7 +140,8 @@ GLFS_MSGID(POSIX, P_MSG_STOREMDATA_FAILED, P_MSG_FETCHMDATA_FAILED, P_MSG_GETMDATA_FAILED, - P_MSG_SETMDATA_FAILED + P_MSG_SETMDATA_FAILED, + P_MSG_FRESHFILE ); #endif /* !_GLUSTERD_MESSAGES_H_ */ diff --git a/xlators/storage/posix/src/posix-metadata.c b/xlators/storage/posix/src/posix-metadata.c index 1110435f4e0..045ad25b21f 100644 --- a/xlators/storage/posix/src/posix-metadata.c +++ b/xlators/storage/posix/src/posix-metadata.c @@ -59,10 +59,9 @@ posix_mdata_from_disk (posix_mdata_t *out, posix_mdata_disk_t *in) /* posix_fetch_mdata_xattr fetches the posix_mdata_t from disk */ static int posix_fetch_mdata_xattr (xlator_t *this, const char *real_path_arg, int _fd, - inode_t *inode, posix_mdata_t *metadata) + inode_t *inode, posix_mdata_t *metadata, int *op_errno) { size_t size = -1; - int op_errno = 0; int op_ret = -1; char *value = NULL; gf_boolean_t fd_based_fop = _gf_false; @@ -83,10 +82,11 @@ posix_fetch_mdata_xattr (xlator_t *this, const char *real_path_arg, int _fd, MAKE_HANDLE_PATH (real_path, this, inode->gfid, NULL); if (!real_path) { uuid_utoa_r (inode->gfid, gfid_str); - gf_msg (this->name, GF_LOG_WARNING, op_errno, + gf_msg (this->name, GF_LOG_WARNING, errno, P_MSG_LSTAT_FAILED, "lstat on gfid %s failed", gfid_str); op_ret = -1; + *op_errno = errno; goto out; } } @@ -100,23 +100,23 @@ posix_fetch_mdata_xattr (xlator_t *this, const char *real_path_arg, int _fd, } if (size == -1) { - op_errno = errno; - if ((op_errno == ENOTSUP) || (op_errno == ENOSYS)) { + *op_errno = errno; + if ((*op_errno == ENOTSUP) || (*op_errno == ENOSYS)) { GF_LOG_OCCASIONALLY (gf_posix_xattr_enotsup_log, this->name, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting" " brick with 'user_xattr' " "flag)"); - } else if (op_errno == ENOATTR || - op_errno == ENODATA) { + } else if (*op_errno == ENOATTR || + *op_errno == ENODATA) { gf_msg_debug (this->name, 0, "No such attribute:%s for file %s " "gfid: %s", key, real_path ? real_path : (real_path_arg ? real_path_arg : "null"), uuid_utoa(inode->gfid)); } else { - gf_msg (this->name, GF_LOG_DEBUG, op_errno, + gf_msg (this->name, GF_LOG_DEBUG, *op_errno, P_MSG_XATTR_FAILED, "getxattr failed" " on %s gfid: %s key: %s ", real_path ? real_path : (real_path_arg ? real_path_arg : "null"), @@ -129,7 +129,7 @@ posix_fetch_mdata_xattr (xlator_t *this, const char *real_path_arg, int _fd, value = GF_CALLOC (size + 1, sizeof(char), gf_posix_mt_char); if (!value) { op_ret = -1; - op_errno = ENOMEM; + *op_errno = ENOMEM; goto out; } @@ -142,7 +142,7 @@ posix_fetch_mdata_xattr (xlator_t *this, const char *real_path_arg, int _fd, } if (size == -1) { op_ret = -1; - op_errno = errno; + *op_errno = errno; gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_XATTR_FAILED, "getxattr failed on " " on %s gfid: %s key: %s ", @@ -234,6 +234,7 @@ __posix_get_mdata_xattr (xlator_t *this, const char *real_path, int _fd, { posix_mdata_t *mdata = NULL; int ret = -1; + int op_errno = 0; GF_VALIDATE_OR_GOTO (this->name, inode, out); @@ -248,7 +249,7 @@ __posix_get_mdata_xattr (xlator_t *this, const char *real_path, int _fd, } ret = posix_fetch_mdata_xattr (this, real_path, _fd, inode, - mdata); + mdata, &op_errno); if (ret == 0) { /* Got mdata from disk, set it in inode ctx. This case @@ -261,7 +262,7 @@ __posix_get_mdata_xattr (xlator_t *this, const char *real_path, int _fd, * Even new file creation hits here first as posix_pstat * is generally done before posix_set_ctime */ - if (stbuf) { + if (stbuf && op_errno != ENOENT) { mdata->version = 1; mdata->flags = 0; mdata->ctime.tv_sec = stbuf->ia_ctime; @@ -287,14 +288,14 @@ __posix_get_mdata_xattr (xlator_t *this, const char *real_path, int _fd, /* This case should not be hit. If it hits, don't * fail, log warning, free mdata and move on */ - gf_msg (this->name, GF_LOG_WARNING, errno, + gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_FETCHMDATA_FAILED, "file: %s: gfid: %s key:%s ", real_path ? real_path : "null", uuid_utoa(inode->gfid), GF_XATTR_MDATA_KEY); GF_FREE (mdata); - ret = 0; + ret = -1; goto out; } } @@ -355,6 +356,7 @@ posix_set_mdata_xattr (xlator_t *this, const char *real_path, int fd, { posix_mdata_t *mdata = NULL; int ret = -1; + int op_errno = 0; GF_VALIDATE_OR_GOTO ("posix", this, out); GF_VALIDATE_OR_GOTO (this->name, inode, out); @@ -378,7 +380,7 @@ posix_set_mdata_xattr (xlator_t *this, const char *real_path, int fd, ret = posix_fetch_mdata_xattr (this, real_path, fd, inode, - (void *)mdata); + (void *)mdata, &op_errno); if (ret == 0) { /* Got mdata from disk, set it in inode ctx. This case * is hit when in-memory status is lost due to brick @@ -452,7 +454,7 @@ posix_set_mdata_xattr (xlator_t *this, const char *real_path, int fd, "file: %s: gfid: %s key:%s ", real_path ? real_path : "null", uuid_utoa(inode->gfid), GF_XATTR_MDATA_KEY); - goto out; + goto unlock; } } unlock: |