diff options
Diffstat (limited to 'xlators/performance/quick-read/src/quick-read.c')
| -rw-r--r-- | xlators/performance/quick-read/src/quick-read.c | 137 | 
1 files changed, 137 insertions, 0 deletions
diff --git a/xlators/performance/quick-read/src/quick-read.c b/xlators/performance/quick-read/src/quick-read.c index 4e85e6f377f..0e1ef147bfc 100644 --- a/xlators/performance/quick-read/src/quick-read.c +++ b/xlators/performance/quick-read/src/quick-read.c @@ -19,6 +19,142 @@  #include "quick-read.h" +         +int32_t +qr_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +               int32_t op_ret, int32_t op_errno, inode_t *inode, +               struct stat *buf, dict_t *dict) +{ +        data_t    *content = NULL; +        qr_file_t *qr_file = NULL; +        uint64_t   value = 0; +        int        ret = -1; +        qr_conf_t *conf = NULL; + +        if ((op_ret == -1) || (dict == NULL)) { +                goto out; +        } + +        conf = this->private; + +        content = dict_get (dict, GLUSTERFS_CONTENT_KEY); +        if (content == NULL) { +                goto out; +        } + +        if (buf->st_size > conf->max_file_size) { +                goto out; +        } + +        if (S_ISDIR (buf->st_mode)) { +                goto out; +        } + +        ret = inode_ctx_get (inode, this, &value); +        if (ret == -1) { +                qr_file = CALLOC (1, sizeof (*qr_file)); +                if (qr_file == NULL) { +                        op_ret = -1; +                        op_errno = ENOMEM; +                        goto out; +                } +                 +                LOCK_INIT (&qr_file->lock); +                inode_ctx_put (inode, this, (uint64_t)(long)qr_file); +        } else { +                qr_file = (qr_file_t *)(long)value; +                if (qr_file == NULL) { +                        op_ret = -1; +                        op_errno = EINVAL; +                        goto out; +                } +        } + +        LOCK (&qr_file->lock); +        { +                if (qr_file->xattr) { +                        dict_unref (qr_file->xattr); +                        qr_file->xattr = NULL; +                } + +                qr_file->xattr = dict_ref (dict); +                qr_file->stbuf = *buf; +                gettimeofday (&qr_file->tv, NULL); +        } +        UNLOCK (&qr_file->lock); + +out: +	STACK_UNWIND (frame, op_ret, op_errno, inode, buf, dict); +        return 0; +} + + +int32_t +qr_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr_req) +{ +        qr_conf_t *conf = NULL; +        dict_t    *new_req_dict = NULL; +        int32_t    op_ret = -1, op_errno = -1; +        data_t    *content = NULL;  +        uint64_t   requested_size = 0, size = 0;  + +        conf = this->private; +        if (conf == NULL) { +                op_ret = -1; +                op_errno = EINVAL; +                goto unwind; +        } + +        if ((xattr_req == NULL) && (conf->max_file_size > 0)) { +                new_req_dict = xattr_req = dict_new (); +                if (xattr_req == NULL) { +                        op_ret = -1; +                        op_errno = ENOMEM; +                        gf_log (this->name, GF_LOG_ERROR, "out of memory"); +                        goto unwind; +                } +        } + +        if (xattr_req) { +                content = dict_get (xattr_req, GLUSTERFS_CONTENT_KEY); +                if (content) { +                        requested_size = data_to_uint64 (content); +                } +        } + +        if (((conf->max_file_size > 0) && (content == NULL)) +            || (conf->max_file_size != requested_size)) { +                size = (conf->max_file_size > requested_size) ? +                        conf->max_file_size : requested_size; + +                op_ret = dict_set (xattr_req, GLUSTERFS_CONTENT_KEY, +                                   data_from_uint64 (size)); +                if (op_ret < 0) { +                        op_ret = -1; +                        op_errno = ENOMEM; +                        goto unwind; +                } +        } + +	STACK_WIND (frame, qr_lookup_cbk, FIRST_CHILD(this), +                    FIRST_CHILD(this)->fops->lookup, loc, xattr_req); + +        if (new_req_dict) { +                dict_unref (new_req_dict); +        } + +        return 0; + +unwind: +        STACK_UNWIND (frame, op_ret, op_errno, NULL, NULL, NULL); + +        if (new_req_dict) { +                dict_unref (new_req_dict); +        } + +        return 0; +} +  int32_t   init (xlator_t *this) @@ -92,6 +228,7 @@ fini (xlator_t *this)  struct xlator_fops fops = { +	.lookup      = qr_lookup,  };  | 
