diff options
Diffstat (limited to 'xlators/performance/symlink-cache/src/symlink-cache.c')
-rw-r--r-- | xlators/performance/symlink-cache/src/symlink-cache.c | 508 |
1 files changed, 232 insertions, 276 deletions
diff --git a/xlators/performance/symlink-cache/src/symlink-cache.c b/xlators/performance/symlink-cache/src/symlink-cache.c index 596b4c53b7b..2a686dcb87e 100644 --- a/xlators/performance/symlink-cache/src/symlink-cache.c +++ b/xlators/performance/symlink-cache/src/symlink-cache.c @@ -8,7 +8,6 @@ cases as published by the Free Software Foundation. */ - #include "glusterfs.h" #include "logging.h" #include "dict.h" @@ -20,383 +19,340 @@ #include "symlink-cache-messages.h" struct symlink_cache { - time_t ctime; - char *readlink; + time_t ctime; + char *readlink; }; - static int -symlink_inode_ctx_get (inode_t *inode, xlator_t *this, void **ctx) +symlink_inode_ctx_get(inode_t *inode, xlator_t *this, void **ctx) { - int ret = 0; - uint64_t tmp_ctx = 0; - ret = inode_ctx_get (inode, this, &tmp_ctx); - if (-1 == ret) - gf_msg (this->name, GF_LOG_ERROR, EINVAL, - SYMLINK_CACHE_MSG_DICT_GET_FAILED, "dict get failed"); - else - *ctx = (void *)(long)tmp_ctx; - - return 0; + int ret = 0; + uint64_t tmp_ctx = 0; + ret = inode_ctx_get(inode, this, &tmp_ctx); + if (-1 == ret) + gf_msg(this->name, GF_LOG_ERROR, EINVAL, + SYMLINK_CACHE_MSG_DICT_GET_FAILED, "dict get failed"); + else + *ctx = (void *)(long)tmp_ctx; + + return 0; } - static int -symlink_inode_ctx_set (inode_t *inode, xlator_t *this, void *ctx) +symlink_inode_ctx_set(inode_t *inode, xlator_t *this, void *ctx) { - int ret = 0; - ret = inode_ctx_put (inode, this, (uint64_t)(long) ctx); - if (-1 == ret) - gf_msg (this->name, GF_LOG_ERROR, EINVAL, - SYMLINK_CACHE_MSG_DICT_SET_FAILED, "dict set failed"); + int ret = 0; + ret = inode_ctx_put(inode, this, (uint64_t)(long)ctx); + if (-1 == ret) + gf_msg(this->name, GF_LOG_ERROR, EINVAL, + SYMLINK_CACHE_MSG_DICT_SET_FAILED, "dict set failed"); - return 0; + return 0; } - int -sc_cache_update (xlator_t *this, inode_t *inode, const char *link) +sc_cache_update(xlator_t *this, inode_t *inode, const char *link) { - struct symlink_cache *sc = NULL; + struct symlink_cache *sc = NULL; - symlink_inode_ctx_get (inode, this, VOID(&sc)); - if (!sc) - return 0; - - if (!sc->readlink) { - gf_msg_debug (this->name, 0, - "updating cache: %s", link); + symlink_inode_ctx_get(inode, this, VOID(&sc)); + if (!sc) + return 0; - sc->readlink = strdup (link); - } else - gf_msg_debug (this->name, 0, - "not updating existing cache: %s with %s", - sc->readlink, link); + if (!sc->readlink) { + gf_msg_debug(this->name, 0, "updating cache: %s", link); + sc->readlink = strdup(link); + } else + gf_msg_debug(this->name, 0, "not updating existing cache: %s with %s", + sc->readlink, link); - return 0; + return 0; } - int -sc_cache_set (xlator_t *this, inode_t *inode, struct iatt *buf, - const char *link) +sc_cache_set(xlator_t *this, inode_t *inode, struct iatt *buf, const char *link) { - struct symlink_cache *sc = NULL; - int ret = -1; - int need_set = 0; - - - symlink_inode_ctx_get (inode, this, VOID(&sc)); - if (!sc) { - need_set = 1; - sc = CALLOC (1, sizeof (*sc)); - if (!sc) { - gf_msg (this->name, GF_LOG_ERROR, ENOMEM, - SYMLINK_CACHE_MSG_NO_MEMORY, - "out of memory :("); - goto err; - } - } - - if (sc->readlink) { - gf_msg_debug (this->name, 0, - "replacing old cache: %s with new cache: %s", - sc->readlink, link); - FREE (sc->readlink); - sc->readlink = NULL; - } - - if (link) { - sc->readlink = strdup (link); - if (!sc->readlink) { - gf_msg (this->name, GF_LOG_ERROR, ENOMEM, - SYMLINK_CACHE_MSG_NO_MEMORY, - "out of memory :("); - goto err; - } - } - - sc->ctime = buf->ia_ctime; - - gf_msg_debug (this->name, 0, - "setting symlink cache: %s", link); - - if (need_set) { - ret = symlink_inode_ctx_set (inode, this, sc); - - if (ret < 0) { - gf_msg (this->name, GF_LOG_ERROR, - -ret, SYMLINK_CACHE_MSG_NO_MEMORY, - "could not set inode context "); - goto err; - } - } - - return 0; + struct symlink_cache *sc = NULL; + int ret = -1; + int need_set = 0; + + symlink_inode_ctx_get(inode, this, VOID(&sc)); + if (!sc) { + need_set = 1; + sc = CALLOC(1, sizeof(*sc)); + if (!sc) { + gf_msg(this->name, GF_LOG_ERROR, ENOMEM, + SYMLINK_CACHE_MSG_NO_MEMORY, "out of memory :("); + goto err; + } + } + + if (sc->readlink) { + gf_msg_debug(this->name, 0, + "replacing old cache: %s with new cache: %s", sc->readlink, + link); + FREE(sc->readlink); + sc->readlink = NULL; + } + + if (link) { + sc->readlink = strdup(link); + if (!sc->readlink) { + gf_msg(this->name, GF_LOG_ERROR, ENOMEM, + SYMLINK_CACHE_MSG_NO_MEMORY, "out of memory :("); + goto err; + } + } + + sc->ctime = buf->ia_ctime; + + gf_msg_debug(this->name, 0, "setting symlink cache: %s", link); + + if (need_set) { + ret = symlink_inode_ctx_set(inode, this, sc); + + if (ret < 0) { + gf_msg(this->name, GF_LOG_ERROR, -ret, SYMLINK_CACHE_MSG_NO_MEMORY, + "could not set inode context "); + goto err; + } + } + + return 0; err: - if (sc) { - FREE (sc->readlink); - sc->readlink = NULL; - FREE (sc); - } + if (sc) { + FREE(sc->readlink); + sc->readlink = NULL; + FREE(sc); + } - return -1; + return -1; } - int -sc_cache_flush (xlator_t *this, inode_t *inode) +sc_cache_flush(xlator_t *this, inode_t *inode) { - struct symlink_cache *sc = NULL; + struct symlink_cache *sc = NULL; - symlink_inode_ctx_get (inode, this, VOID(&sc)); - if (!sc) - return 0; + symlink_inode_ctx_get(inode, this, VOID(&sc)); + if (!sc) + return 0; - if (sc->readlink) { - gf_msg_debug (this->name, 0, - "flushing cache: %s", sc->readlink); + if (sc->readlink) { + gf_msg_debug(this->name, 0, "flushing cache: %s", sc->readlink); - FREE (sc->readlink); - sc->readlink = NULL; - } + FREE(sc->readlink); + sc->readlink = NULL; + } - FREE (sc); + FREE(sc); - return 0; + return 0; } - int -sc_cache_validate (xlator_t *this, inode_t *inode, struct iatt *buf) +sc_cache_validate(xlator_t *this, inode_t *inode, struct iatt *buf) { - struct symlink_cache *sc = NULL; - uint64_t tmp_sc = 0; + struct symlink_cache *sc = NULL; + uint64_t tmp_sc = 0; - if (!IA_ISLNK (buf->ia_type)) { - sc_cache_flush (this, inode); - return 0; - } + if (!IA_ISLNK(buf->ia_type)) { + sc_cache_flush(this, inode); + return 0; + } - symlink_inode_ctx_get (inode, this, VOID(&sc)); + symlink_inode_ctx_get(inode, this, VOID(&sc)); - if (!sc) { - sc_cache_set (this, inode, buf, NULL); - inode_ctx_get (inode, this, &tmp_sc); + if (!sc) { + sc_cache_set(this, inode, buf, NULL); + inode_ctx_get(inode, this, &tmp_sc); - if (!tmp_sc) { - gf_msg (this->name, GF_LOG_ERROR, 0, - SYMLINK_CACHE_MSG_NO_MEMORY, - "out of memory :("); - return 0; - } - sc = (struct symlink_cache *)(long)tmp_sc; - } + if (!tmp_sc) { + gf_msg(this->name, GF_LOG_ERROR, 0, SYMLINK_CACHE_MSG_NO_MEMORY, + "out of memory :("); + return 0; + } + sc = (struct symlink_cache *)(long)tmp_sc; + } - if (sc->ctime == buf->ia_ctime) - return 0; + if (sc->ctime == buf->ia_ctime) + return 0; - /* STALE */ - if (sc->readlink) { - gf_msg_debug (this->name, 0, - "flushing cache: %s", sc->readlink); + /* STALE */ + if (sc->readlink) { + gf_msg_debug(this->name, 0, "flushing cache: %s", sc->readlink); - FREE (sc->readlink); - sc->readlink = NULL; - } + FREE(sc->readlink); + sc->readlink = NULL; + } - sc->ctime = buf->ia_ctime; + sc->ctime = buf->ia_ctime; - return 0; + return 0; } - - int -sc_cache_get (xlator_t *this, inode_t *inode, char **link) +sc_cache_get(xlator_t *this, inode_t *inode, char **link) { - struct symlink_cache *sc = NULL; + struct symlink_cache *sc = NULL; - symlink_inode_ctx_get (inode, this, VOID(&sc)); + symlink_inode_ctx_get(inode, this, VOID(&sc)); - if (!sc) - return 0; + if (!sc) + return 0; - if (link && sc->readlink) - *link = strdup (sc->readlink); - return 0; + if (link && sc->readlink) + *link = strdup(sc->readlink); + return 0; } - int -sc_readlink_cbk (call_frame_t *frame, void *cookie, - xlator_t *this, int op_ret, int op_errno, - const char *link, struct iatt *sbuf, dict_t *xdata) +sc_readlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, + int op_errno, const char *link, struct iatt *sbuf, + dict_t *xdata) { - if (op_ret > 0) - sc_cache_update (this, frame->local, link); + if (op_ret > 0) + sc_cache_update(this, frame->local, link); - inode_unref (frame->local); - frame->local = NULL; + inode_unref(frame->local); + frame->local = NULL; - STACK_UNWIND_STRICT (readlink, frame, op_ret, op_errno, link, sbuf, - xdata); - return 0; + STACK_UNWIND_STRICT(readlink, frame, op_ret, op_errno, link, sbuf, xdata); + return 0; } - int -sc_readlink (call_frame_t *frame, xlator_t *this, - loc_t *loc, size_t size, dict_t *xdata) +sc_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size, + dict_t *xdata) { - char *link = NULL; - struct iatt buf = {0, }; - - sc_cache_get (this, loc->inode, &link); - - if (link) { - /* cache hit */ - gf_msg_debug (this->name, 0, - "cache hit %s -> %s", - loc->path, link); - - /* - libglusterfsclient, nfs or any other translators - using buf in readlink_cbk should be aware that @buf - is 0 filled - */ - STACK_UNWIND_STRICT (readlink, frame, strlen (link), 0, link, - &buf, NULL); - FREE (link); - return 0; - } - - frame->local = inode_ref (loc->inode); - - STACK_WIND (frame, sc_readlink_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->readlink, - loc, size, xdata); - - return 0; -} + char *link = NULL; + struct iatt buf = { + 0, + }; + + sc_cache_get(this, loc->inode, &link); + + if (link) { + /* cache hit */ + gf_msg_debug(this->name, 0, "cache hit %s -> %s", loc->path, link); + + /* + libglusterfsclient, nfs or any other translators + using buf in readlink_cbk should be aware that @buf + is 0 filled + */ + STACK_UNWIND_STRICT(readlink, frame, strlen(link), 0, link, &buf, NULL); + FREE(link); + return 0; + } + + frame->local = inode_ref(loc->inode); + STACK_WIND(frame, sc_readlink_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->readlink, loc, size, xdata); + + return 0; +} int -sc_symlink_cbk (call_frame_t *frame, void *cookie, - xlator_t *this, int op_ret, int op_errno, - inode_t *inode, struct iatt *buf, struct iatt *preparent, - struct iatt *postparent, dict_t *xdata) +sc_symlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, + int op_errno, inode_t *inode, struct iatt *buf, + struct iatt *preparent, struct iatt *postparent, dict_t *xdata) { - if (op_ret == 0) { - if (frame->local) { - sc_cache_set (this, inode, buf, frame->local); - } - } - - STACK_UNWIND_STRICT (symlink, frame, op_ret, op_errno, inode, buf, - preparent, postparent, xdata); - return 0; -} + if (op_ret == 0) { + if (frame->local) { + sc_cache_set(this, inode, buf, frame->local); + } + } + STACK_UNWIND_STRICT(symlink, frame, op_ret, op_errno, inode, buf, preparent, + postparent, xdata); + return 0; +} int -sc_symlink (call_frame_t *frame, xlator_t *this, - const char *dst, loc_t *src, mode_t umask, dict_t *xdata) +sc_symlink(call_frame_t *frame, xlator_t *this, const char *dst, loc_t *src, + mode_t umask, dict_t *xdata) { - frame->local = strdup (dst); + frame->local = strdup(dst); - STACK_WIND (frame, sc_symlink_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->symlink, - dst, src, umask, xdata); + STACK_WIND(frame, sc_symlink_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->symlink, dst, src, umask, xdata); - return 0; + return 0; } - int -sc_lookup_cbk (call_frame_t *frame, void *cookie, - xlator_t *this, int op_ret, int op_errno, - inode_t *inode, struct iatt *buf, dict_t *xdata, - struct iatt *postparent) +sc_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, + int op_errno, inode_t *inode, struct iatt *buf, dict_t *xdata, + struct iatt *postparent) { - if (op_ret == 0) - sc_cache_validate (this, inode, buf); - else - sc_cache_flush (this, inode); - - STACK_UNWIND_STRICT (lookup, frame, op_ret, op_errno, inode, buf, - xdata, postparent); - return 0; + if (op_ret == 0) + sc_cache_validate(this, inode, buf); + else + sc_cache_flush(this, inode); + + STACK_UNWIND_STRICT(lookup, frame, op_ret, op_errno, inode, buf, xdata, + postparent); + return 0; } - int -sc_lookup (call_frame_t *frame, xlator_t *this, - loc_t *loc, dict_t *xdata) +sc_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) { - STACK_WIND (frame, sc_lookup_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->lookup, - loc, xdata); + STACK_WIND(frame, sc_lookup_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->lookup, loc, xdata); - return 0; + return 0; } - int -sc_forget (xlator_t *this, - inode_t *inode) +sc_forget(xlator_t *this, inode_t *inode) { - sc_cache_flush (this, inode); + sc_cache_flush(this, inode); - return 0; + return 0; } - int32_t -init (xlator_t *this) +init(xlator_t *this) { - if (!this->children || this->children->next) - { - gf_msg (this->name, GF_LOG_ERROR, 0, - SYMLINK_CACHE_MSG_XLATOR_CHILD_MISCONFIGURED, - "FATAL: volume (%s) not configured with exactly one " - "child", this->name); - return -1; - } - - if (!this->parents) { - gf_msg (this->name, GF_LOG_WARNING, 0, - SYMLINK_CACHE_MSG_VOL_MISCONFIGURED, - "dangling volume. check volfile "); - } - - return 0; + if (!this->children || this->children->next) { + gf_msg(this->name, GF_LOG_ERROR, 0, + SYMLINK_CACHE_MSG_XLATOR_CHILD_MISCONFIGURED, + "FATAL: volume (%s) not configured with exactly one " + "child", + this->name); + return -1; + } + + if (!this->parents) { + gf_msg(this->name, GF_LOG_WARNING, 0, + SYMLINK_CACHE_MSG_VOL_MISCONFIGURED, + "dangling volume. check volfile "); + } + + return 0; } - void -fini (xlator_t *this) +fini(xlator_t *this) { - return; + return; } - struct xlator_fops fops = { - .lookup = sc_lookup, - .symlink = sc_symlink, - .readlink = sc_readlink, + .lookup = sc_lookup, + .symlink = sc_symlink, + .readlink = sc_readlink, }; - struct xlator_cbks cbks = { - .forget = sc_forget, + .forget = sc_forget, }; struct volume_options options[] = { - { .key = {NULL} }, + {.key = {NULL}}, }; |