diff options
author | Kotresh HR <khiremat@redhat.com> | 2017-06-29 05:45:34 -0400 |
---|---|---|
committer | Jeff Darcy <jeff@pl.atyp.us> | 2017-07-10 14:51:14 +0000 |
commit | a62b16b72b03f2b7c25c24ea9ac5968453a92009 (patch) | |
tree | 7521978a597377f082172a2b5454e83bbab02bbf /xlators/storage/posix/src/posix.c | |
parent | 9156a743aa76c955d18c9bfcb7c1a38ba00da890 (diff) |
storage/posix: New gfid2path infra
With this infra, a new xattr is stored on each entry
creation as below.
trusted.gfid2path.<xxhash> = <pargfid>/<basename>
If there are hardlinks, multiple xattrs would be present.
Fops which are impacted:
create, mknod, link, symlink, rename, unlink
Option to enable:
gluster vol set <VOLNAME> storage.gfid2path on
Updates: #139
Change-Id: I369974cd16703c45ee87f82e6c2ff5a987a6cc6a
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Reviewed-on: https://review.gluster.org/17488
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Aravinda VK <avishwan@redhat.com>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Diffstat (limited to 'xlators/storage/posix/src/posix.c')
-rw-r--r-- | xlators/storage/posix/src/posix.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 45c35203480..87da16694a5 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -57,6 +57,7 @@ #include "glusterfs-acl.h" #include "posix-messages.h" #include "events.h" +#include "posix-gfid-path.h" extern char *marker_xattrs[]; #define ALIGN_SIZE 4096 @@ -1415,6 +1416,11 @@ post_op: XATTR_CREATE, op_ret, this, ignore); } + if (priv->gfid2path) { + posix_set_gfid2path_xattr (this, real_path, loc->pargfid, + loc->name); + } + ignore: op_ret = posix_entry_create_xattr_set (this, real_path, xdata); if (op_ret) { @@ -2121,6 +2127,17 @@ posix_unlink (call_frame_t *frame, xlator_t *this, } } + if (priv->gfid2path && (stbuf.ia_nlink > 1)) { + op_ret = posix_remove_gfid2path_xattr (this, real_path, + loc->pargfid, + loc->name); + if (op_ret < 0) { + /* Allow unlink if pgfid xattr is not set. */ + if (errno != ENOATTR) + goto out; + } + } + unwind_dict = dict_new (); if (!unwind_dict) { op_errno = -ENOMEM; @@ -2382,6 +2399,12 @@ posix_symlink (call_frame_t *frame, xlator_t *this, SET_PGFID_XATTR (real_path, pgfid_xattr_key, nlink_samepgfid, XATTR_CREATE, op_ret, this, ignore); } + + if (priv->gfid2path) { + posix_set_gfid2path_xattr (this, real_path, loc->pargfid, + loc->name); + } + ignore: op_ret = posix_entry_create_xattr_set (this, real_path, xdata); if (op_ret) { @@ -2459,6 +2482,7 @@ posix_rename (call_frame_t *frame, xlator_t *this, int nlink = 0; char *pgfid_xattr_key = NULL; int32_t nlink_samepgfid = 0; + char *gfid_path = NULL; dict_t *unwind_dict = NULL; gf_boolean_t locked = _gf_false; gf_boolean_t get_link_count = _gf_false; @@ -2645,7 +2669,20 @@ posix_rename (call_frame_t *frame, xlator_t *this, op_ret, this, unlock); } + + if (!IA_ISDIR (oldloc->inode->ia_type) && priv->gfid2path) { + MAKE_HANDLE_ABSPATH (gfid_path, this, + oldloc->inode->gfid); + + posix_remove_gfid2path_xattr (this, gfid_path, + oldloc->pargfid, + oldloc->name); + posix_set_gfid2path_xattr (this, gfid_path, + newloc->pargfid, + newloc->name); + } } + unlock: if (locked) { pthread_mutex_unlock (&ctx_new->pgfid_lock); @@ -2823,6 +2860,23 @@ posix_link (call_frame_t *frame, xlator_t *this, } } + if (priv->gfid2path) { + if (stbuf.ia_nlink <= MAX_GFID2PATH_LINK_SUP) { + op_ret = posix_set_gfid2path_xattr (this, real_newpath, + newloc->pargfid, + newloc->name); + if (op_ret) { + op_errno = errno; + goto out; + } + } else { + gf_msg (this->name, GF_LOG_INFO, 0, + P_MSG_XATTR_NOTSUP, "Link count exceeded. " + "gfid2path xattr not set (path:%s gfid:%s)", + real_newpath, uuid_utoa (newloc->inode->gfid)); + } + } + op_ret = 0; out: @@ -3012,6 +3066,11 @@ posix_create (call_frame_t *frame, xlator_t *this, SET_PGFID_XATTR (real_path, pgfid_xattr_key, nlink_samepgfid, XATTR_CREATE, op_ret, this, ignore); } + + if (priv->gfid2path) { + posix_set_gfid2path_xattr (this, real_path, loc->pargfid, + loc->name); + } ignore: op_ret = posix_entry_create_xattr_set (this, real_path, xdata); if (op_ret) { @@ -6918,6 +6977,9 @@ struct posix_private *priv = NULL; GF_OPTION_RECONF ("update-link-count-parent", priv->update_pgfid_nlinks, options, bool, out); + GF_OPTION_RECONF ("gfid2path", priv->gfid2path, + options, bool, out); + GF_OPTION_RECONF ("node-uuid-pathinfo", priv->node_uuid_pathinfo, options, bool, out); @@ -7396,6 +7458,18 @@ init (xlator_t *this) " set."); } + tmp_data = dict_get (this->options, "gfid2path"); + if (tmp_data) { + if (gf_string2boolean (tmp_data->data, + &_private->gfid2path) == -1) { + ret = -1; + gf_msg (this->name, GF_LOG_ERROR, 0, + P_MSG_INVALID_OPTION, "wrong value provided " + "for 'gfid2path'"); + goto out; + } + } + ret = dict_get_str (this->options, "glusterd-uuid", &guuid); if (!ret) { if (gf_uuid_parse (guuid, _private->glusterd_uuid)) @@ -7728,6 +7802,11 @@ struct volume_options options[] = { .default_value = "off", .description = "Enable placeholders for gfid to path conversion" }, + { .key = {"gfid2path"}, + .type = GF_OPTION_TYPE_BOOL, + .default_value = "off", + .description = "Enable logging metadata for gfid to path conversion" + }, #if GF_DARWIN_HOST_OS { .key = {"xattr-user-namespace-mode"}, .type = GF_OPTION_TYPE_STR, |