diff options
Diffstat (limited to 'xlators/performance/quick-read/src/quick-read.c')
-rw-r--r-- | xlators/performance/quick-read/src/quick-read.c | 2372 |
1 files changed, 1157 insertions, 1215 deletions
diff --git a/xlators/performance/quick-read/src/quick-read.c b/xlators/performance/quick-read/src/quick-read.c index 720c0c4e3b9..39ce428104b 100644 --- a/xlators/performance/quick-read/src/quick-read.c +++ b/xlators/performance/quick-read/src/quick-read.c @@ -16,1691 +16,1633 @@ #include "atomic.h" typedef struct qr_local { - inode_t *inode; - uint64_t incident_gen; - fd_t *fd; + inode_t *inode; + uint64_t incident_gen; + fd_t *fd; } qr_local_t; qr_inode_t * -qr_inode_ctx_get (xlator_t *this, inode_t *inode); +qr_inode_ctx_get(xlator_t *this, inode_t *inode); void -__qr_inode_prune_data (xlator_t *this, qr_inode_table_t *table, - qr_inode_t *qr_inode); +__qr_inode_prune_data(xlator_t *this, qr_inode_table_t *table, + qr_inode_t *qr_inode); void -qr_local_wipe (qr_local_t *local) +qr_local_wipe(qr_local_t *local) { - if (!local) - goto out; + if (!local) + goto out; - if (local->inode) - inode_unref (local->inode); + if (local->inode) + inode_unref(local->inode); - if (local->fd) - fd_unref (local->fd); + if (local->fd) + fd_unref(local->fd); - GF_FREE (local); + GF_FREE(local); out: - return; + return; } uint64_t -__qr_get_generation (xlator_t *this, qr_inode_t *qr_inode) +__qr_get_generation(xlator_t *this, qr_inode_t *qr_inode) { - uint64_t gen = 0, rollover; - qr_private_t *priv = NULL; - qr_inode_table_t *table = NULL; - - priv = this->private; - table = &priv->table; - - gen = GF_ATOMIC_INC (priv->generation); - if (gen == 0) { - qr_inode->gen_rollover = !qr_inode->gen_rollover; - gen = GF_ATOMIC_INC (priv->generation); - __qr_inode_prune_data (this, table, qr_inode); - qr_inode->gen = qr_inode->invalidation_time = gen - 1; - } - - rollover = qr_inode->gen_rollover; - gen |= (rollover << 32); - return gen; + uint64_t gen = 0, rollover; + qr_private_t *priv = NULL; + qr_inode_table_t *table = NULL; + + priv = this->private; + table = &priv->table; + + gen = GF_ATOMIC_INC(priv->generation); + if (gen == 0) { + qr_inode->gen_rollover = !qr_inode->gen_rollover; + gen = GF_ATOMIC_INC(priv->generation); + __qr_inode_prune_data(this, table, qr_inode); + qr_inode->gen = qr_inode->invalidation_time = gen - 1; + } + + rollover = qr_inode->gen_rollover; + gen |= (rollover << 32); + return gen; } uint64_t -qr_get_generation (xlator_t *this, inode_t *inode) +qr_get_generation(xlator_t *this, inode_t *inode) { - qr_inode_t *qr_inode = NULL; - uint64_t gen = 0; - qr_inode_table_t *table = NULL; - qr_private_t *priv = NULL; - - priv = this->private; - table = &priv->table; - - qr_inode = qr_inode_ctx_get (this, inode); - - if (qr_inode) { - LOCK (&table->lock); - { - gen = __qr_get_generation (this, qr_inode); - } - UNLOCK (&table->lock); - } else { - gen = GF_ATOMIC_INC (priv->generation); - if (gen == 0) { - gen = GF_ATOMIC_INC (priv->generation); - } + qr_inode_t *qr_inode = NULL; + uint64_t gen = 0; + qr_inode_table_t *table = NULL; + qr_private_t *priv = NULL; + + priv = this->private; + table = &priv->table; + + qr_inode = qr_inode_ctx_get(this, inode); + + if (qr_inode) { + LOCK(&table->lock); + { + gen = __qr_get_generation(this, qr_inode); } + UNLOCK(&table->lock); + } else { + gen = GF_ATOMIC_INC(priv->generation); + if (gen == 0) { + gen = GF_ATOMIC_INC(priv->generation); + } + } - return gen; + return gen; } qr_local_t * -qr_local_get (xlator_t *this, inode_t *inode) +qr_local_get(xlator_t *this, inode_t *inode) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = GF_CALLOC (1, sizeof (*local), gf_common_mt_char); - if (!local) - goto out; + local = GF_CALLOC(1, sizeof(*local), gf_common_mt_char); + if (!local) + goto out; - local->incident_gen = qr_get_generation (this, inode); + local->incident_gen = qr_get_generation(this, inode); out: - return local; + return local; } -#define QR_STACK_UNWIND(fop, frame, params ...) do { \ - qr_local_t *__local = NULL; \ - if (frame) { \ - __local = frame->local; \ - frame->local = NULL; \ - } \ - STACK_UNWIND_STRICT (fop, frame, params); \ - qr_local_wipe (__local); \ - } while (0) - - +#define QR_STACK_UNWIND(fop, frame, params...) \ + do { \ + qr_local_t *__local = NULL; \ + if (frame) { \ + __local = frame->local; \ + frame->local = NULL; \ + } \ + STACK_UNWIND_STRICT(fop, frame, params); \ + qr_local_wipe(__local); \ + } while (0) -void __qr_inode_prune (xlator_t *this, qr_inode_table_t *table, - qr_inode_t *qr_inode, uint64_t gen); +void +__qr_inode_prune(xlator_t *this, qr_inode_table_t *table, qr_inode_t *qr_inode, + uint64_t gen); int -__qr_inode_ctx_set (xlator_t *this, inode_t *inode, qr_inode_t *qr_inode) +__qr_inode_ctx_set(xlator_t *this, inode_t *inode, qr_inode_t *qr_inode) { - uint64_t value = 0; - int ret = -1; + uint64_t value = 0; + int ret = -1; - value = (long) qr_inode; + value = (long)qr_inode; - ret = __inode_ctx_set (inode, this, &value); + ret = __inode_ctx_set(inode, this, &value); - return ret; + return ret; } - qr_inode_t * -__qr_inode_ctx_get (xlator_t *this, inode_t *inode) +__qr_inode_ctx_get(xlator_t *this, inode_t *inode) { - qr_inode_t *qr_inode = NULL; - uint64_t value = 0; - int ret = -1; + qr_inode_t *qr_inode = NULL; + uint64_t value = 0; + int ret = -1; - ret = __inode_ctx_get (inode, this, &value); - if (ret) - return NULL; + ret = __inode_ctx_get(inode, this, &value); + if (ret) + return NULL; - qr_inode = (void *) ((long) value); + qr_inode = (void *)((long)value); - return qr_inode; + return qr_inode; } - qr_inode_t * -qr_inode_ctx_get (xlator_t *this, inode_t *inode) +qr_inode_ctx_get(xlator_t *this, inode_t *inode) { - qr_inode_t *qr_inode = NULL; + qr_inode_t *qr_inode = NULL; - if (inode == NULL) - goto out; + if (inode == NULL) + goto out; - LOCK (&inode->lock); - { - qr_inode = __qr_inode_ctx_get (this, inode); - } - UNLOCK (&inode->lock); + LOCK(&inode->lock); + { + qr_inode = __qr_inode_ctx_get(this, inode); + } + UNLOCK(&inode->lock); out: - return qr_inode; + return qr_inode; } - qr_inode_t * -qr_inode_new (xlator_t *this, inode_t *inode) +qr_inode_new(xlator_t *this, inode_t *inode) { - qr_inode_t *qr_inode = NULL; + qr_inode_t *qr_inode = NULL; - qr_inode = GF_CALLOC (1, sizeof (*qr_inode), gf_qr_mt_qr_inode_t); - if (!qr_inode) - return NULL; + qr_inode = GF_CALLOC(1, sizeof(*qr_inode), gf_qr_mt_qr_inode_t); + if (!qr_inode) + return NULL; - INIT_LIST_HEAD (&qr_inode->lru); + INIT_LIST_HEAD(&qr_inode->lru); - qr_inode->priority = 0; /* initial priority */ + qr_inode->priority = 0; /* initial priority */ - return qr_inode; + return qr_inode; } - qr_inode_t * -qr_inode_ctx_get_or_new (xlator_t *this, inode_t *inode) +qr_inode_ctx_get_or_new(xlator_t *this, inode_t *inode) { - qr_inode_t *qr_inode = NULL; - int ret = -1; - qr_private_t *priv = NULL; - - priv = this->private; - - LOCK (&inode->lock); - { - qr_inode = __qr_inode_ctx_get (this, inode); - if (qr_inode) - goto unlock; - - qr_inode = qr_inode_new (this, inode); - if (!qr_inode) - goto unlock; - - ret = __qr_inode_ctx_set (this, inode, qr_inode); - if (ret) { - __qr_inode_prune (this, &priv->table, qr_inode, 0); - GF_FREE (qr_inode); - qr_inode = NULL; - } - } + qr_inode_t *qr_inode = NULL; + int ret = -1; + qr_private_t *priv = NULL; + + priv = this->private; + + LOCK(&inode->lock); + { + qr_inode = __qr_inode_ctx_get(this, inode); + if (qr_inode) + goto unlock; + + qr_inode = qr_inode_new(this, inode); + if (!qr_inode) + goto unlock; + + ret = __qr_inode_ctx_set(this, inode, qr_inode); + if (ret) { + __qr_inode_prune(this, &priv->table, qr_inode, 0); + GF_FREE(qr_inode); + qr_inode = NULL; + } + } unlock: - UNLOCK (&inode->lock); + UNLOCK(&inode->lock); - return qr_inode; + return qr_inode; } - uint32_t -qr_get_priority (qr_conf_t *conf, const char *path) +qr_get_priority(qr_conf_t *conf, const char *path) { - uint32_t priority = 0; - struct qr_priority *curr = NULL; + uint32_t priority = 0; + struct qr_priority *curr = NULL; - list_for_each_entry (curr, &conf->priority_list, list) { - if (fnmatch (curr->pattern, path, FNM_NOESCAPE) == 0) - priority = curr->priority; - } + list_for_each_entry(curr, &conf->priority_list, list) + { + if (fnmatch(curr->pattern, path, FNM_NOESCAPE) == 0) + priority = curr->priority; + } - return priority; + return priority; } - void -__qr_inode_register (xlator_t *this, qr_inode_table_t *table, - qr_inode_t *qr_inode) +__qr_inode_register(xlator_t *this, qr_inode_table_t *table, + qr_inode_t *qr_inode) { - qr_private_t *priv = NULL; + qr_private_t *priv = NULL; - if (!qr_inode->data) - return; + if (!qr_inode->data) + return; - priv = this->private; - if (!priv) - return; + priv = this->private; + if (!priv) + return; - if (list_empty (&qr_inode->lru)) - /* first time addition of this qr_inode into table */ - table->cache_used += qr_inode->size; - else - list_del_init (&qr_inode->lru); + if (list_empty(&qr_inode->lru)) + /* first time addition of this qr_inode into table */ + table->cache_used += qr_inode->size; + else + list_del_init(&qr_inode->lru); - list_add_tail (&qr_inode->lru, &table->lru[qr_inode->priority]); + list_add_tail(&qr_inode->lru, &table->lru[qr_inode->priority]); - GF_ATOMIC_INC (priv->qr_counter.files_cached); + GF_ATOMIC_INC(priv->qr_counter.files_cached); - return; + return; } - void -qr_inode_set_priority (xlator_t *this, inode_t *inode, const char *path) +qr_inode_set_priority(xlator_t *this, inode_t *inode, const char *path) { - uint32_t priority = 0; - qr_inode_table_t *table = NULL; - qr_inode_t *qr_inode = NULL; - qr_private_t *priv = NULL; - qr_conf_t *conf = NULL; - - qr_inode = qr_inode_ctx_get (this, inode); - if (!qr_inode) - return; - - priv = this->private; - table = &priv->table; - conf = &priv->conf; - - if (path) - priority = qr_get_priority (conf, path); - else - /* retain existing priority, just bump LRU */ - priority = qr_inode->priority; - - LOCK (&table->lock); - { - qr_inode->priority = priority; - - __qr_inode_register (this, table, qr_inode); - } - UNLOCK (&table->lock); + uint32_t priority = 0; + qr_inode_table_t *table = NULL; + qr_inode_t *qr_inode = NULL; + qr_private_t *priv = NULL; + qr_conf_t *conf = NULL; + + qr_inode = qr_inode_ctx_get(this, inode); + if (!qr_inode) + return; + + priv = this->private; + table = &priv->table; + conf = &priv->conf; + + if (path) + priority = qr_get_priority(conf, path); + else + /* retain existing priority, just bump LRU */ + priority = qr_inode->priority; + + LOCK(&table->lock); + { + qr_inode->priority = priority; + + __qr_inode_register(this, table, qr_inode); + } + UNLOCK(&table->lock); } void -__qr_inode_prune_data (xlator_t *this, qr_inode_table_t *table, - qr_inode_t *qr_inode) +__qr_inode_prune_data(xlator_t *this, qr_inode_table_t *table, + qr_inode_t *qr_inode) { - qr_private_t *priv = NULL; - - priv = this->private; + qr_private_t *priv = NULL; - GF_FREE (qr_inode->data); - qr_inode->data = NULL; + priv = this->private; - if (!list_empty (&qr_inode->lru)) { - table->cache_used -= qr_inode->size; - qr_inode->size = 0; + GF_FREE(qr_inode->data); + qr_inode->data = NULL; - list_del_init (&qr_inode->lru); + if (!list_empty(&qr_inode->lru)) { + table->cache_used -= qr_inode->size; + qr_inode->size = 0; - GF_ATOMIC_DEC (priv->qr_counter.files_cached); - } + list_del_init(&qr_inode->lru); - memset (&qr_inode->buf, 0, sizeof (qr_inode->buf)); + GF_ATOMIC_DEC(priv->qr_counter.files_cached); + } + memset(&qr_inode->buf, 0, sizeof(qr_inode->buf)); } /* To be called with priv->table.lock held */ void -__qr_inode_prune (xlator_t *this, qr_inode_table_t *table, qr_inode_t *qr_inode, - uint64_t gen) +__qr_inode_prune(xlator_t *this, qr_inode_table_t *table, qr_inode_t *qr_inode, + uint64_t gen) { - __qr_inode_prune_data (this, table, qr_inode); - if (gen) - qr_inode->gen = gen; - qr_inode->invalidation_time = __qr_get_generation (this, qr_inode); + __qr_inode_prune_data(this, table, qr_inode); + if (gen) + qr_inode->gen = gen; + qr_inode->invalidation_time = __qr_get_generation(this, qr_inode); } - void -qr_inode_prune (xlator_t *this, inode_t *inode, uint64_t gen) +qr_inode_prune(xlator_t *this, inode_t *inode, uint64_t gen) { - qr_private_t *priv = NULL; - qr_inode_table_t *table = NULL; - qr_inode_t *qr_inode = NULL; - - qr_inode = qr_inode_ctx_get (this, inode); - if (!qr_inode) - return; - - priv = this->private; - table = &priv->table; - - LOCK (&table->lock); - { - __qr_inode_prune (this, table, qr_inode, gen); - } - UNLOCK (&table->lock); -} + qr_private_t *priv = NULL; + qr_inode_table_t *table = NULL; + qr_inode_t *qr_inode = NULL; + + qr_inode = qr_inode_ctx_get(this, inode); + if (!qr_inode) + return; + priv = this->private; + table = &priv->table; + + LOCK(&table->lock); + { + __qr_inode_prune(this, table, qr_inode, gen); + } + UNLOCK(&table->lock); +} /* To be called with priv->table.lock held */ void -__qr_cache_prune (xlator_t *this, qr_inode_table_t *table, qr_conf_t *conf) +__qr_cache_prune(xlator_t *this, qr_inode_table_t *table, qr_conf_t *conf) { - qr_inode_t *curr = NULL; - qr_inode_t *next = NULL; - int index = 0; - size_t size_pruned = 0; - - for (index = 0; index < conf->max_pri; index++) { - list_for_each_entry_safe (curr, next, &table->lru[index], lru) { + qr_inode_t *curr = NULL; + qr_inode_t *next = NULL; + int index = 0; + size_t size_pruned = 0; - size_pruned += curr->size; + for (index = 0; index < conf->max_pri; index++) { + list_for_each_entry_safe(curr, next, &table->lru[index], lru) + { + size_pruned += curr->size; - __qr_inode_prune (this, table, curr, 0); + __qr_inode_prune(this, table, curr, 0); - if (table->cache_used < conf->cache_size) - return; - } + if (table->cache_used < conf->cache_size) + return; } + } - return; + return; } - void -qr_cache_prune (xlator_t *this) +qr_cache_prune(xlator_t *this) { - qr_private_t *priv = NULL; - qr_conf_t *conf = NULL; - qr_inode_table_t *table = NULL; - - priv = this->private; - table = &priv->table; - conf = &priv->conf; - - LOCK (&table->lock); - { - if (table->cache_used > conf->cache_size) - __qr_cache_prune (this, table, conf); - } - UNLOCK (&table->lock); + qr_private_t *priv = NULL; + qr_conf_t *conf = NULL; + qr_inode_table_t *table = NULL; + + priv = this->private; + table = &priv->table; + conf = &priv->conf; + + LOCK(&table->lock); + { + if (table->cache_used > conf->cache_size) + __qr_cache_prune(this, table, conf); + } + UNLOCK(&table->lock); } - void * -qr_content_extract (dict_t *xdata) +qr_content_extract(dict_t *xdata) { - data_t *data = NULL; - void *content = NULL; - int ret = 0; + data_t *data = NULL; + void *content = NULL; + int ret = 0; - ret = dict_get_with_ref (xdata, GF_CONTENT_KEY, &data); - if (ret < 0 || !data) - return NULL; + ret = dict_get_with_ref(xdata, GF_CONTENT_KEY, &data); + if (ret < 0 || !data) + return NULL; - content = GF_MALLOC (data->len, gf_qr_mt_content_t); - if (!content) - goto out; + content = GF_MALLOC(data->len, gf_qr_mt_content_t); + if (!content) + goto out; - memcpy (content, data->data, data->len); + memcpy(content, data->data, data->len); out: - data_unref (data); - return content; + data_unref(data); + return content; } - void -qr_content_update (xlator_t *this, qr_inode_t *qr_inode, void *data, - struct iatt *buf, uint64_t gen) +qr_content_update(xlator_t *this, qr_inode_t *qr_inode, void *data, + struct iatt *buf, uint64_t gen) { - qr_private_t *priv = NULL; - qr_inode_table_t *table = NULL; - uint32_t rollover = 0; + qr_private_t *priv = NULL; + qr_inode_table_t *table = NULL; + uint32_t rollover = 0; - rollover = gen >> 32; - gen = gen & 0xffffffff; + rollover = gen >> 32; + gen = gen & 0xffffffff; - priv = this->private; - table = &priv->table; + priv = this->private; + table = &priv->table; - LOCK (&table->lock); - { - if ((rollover != qr_inode->gen_rollover) || - (gen && qr_inode->gen && (qr_inode->gen >= gen))) - goto unlock; + LOCK(&table->lock); + { + if ((rollover != qr_inode->gen_rollover) || + (gen && qr_inode->gen && (qr_inode->gen >= gen))) + goto unlock; - if ((qr_inode->data == NULL) && - (qr_inode->invalidation_time >= gen)) - goto unlock; + if ((qr_inode->data == NULL) && (qr_inode->invalidation_time >= gen)) + goto unlock; - __qr_inode_prune (this, table, qr_inode, gen); + __qr_inode_prune(this, table, qr_inode, gen); - qr_inode->data = data; - data = NULL; - qr_inode->size = buf->ia_size; + qr_inode->data = data; + data = NULL; + qr_inode->size = buf->ia_size; - qr_inode->ia_mtime = buf->ia_mtime; - qr_inode->ia_mtime_nsec = buf->ia_mtime_nsec; - qr_inode->ia_ctime = buf->ia_ctime; - qr_inode->ia_ctime_nsec = buf->ia_ctime_nsec; + qr_inode->ia_mtime = buf->ia_mtime; + qr_inode->ia_mtime_nsec = buf->ia_mtime_nsec; + qr_inode->ia_ctime = buf->ia_ctime; + qr_inode->ia_ctime_nsec = buf->ia_ctime_nsec; - qr_inode->buf = *buf; + qr_inode->buf = *buf; - gettimeofday (&qr_inode->last_refresh, NULL); + gettimeofday(&qr_inode->last_refresh, NULL); - __qr_inode_register (this, table, qr_inode); - } + __qr_inode_register(this, table, qr_inode); + } unlock: - UNLOCK (&table->lock); + UNLOCK(&table->lock); - if (data) - GF_FREE (data); + if (data) + GF_FREE(data); - qr_cache_prune (this); + qr_cache_prune(this); } - gf_boolean_t -qr_size_fits (qr_conf_t *conf, struct iatt *buf) +qr_size_fits(qr_conf_t *conf, struct iatt *buf) { - return (buf->ia_size <= conf->max_file_size); + return (buf->ia_size <= conf->max_file_size); } - gf_boolean_t -qr_mtime_equal (qr_inode_t *qr_inode, struct iatt *buf) +qr_mtime_equal(qr_inode_t *qr_inode, struct iatt *buf) { - return (qr_inode->ia_mtime == buf->ia_mtime && - qr_inode->ia_mtime_nsec == buf->ia_mtime_nsec); + return (qr_inode->ia_mtime == buf->ia_mtime && + qr_inode->ia_mtime_nsec == buf->ia_mtime_nsec); } - gf_boolean_t -qr_ctime_equal (qr_inode_t *qr_inode, struct iatt *buf) +qr_ctime_equal(qr_inode_t *qr_inode, struct iatt *buf) { - return (qr_inode->ia_ctime == buf->ia_ctime && - qr_inode->ia_ctime_nsec == buf->ia_ctime_nsec); + return (qr_inode->ia_ctime == buf->ia_ctime && + qr_inode->ia_ctime_nsec == buf->ia_ctime_nsec); } - gf_boolean_t -qr_time_equal (qr_conf_t *conf, qr_inode_t *qr_inode, struct iatt *buf) +qr_time_equal(qr_conf_t *conf, qr_inode_t *qr_inode, struct iatt *buf) { - if (conf->ctime_invalidation) - return qr_ctime_equal (qr_inode, buf); - else - return qr_mtime_equal (qr_inode, buf); + if (conf->ctime_invalidation) + return qr_ctime_equal(qr_inode, buf); + else + return qr_mtime_equal(qr_inode, buf); } - void -__qr_content_refresh (xlator_t *this, qr_inode_t *qr_inode, struct iatt *buf, - uint64_t gen) +__qr_content_refresh(xlator_t *this, qr_inode_t *qr_inode, struct iatt *buf, + uint64_t gen) { - qr_private_t *priv = NULL; - qr_inode_table_t *table = NULL; - qr_conf_t *conf = NULL; - uint32_t rollover = 0; + qr_private_t *priv = NULL; + qr_inode_table_t *table = NULL; + qr_conf_t *conf = NULL; + uint32_t rollover = 0; - rollover = gen >> 32; - gen = gen & 0xffffffff; + rollover = gen >> 32; + gen = gen & 0xffffffff; - priv = this->private; - table = &priv->table; - conf = &priv->conf; + priv = this->private; + table = &priv->table; + conf = &priv->conf; - /* allow for rollover of frame->root->unique */ - if ((rollover != qr_inode->gen_rollover) || - (gen && qr_inode->gen && (qr_inode->gen >= gen))) - goto done; + /* allow for rollover of frame->root->unique */ + if ((rollover != qr_inode->gen_rollover) || + (gen && qr_inode->gen && (qr_inode->gen >= gen))) + goto done; - if ((qr_inode->data == NULL) && (qr_inode->invalidation_time >= gen)) - goto done; + if ((qr_inode->data == NULL) && (qr_inode->invalidation_time >= gen)) + goto done; - qr_inode->gen = gen; + qr_inode->gen = gen; - if (qr_size_fits (conf, buf) && qr_time_equal (conf, qr_inode, buf)) { - qr_inode->buf = *buf; + if (qr_size_fits(conf, buf) && qr_time_equal(conf, qr_inode, buf)) { + qr_inode->buf = *buf; - gettimeofday (&qr_inode->last_refresh, NULL); + gettimeofday(&qr_inode->last_refresh, NULL); - __qr_inode_register (this, table, qr_inode); - } else { - __qr_inode_prune (this, table, qr_inode, gen); - } + __qr_inode_register(this, table, qr_inode); + } else { + __qr_inode_prune(this, table, qr_inode, gen); + } done: - return; + return; } - void -qr_content_refresh (xlator_t *this, qr_inode_t *qr_inode, struct iatt *buf, - uint64_t gen) +qr_content_refresh(xlator_t *this, qr_inode_t *qr_inode, struct iatt *buf, + uint64_t gen) { - qr_private_t *priv = NULL; - qr_inode_table_t *table = NULL; + qr_private_t *priv = NULL; + qr_inode_table_t *table = NULL; - priv = this->private; - table = &priv->table; + priv = this->private; + table = &priv->table; - LOCK (&table->lock); - { - __qr_content_refresh (this, qr_inode, buf, gen); - } - UNLOCK (&table->lock); + LOCK(&table->lock); + { + __qr_content_refresh(this, qr_inode, buf, gen); + } + UNLOCK(&table->lock); } - gf_boolean_t -__qr_cache_is_fresh (xlator_t *this, qr_inode_t *qr_inode) +__qr_cache_is_fresh(xlator_t *this, qr_inode_t *qr_inode) { - qr_conf_t *conf = NULL; - qr_private_t *priv = NULL; - struct timeval now; - struct timeval diff; + qr_conf_t *conf = NULL; + qr_private_t *priv = NULL; + struct timeval now; + struct timeval diff; - priv = this->private; - conf = &priv->conf; + priv = this->private; + conf = &priv->conf; - gettimeofday (&now, NULL); + gettimeofday(&now, NULL); - timersub (&now, &qr_inode->last_refresh, &diff); + timersub(&now, &qr_inode->last_refresh, &diff); - if (qr_inode->last_refresh.tv_sec < priv->last_child_down) - return _gf_false; + if (qr_inode->last_refresh.tv_sec < priv->last_child_down) + return _gf_false; - if (diff.tv_sec >= conf->cache_timeout) - return _gf_false; + if (diff.tv_sec >= conf->cache_timeout) + return _gf_false; - return _gf_true; + return _gf_true; } - int -qr_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, inode_t *inode_ret, - struct iatt *buf, dict_t *xdata, struct iatt *postparent) +qr_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, + int32_t op_errno, inode_t *inode_ret, struct iatt *buf, + dict_t *xdata, struct iatt *postparent) { - void *content = NULL; - qr_inode_t *qr_inode = NULL; - inode_t *inode = NULL; - qr_local_t *local = NULL; - - local = frame->local; - inode = local->inode; - - if (op_ret == -1) { - qr_inode_prune (this, inode, local->incident_gen); - goto out; - } - - if (dict_get (xdata, GLUSTERFS_BAD_INODE)) { - qr_inode_prune (this, inode, local->incident_gen); - goto out; + void *content = NULL; + qr_inode_t *qr_inode = NULL; + inode_t *inode = NULL; + qr_local_t *local = NULL; + + local = frame->local; + inode = local->inode; + + if (op_ret == -1) { + qr_inode_prune(this, inode, local->incident_gen); + goto out; + } + + if (dict_get(xdata, GLUSTERFS_BAD_INODE)) { + qr_inode_prune(this, inode, local->incident_gen); + goto out; + } + + if (dict_get(xdata, "sh-failed")) { + qr_inode_prune(this, inode, local->incident_gen); + goto out; + } + + content = qr_content_extract(xdata); + + if (content) { + /* new content came along, always replace old content */ + qr_inode = qr_inode_ctx_get_or_new(this, inode); + if (!qr_inode) { + /* no harm done */ + GF_FREE(content); + goto out; } - if (dict_get (xdata, "sh-failed")) { - qr_inode_prune (this, inode, local->incident_gen); - goto out; - } - - content = qr_content_extract (xdata); - - if (content) { - /* new content came along, always replace old content */ - qr_inode = qr_inode_ctx_get_or_new (this, inode); - if (!qr_inode) { - /* no harm done */ - GF_FREE (content); - goto out; - } - - qr_content_update (this, qr_inode, content, buf, - local->incident_gen); - } else { - /* purge old content if necessary */ - qr_inode = qr_inode_ctx_get (this, inode); - if (!qr_inode) - /* usual path for large files */ - goto out; - - qr_content_refresh (this, qr_inode, buf, local->incident_gen); - } + qr_content_update(this, qr_inode, content, buf, local->incident_gen); + } else { + /* purge old content if necessary */ + qr_inode = qr_inode_ctx_get(this, inode); + if (!qr_inode) + /* usual path for large files */ + goto out; + + qr_content_refresh(this, qr_inode, buf, local->incident_gen); + } out: - QR_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode_ret, - buf, xdata, postparent); - return 0; + QR_STACK_UNWIND(lookup, frame, op_ret, op_errno, inode_ret, buf, xdata, + postparent); + return 0; } - int -qr_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) +qr_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) { - qr_private_t *priv = NULL; - qr_conf_t *conf = NULL; - qr_inode_t *qr_inode = NULL; - int ret = -1; - dict_t *new_xdata = NULL; - qr_local_t *local = NULL; - - priv = this->private; - conf = &priv->conf; - local = qr_local_get (this, loc->inode); - local->inode = inode_ref (loc->inode); - frame->local = local; - - qr_inode = qr_inode_ctx_get (this, loc->inode); - if (qr_inode && qr_inode->data) - /* cached. only validate in qr_lookup_cbk */ - goto wind; - - if (!xdata) - xdata = new_xdata = dict_new (); - - if (!xdata) - goto wind; - - ret = 0; - if (conf->max_file_size) - ret = dict_set (xdata, GF_CONTENT_KEY, - data_from_uint64 (conf->max_file_size)); - if (ret) - gf_msg (this->name, GF_LOG_WARNING, 0, - QUICK_READ_MSG_DICT_SET_FAILED, - "cannot set key in request dict (%s)", - loc->path); + qr_private_t *priv = NULL; + qr_conf_t *conf = NULL; + qr_inode_t *qr_inode = NULL; + int ret = -1; + dict_t *new_xdata = NULL; + qr_local_t *local = NULL; + + priv = this->private; + conf = &priv->conf; + local = qr_local_get(this, loc->inode); + local->inode = inode_ref(loc->inode); + frame->local = local; + + qr_inode = qr_inode_ctx_get(this, loc->inode); + if (qr_inode && qr_inode->data) + /* cached. only validate in qr_lookup_cbk */ + goto wind; + + if (!xdata) + xdata = new_xdata = dict_new(); + + if (!xdata) + goto wind; + + ret = 0; + if (conf->max_file_size) + ret = dict_set(xdata, GF_CONTENT_KEY, + data_from_uint64(conf->max_file_size)); + if (ret) + gf_msg(this->name, GF_LOG_WARNING, 0, QUICK_READ_MSG_DICT_SET_FAILED, + "cannot set key in request dict (%s)", loc->path); wind: - STACK_WIND (frame, qr_lookup_cbk, FIRST_CHILD(this), - FIRST_CHILD(this)->fops->lookup, loc, xdata); + STACK_WIND(frame, qr_lookup_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->lookup, loc, xdata); - if (new_xdata) - dict_unref (new_xdata); + if (new_xdata) + dict_unref(new_xdata); - return 0; + return 0; } - int -qr_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int op_ret, int op_errno, gf_dirent_t *entries, dict_t *xdata) +qr_readdirp_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, + int op_errno, gf_dirent_t *entries, dict_t *xdata) { - gf_dirent_t *entry = NULL; - qr_inode_t *qr_inode = NULL; - qr_local_t *local = NULL; + gf_dirent_t *entry = NULL; + qr_inode_t *qr_inode = NULL; + qr_local_t *local = NULL; - local = frame->local; + local = frame->local; - if (op_ret <= 0) - goto unwind; + if (op_ret <= 0) + goto unwind; - list_for_each_entry (entry, &entries->list, list) { - if (!entry->inode) - continue; + list_for_each_entry(entry, &entries->list, list) + { + if (!entry->inode) + continue; - qr_inode = qr_inode_ctx_get (this, entry->inode); - if (!qr_inode) - /* no harm */ - continue; + qr_inode = qr_inode_ctx_get(this, entry->inode); + if (!qr_inode) + /* no harm */ + continue; - qr_content_refresh (this, qr_inode, &entry->d_stat, - local->incident_gen); - } + qr_content_refresh(this, qr_inode, &entry->d_stat, local->incident_gen); + } unwind: - QR_STACK_UNWIND (readdirp, frame, op_ret, op_errno, entries, xdata); - return 0; + QR_STACK_UNWIND(readdirp, frame, op_ret, op_errno, entries, xdata); + return 0; } - int -qr_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, - size_t size, off_t offset, dict_t *xdata) +qr_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, + off_t offset, dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = qr_local_get (this, NULL); - frame->local = local; + local = qr_local_get(this, NULL); + frame->local = local; - STACK_WIND (frame, qr_readdirp_cbk, - FIRST_CHILD (this), FIRST_CHILD (this)->fops->readdirp, - fd, size, offset, xdata); - return 0; + STACK_WIND(frame, qr_readdirp_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->readdirp, fd, size, offset, xdata); + return 0; } - int -qr_readv_cached (call_frame_t *frame, qr_inode_t *qr_inode, size_t size, - off_t offset, uint32_t flags, dict_t *xdata) +qr_readv_cached(call_frame_t *frame, qr_inode_t *qr_inode, size_t size, + off_t offset, uint32_t flags, dict_t *xdata) { - xlator_t *this = NULL; - qr_private_t *priv = NULL; - qr_inode_table_t *table = NULL; - int op_ret = -1; - struct iobuf *iobuf = NULL; - struct iobref *iobref = NULL; - struct iovec iov = {0, }; - struct iatt buf = {0, }; - - this = frame->this; - priv = this->private; - table = &priv->table; - - LOCK (&table->lock); - { - if (!qr_inode->data) - goto unlock; - - if (offset >= qr_inode->size) - goto unlock; - - if (!__qr_cache_is_fresh (this, qr_inode)) - goto unlock; - - op_ret = min (size, (qr_inode->size - offset)); - - iobuf = iobuf_get2 (this->ctx->iobuf_pool, op_ret); - if (!iobuf) { - op_ret = -1; - goto unlock; - } + xlator_t *this = NULL; + qr_private_t *priv = NULL; + qr_inode_table_t *table = NULL; + int op_ret = -1; + struct iobuf *iobuf = NULL; + struct iobref *iobref = NULL; + struct iovec iov = { + 0, + }; + struct iatt buf = { + 0, + }; + + this = frame->this; + priv = this->private; + table = &priv->table; + + LOCK(&table->lock); + { + if (!qr_inode->data) + goto unlock; + + if (offset >= qr_inode->size) + goto unlock; + + if (!__qr_cache_is_fresh(this, qr_inode)) + goto unlock; + + op_ret = min(size, (qr_inode->size - offset)); + + iobuf = iobuf_get2(this->ctx->iobuf_pool, op_ret); + if (!iobuf) { + op_ret = -1; + goto unlock; + } - iobref = iobref_new (); - if (!iobref) { - op_ret = -1; - goto unlock; - } + iobref = iobref_new(); + if (!iobref) { + op_ret = -1; + goto unlock; + } - iobref_add (iobref, iobuf); + iobref_add(iobref, iobuf); - memcpy (iobuf->ptr, qr_inode->data + offset, op_ret); + memcpy(iobuf->ptr, qr_inode->data + offset, op_ret); - buf = qr_inode->buf; + buf = qr_inode->buf; - /* bump LRU */ - __qr_inode_register (frame->this, table, qr_inode); - } + /* bump LRU */ + __qr_inode_register(frame->this, table, qr_inode); + } unlock: - UNLOCK (&table->lock); + UNLOCK(&table->lock); - if (op_ret >= 0) { - iov.iov_base = iobuf->ptr; - iov.iov_len = op_ret; + if (op_ret >= 0) { + iov.iov_base = iobuf->ptr; + iov.iov_len = op_ret; - GF_ATOMIC_INC (priv->qr_counter.cache_hit); - STACK_UNWIND_STRICT (readv, frame, op_ret, 0, &iov, 1, - &buf, iobref, xdata); - } else { - GF_ATOMIC_INC (priv->qr_counter.cache_miss); - } + GF_ATOMIC_INC(priv->qr_counter.cache_hit); + STACK_UNWIND_STRICT(readv, frame, op_ret, 0, &iov, 1, &buf, iobref, + xdata); + } else { + GF_ATOMIC_INC(priv->qr_counter.cache_miss); + } - if (iobuf) - iobuf_unref (iobuf); + if (iobuf) + iobuf_unref(iobuf); - if (iobref) - iobref_unref (iobref); + if (iobref) + iobref_unref(iobref); - return op_ret; + return op_ret; } - int -qr_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t offset, uint32_t flags, dict_t *xdata) +qr_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, + off_t offset, uint32_t flags, dict_t *xdata) { - qr_inode_t *qr_inode = NULL; + qr_inode_t *qr_inode = NULL; - qr_inode = qr_inode_ctx_get (this, fd->inode); - if (!qr_inode) - goto wind; + qr_inode = qr_inode_ctx_get(this, fd->inode); + if (!qr_inode) + goto wind; - if (qr_readv_cached (frame, qr_inode, size, offset, flags, xdata) < 0) - goto wind; + if (qr_readv_cached(frame, qr_inode, size, offset, flags, xdata) < 0) + goto wind; - return 0; + return 0; wind: - STACK_WIND (frame, default_readv_cbk, - FIRST_CHILD (this), FIRST_CHILD (this)->fops->readv, - fd, size, offset, flags, xdata); - return 0; + STACK_WIND(frame, default_readv_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->readv, fd, size, offset, flags, xdata); + return 0; } int32_t -qr_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iatt *prebuf, - struct iatt *postbuf, dict_t *xdata) +qr_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, + int32_t op_errno, struct iatt *prebuf, struct iatt *postbuf, + dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = frame->local; + local = frame->local; - qr_inode_prune (this, local->fd->inode, local->incident_gen); + qr_inode_prune(this, local->fd->inode, local->incident_gen); - QR_STACK_UNWIND (writev, frame, op_ret, op_errno, - prebuf, postbuf, xdata); - return 0; + QR_STACK_UNWIND(writev, frame, op_ret, op_errno, prebuf, postbuf, xdata); + return 0; } int -qr_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *iov, - int count, off_t offset, uint32_t flags, struct iobref *iobref, - dict_t *xdata) +qr_writev(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *iov, + int count, off_t offset, uint32_t flags, struct iobref *iobref, + dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = qr_local_get (this, fd->inode); - local->fd = fd_ref (fd); + local = qr_local_get(this, fd->inode); + local->fd = fd_ref(fd); - frame->local = local; + frame->local = local; - STACK_WIND (frame, qr_writev_cbk, - FIRST_CHILD (this), FIRST_CHILD (this)->fops->writev, - fd, iov, count, offset, flags, iobref, xdata); - return 0; + STACK_WIND(frame, qr_writev_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->writev, fd, iov, count, offset, flags, + iobref, xdata); + return 0; } int32_t -qr_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iatt *prebuf, - struct iatt *postbuf, dict_t *xdata) +qr_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *prebuf, + struct iatt *postbuf, dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = frame->local; - qr_inode_prune (this, local->inode, local->incident_gen); + local = frame->local; + qr_inode_prune(this, local->inode, local->incident_gen); - QR_STACK_UNWIND (truncate, frame, op_ret, op_errno, - prebuf, postbuf, xdata); - return 0; + QR_STACK_UNWIND(truncate, frame, op_ret, op_errno, prebuf, postbuf, xdata); + return 0; } - int -qr_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset, - dict_t *xdata) +qr_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset, + dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = qr_local_get (this, loc->inode); - local->inode = inode_ref (loc->inode); - frame->local = local; + local = qr_local_get(this, loc->inode); + local->inode = inode_ref(loc->inode); + frame->local = local; - STACK_WIND (frame, qr_truncate_cbk, - FIRST_CHILD (this), FIRST_CHILD (this)->fops->truncate, - loc, offset, xdata); - return 0; + STACK_WIND(frame, qr_truncate_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->truncate, loc, offset, xdata); + return 0; } int32_t -qr_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iatt *prebuf, - struct iatt *postbuf, dict_t *xdata) +qr_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *prebuf, + struct iatt *postbuf, dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = frame->local; - qr_inode_prune (this, local->fd->inode, local->incident_gen); + local = frame->local; + qr_inode_prune(this, local->fd->inode, local->incident_gen); - QR_STACK_UNWIND (ftruncate, frame, op_ret, op_errno, - prebuf, postbuf, xdata); - return 0; + QR_STACK_UNWIND(ftruncate, frame, op_ret, op_errno, prebuf, postbuf, xdata); + return 0; } int -qr_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, - dict_t *xdata) +qr_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, + dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = qr_local_get (this, fd->inode); - local->fd = fd_ref (fd); - frame->local = local; + local = qr_local_get(this, fd->inode); + local->fd = fd_ref(fd); + frame->local = local; - STACK_WIND (frame, qr_ftruncate_cbk, - FIRST_CHILD (this), FIRST_CHILD (this)->fops->ftruncate, - fd, offset, xdata); - return 0; + STACK_WIND(frame, qr_ftruncate_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->ftruncate, fd, offset, xdata); + return 0; } int32_t -qr_fallocate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iatt *pre, - struct iatt *post, dict_t *xdata) +qr_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *pre, + struct iatt *post, dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = frame->local; - qr_inode_prune (this, local->fd->inode, local->incident_gen); + local = frame->local; + qr_inode_prune(this, local->fd->inode, local->incident_gen); - QR_STACK_UNWIND (fallocate, frame, op_ret, op_errno, - pre, post, xdata); - return 0; + QR_STACK_UNWIND(fallocate, frame, op_ret, op_errno, pre, post, xdata); + return 0; } static int -qr_fallocate (call_frame_t *frame, xlator_t *this, fd_t *fd, int keep_size, - off_t offset, size_t len, dict_t *xdata) +qr_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int keep_size, + off_t offset, size_t len, dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = qr_local_get (this, fd->inode); - local->fd = fd_ref (fd); - frame->local = local; + local = qr_local_get(this, fd->inode); + local->fd = fd_ref(fd); + frame->local = local; - STACK_WIND (frame, qr_fallocate_cbk, - FIRST_CHILD (this), FIRST_CHILD (this)->fops->fallocate, - fd, keep_size, offset, len, xdata); - return 0; + STACK_WIND(frame, qr_fallocate_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->fallocate, fd, keep_size, offset, len, + xdata); + return 0; } int32_t -qr_discard_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iatt *pre, - struct iatt *post, dict_t *xdata) +qr_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *pre, + struct iatt *post, dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = frame->local; - qr_inode_prune (this, local->fd->inode, local->incident_gen); + local = frame->local; + qr_inode_prune(this, local->fd->inode, local->incident_gen); - QR_STACK_UNWIND (discard, frame, op_ret, op_errno, - pre, post, xdata); - return 0; + QR_STACK_UNWIND(discard, frame, op_ret, op_errno, pre, post, xdata); + return 0; } static int -qr_discard (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, - size_t len, dict_t *xdata) +qr_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, + size_t len, dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = qr_local_get (this, fd->inode); - local->fd = fd_ref (fd); - frame->local = local; + local = qr_local_get(this, fd->inode); + local->fd = fd_ref(fd); + frame->local = local; - STACK_WIND (frame, qr_discard_cbk, - FIRST_CHILD (this), FIRST_CHILD (this)->fops->discard, - fd, offset, len, xdata); - return 0; + STACK_WIND(frame, qr_discard_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->discard, fd, offset, len, xdata); + return 0; } int32_t -qr_zerofill_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iatt *pre, - struct iatt *post, dict_t *xdata) +qr_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *pre, + struct iatt *post, dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = frame->local; - qr_inode_prune (this, local->fd->inode, local->incident_gen); + local = frame->local; + qr_inode_prune(this, local->fd->inode, local->incident_gen); - QR_STACK_UNWIND (zerofill, frame, op_ret, op_errno, - pre, post, xdata); - return 0; + QR_STACK_UNWIND(zerofill, frame, op_ret, op_errno, pre, post, xdata); + return 0; } static int -qr_zerofill (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, - off_t len, dict_t *xdata) +qr_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, + off_t len, dict_t *xdata) { - qr_local_t *local = NULL; + qr_local_t *local = NULL; - local = qr_local_get (this, fd->inode); - local->fd = fd_ref (fd); - frame->local = local; + local = qr_local_get(this, fd->inode); + local->fd = fd_ref(fd); + frame->local = local; - STACK_WIND (frame, qr_zerofill_cbk, - FIRST_CHILD (this), FIRST_CHILD (this)->fops->zerofill, - fd, offset, len, xdata); - return 0; + STACK_WIND(frame, qr_zerofill_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->zerofill, fd, offset, len, xdata); + return 0; } int -qr_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, - fd_t *fd, dict_t *xdata) +qr_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, fd_t *fd, + dict_t *xdata) { - qr_inode_set_priority (this, fd->inode, loc->path); + qr_inode_set_priority(this, fd->inode, loc->path); - STACK_WIND (frame, default_open_cbk, - FIRST_CHILD (this), FIRST_CHILD (this)->fops->open, - loc, flags, fd, xdata); - return 0; + STACK_WIND(frame, default_open_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->open, loc, flags, fd, xdata); + return 0; } int -qr_forget (xlator_t *this, inode_t *inode) +qr_forget(xlator_t *this, inode_t *inode) { - qr_inode_t *qr_inode = NULL; + qr_inode_t *qr_inode = NULL; - qr_inode = qr_inode_ctx_get (this, inode); + qr_inode = qr_inode_ctx_get(this, inode); - if (!qr_inode) - return 0; + if (!qr_inode) + return 0; - qr_inode_prune (this, inode, qr_get_generation (this, inode)); + qr_inode_prune(this, inode, qr_get_generation(this, inode)); - GF_FREE (qr_inode); + GF_FREE(qr_inode); - return 0; + return 0; } - int32_t -qr_inodectx_dump (xlator_t *this, inode_t *inode) +qr_inodectx_dump(xlator_t *this, inode_t *inode) { - qr_inode_t *qr_inode = NULL; - int32_t ret = -1; - char key_prefix[GF_DUMP_MAX_BUF_LEN] = {0, }; - char buf[256] = {0, }; - - qr_inode = qr_inode_ctx_get (this, inode); - if (!qr_inode) - goto out; - - gf_proc_dump_build_key (key_prefix, "xlator.performance.quick-read", - "inodectx"); - gf_proc_dump_add_section (key_prefix); - - gf_proc_dump_write ("entire-file-cached", "%s", qr_inode->data ? "yes" : "no"); - - if (qr_inode->last_refresh.tv_sec) { - gf_time_fmt (buf, sizeof buf, qr_inode->last_refresh.tv_sec, - gf_timefmt_FT); - snprintf (buf + strlen (buf), sizeof buf - strlen (buf), - ".%"GF_PRI_SUSECONDS, qr_inode->last_refresh.tv_usec); - - gf_proc_dump_write ("last-cache-validation-time", "%s", buf); - } - - ret = 0; + qr_inode_t *qr_inode = NULL; + int32_t ret = -1; + char key_prefix[GF_DUMP_MAX_BUF_LEN] = { + 0, + }; + char buf[256] = { + 0, + }; + + qr_inode = qr_inode_ctx_get(this, inode); + if (!qr_inode) + goto out; + + gf_proc_dump_build_key(key_prefix, "xlator.performance.quick-read", + "inodectx"); + gf_proc_dump_add_section(key_prefix); + + gf_proc_dump_write("entire-file-cached", "%s", + qr_inode->data ? "yes" : "no"); + + if (qr_inode->last_refresh.tv_sec) { + gf_time_fmt(buf, sizeof buf, qr_inode->last_refresh.tv_sec, + gf_timefmt_FT); + snprintf(buf + strlen(buf), sizeof buf - strlen(buf), + ".%" GF_PRI_SUSECONDS, qr_inode->last_refresh.tv_usec); + + gf_proc_dump_write("last-cache-validation-time", "%s", buf); + } + + ret = 0; out: - return ret; + return ret; } - int -qr_priv_dump (xlator_t *this) +qr_priv_dump(xlator_t *this) { - qr_conf_t *conf = NULL; - qr_private_t *priv = NULL; - qr_inode_table_t *table = NULL; - uint32_t file_count = 0; - uint32_t i = 0; - qr_inode_t *curr = NULL; - uint64_t total_size = 0; - char key_prefix[GF_DUMP_MAX_BUF_LEN]; - - if (!this) { - return -1; - } + qr_conf_t *conf = NULL; + qr_private_t *priv = NULL; + qr_inode_table_t *table = NULL; + uint32_t file_count = 0; + uint32_t i = 0; + qr_inode_t *curr = NULL; + uint64_t total_size = 0; + char key_prefix[GF_DUMP_MAX_BUF_LEN]; - priv = this->private; - conf = &priv->conf; - if (!conf) - return -1; + if (!this) { + return -1; + } - table = &priv->table; + priv = this->private; + conf = &priv->conf; + if (!conf) + return -1; - gf_proc_dump_build_key (key_prefix, "xlator.performance.quick-read", - "priv"); + table = &priv->table; - gf_proc_dump_add_section (key_prefix); + gf_proc_dump_build_key(key_prefix, "xlator.performance.quick-read", "priv"); - gf_proc_dump_write ("max_file_size", "%d", conf->max_file_size); - gf_proc_dump_write ("cache_timeout", "%d", conf->cache_timeout); + gf_proc_dump_add_section(key_prefix); - if (!table) { - goto out; - } else { - for (i = 0; i < conf->max_pri; i++) { - list_for_each_entry (curr, &table->lru[i], lru) { - file_count++; - total_size += curr->size; - } - } + gf_proc_dump_write("max_file_size", "%d", conf->max_file_size); + gf_proc_dump_write("cache_timeout", "%d", conf->cache_timeout); + + if (!table) { + goto out; + } else { + for (i = 0; i < conf->max_pri; i++) { + list_for_each_entry(curr, &table->lru[i], lru) + { + file_count++; + total_size += curr->size; + } } + } - gf_proc_dump_write ("total_files_cached", "%d", file_count); - gf_proc_dump_write ("total_cache_used", "%d", total_size); - gf_proc_dump_write ("cache-hit", "%"PRId64, - priv->qr_counter.cache_hit); - gf_proc_dump_write ("cache-miss", "%"PRId64, - priv->qr_counter.cache_miss); - gf_proc_dump_write ("cache-invalidations", "%"PRId64, - priv->qr_counter.file_data_invals); + gf_proc_dump_write("total_files_cached", "%d", file_count); + gf_proc_dump_write("total_cache_used", "%d", total_size); + gf_proc_dump_write("cache-hit", "%" PRId64, priv->qr_counter.cache_hit); + gf_proc_dump_write("cache-miss", "%" PRId64, priv->qr_counter.cache_miss); + gf_proc_dump_write("cache-invalidations", "%" PRId64, + priv->qr_counter.file_data_invals); out: - return 0; + return 0; } - static int32_t -qr_dump_metrics (xlator_t *this, int fd) +qr_dump_metrics(xlator_t *this, int fd) { - qr_private_t *priv = NULL; - qr_inode_table_t *table = NULL; - - priv = this->private; - table = &priv->table; - - dprintf (fd, "%s.total_files_cached %"PRId64"\n", this->name, - GF_ATOMIC_GET(priv->qr_counter.files_cached)); - dprintf (fd, "%s.total_cache_used %"PRId64"\n", this->name, - table->cache_used); - dprintf (fd, "%s.cache-hit %"PRId64"\n", this->name, - GF_ATOMIC_GET(priv->qr_counter.cache_hit)); - dprintf (fd, "%s.cache-miss %"PRId64"\n", this->name, - GF_ATOMIC_GET(priv->qr_counter.cache_miss)); - dprintf (fd, "%s.cache-invalidations %"PRId64"\n", this->name, - GF_ATOMIC_GET(priv->qr_counter.file_data_invals)); - - return 0; + qr_private_t *priv = NULL; + qr_inode_table_t *table = NULL; + + priv = this->private; + table = &priv->table; + + dprintf(fd, "%s.total_files_cached %" PRId64 "\n", this->name, + GF_ATOMIC_GET(priv->qr_counter.files_cached)); + dprintf(fd, "%s.total_cache_used %" PRId64 "\n", this->name, + table->cache_used); + dprintf(fd, "%s.cache-hit %" PRId64 "\n", this->name, + GF_ATOMIC_GET(priv->qr_counter.cache_hit)); + dprintf(fd, "%s.cache-miss %" PRId64 "\n", this->name, + GF_ATOMIC_GET(priv->qr_counter.cache_miss)); + dprintf(fd, "%s.cache-invalidations %" PRId64 "\n", this->name, + GF_ATOMIC_GET(priv->qr_counter.file_data_invals)); + + return 0; } - int32_t -qr_mem_acct_init (xlator_t *this) +qr_mem_acct_init(xlator_t *this) { - int ret = -1; + int ret = -1; - if (!this) - return ret; - - ret = xlator_mem_acct_init (this, gf_qr_mt_end + 1); + if (!this) + return ret; - if (ret != 0) { - gf_msg (this->name, GF_LOG_ERROR, ENOMEM, - QUICK_READ_MSG_NO_MEMORY, - "Memory accounting init failed"); - return ret; - } + ret = xlator_mem_acct_init(this, gf_qr_mt_end + 1); + if (ret != 0) { + gf_msg(this->name, GF_LOG_ERROR, ENOMEM, QUICK_READ_MSG_NO_MEMORY, + "Memory accounting init failed"); return ret; -} + } + return ret; +} static gf_boolean_t -check_cache_size_ok (xlator_t *this, int64_t cache_size) +check_cache_size_ok(xlator_t *this, int64_t cache_size) { - int ret = _gf_true; - uint64_t total_mem = 0; - uint64_t max_cache_size = 0; - volume_option_t *opt = NULL; - - GF_ASSERT (this); - opt = xlator_volume_option_get (this, "cache-size"); - if (!opt) { - ret = _gf_false; - gf_msg (this->name, GF_LOG_ERROR, EINVAL, - QUICK_READ_MSG_INVALID_ARGUMENT, - "could not get cache-size option"); - goto out; - } - - total_mem = get_mem_size (); - if (-1 == total_mem) - max_cache_size = opt->max; - else - max_cache_size = total_mem; - - gf_msg_debug (this->name, 0, "Max cache size is %"PRIu64, - max_cache_size); - if (cache_size > max_cache_size) { - ret = _gf_false; - gf_msg (this->name, GF_LOG_ERROR, 0, - QUICK_READ_MSG_INVALID_ARGUMENT, "Cache size %"PRIu64 - " is greater than the max size of %"PRIu64, - cache_size, max_cache_size); - goto out; - } + int ret = _gf_true; + uint64_t total_mem = 0; + uint64_t max_cache_size = 0; + volume_option_t *opt = NULL; + + GF_ASSERT(this); + opt = xlator_volume_option_get(this, "cache-size"); + if (!opt) { + ret = _gf_false; + gf_msg(this->name, GF_LOG_ERROR, EINVAL, + QUICK_READ_MSG_INVALID_ARGUMENT, + "could not get cache-size option"); + goto out; + } + + total_mem = get_mem_size(); + if (-1 == total_mem) + max_cache_size = opt->max; + else + max_cache_size = total_mem; + + gf_msg_debug(this->name, 0, "Max cache size is %" PRIu64, max_cache_size); + if (cache_size > max_cache_size) { + ret = _gf_false; + gf_msg(this->name, GF_LOG_ERROR, 0, QUICK_READ_MSG_INVALID_ARGUMENT, + "Cache size %" PRIu64 + " is greater than the max size of %" PRIu64, + cache_size, max_cache_size); + goto out; + } out: - return ret; + return ret; } int -qr_reconfigure (xlator_t *this, dict_t *options) +qr_reconfigure(xlator_t *this, dict_t *options) { - int32_t ret = -1; - qr_private_t *priv = NULL; - qr_conf_t *conf = NULL; - uint64_t cache_size_new = 0; + int32_t ret = -1; + qr_private_t *priv = NULL; + qr_conf_t *conf = NULL; + uint64_t cache_size_new = 0; - GF_VALIDATE_OR_GOTO ("quick-read", this, out); - GF_VALIDATE_OR_GOTO (this->name, this->private, out); - GF_VALIDATE_OR_GOTO (this->name, options, out); + GF_VALIDATE_OR_GOTO("quick-read", this, out); + GF_VALIDATE_OR_GOTO(this->name, this->private, out); + GF_VALIDATE_OR_GOTO(this->name, options, out); - priv = this->private; + priv = this->private; - conf = &priv->conf; - if (!conf) { - goto out; - } + conf = &priv->conf; + if (!conf) { + goto out; + } - GF_OPTION_RECONF ("cache-timeout", conf->cache_timeout, options, int32, - out); + GF_OPTION_RECONF("cache-timeout", conf->cache_timeout, options, int32, out); - GF_OPTION_RECONF ("cache-invalidation", conf->qr_invalidation, options, - bool, out); + GF_OPTION_RECONF("cache-invalidation", conf->qr_invalidation, options, bool, + out); - GF_OPTION_RECONF ("ctime-invalidation", conf->ctime_invalidation, - options, bool, out); + GF_OPTION_RECONF("ctime-invalidation", conf->ctime_invalidation, options, + bool, out); - GF_OPTION_RECONF ("cache-size", cache_size_new, options, size_uint64, out); - if (!check_cache_size_ok (this, cache_size_new)) { - ret = -1; - gf_msg (this->name, GF_LOG_ERROR, EINVAL, - QUICK_READ_MSG_INVALID_CONFIG, - "Not reconfiguring cache-size"); - goto out; - } - conf->cache_size = cache_size_new; + GF_OPTION_RECONF("cache-size", cache_size_new, options, size_uint64, out); + if (!check_cache_size_ok(this, cache_size_new)) { + ret = -1; + gf_msg(this->name, GF_LOG_ERROR, EINVAL, QUICK_READ_MSG_INVALID_CONFIG, + "Not reconfiguring cache-size"); + goto out; + } + conf->cache_size = cache_size_new; - ret = 0; + ret = 0; out: - return ret; + return ret; } - int32_t -qr_get_priority_list (const char *opt_str, struct list_head *first) +qr_get_priority_list(const char *opt_str, struct list_head *first) { - int32_t max_pri = 1; - char *tmp_str = NULL; - char *tmp_str1 = NULL; - char *tmp_str2 = NULL; - char *dup_str = NULL; - char *priority_str = NULL; - char *pattern = NULL; - char *priority = NULL; - char *string = NULL; - struct qr_priority *curr = NULL, *tmp = NULL; - - GF_VALIDATE_OR_GOTO ("quick-read", opt_str, out); - GF_VALIDATE_OR_GOTO ("quick-read", first, out); - - string = gf_strdup (opt_str); - if (string == NULL) { - max_pri = -1; - goto out; - } - - /* Get the pattern for cache priority. - * "option priority *.jpg:1,abc*:2" etc - */ - /* TODO: inode_lru in table is statically hard-coded to 5, - * should be changed to run-time configuration - */ - priority_str = strtok_r (string, ",", &tmp_str); - while (priority_str) { - curr = GF_CALLOC (1, sizeof (*curr), gf_qr_mt_qr_priority_t); - if (curr == NULL) { - max_pri = -1; - goto out; - } - - list_add_tail (&curr->list, first); - - dup_str = gf_strdup (priority_str); - if (dup_str == NULL) { - max_pri = -1; - goto out; - } - - pattern = strtok_r (dup_str, ":", &tmp_str1); - if (!pattern) { - max_pri = -1; - goto out; - } - - priority = strtok_r (NULL, ":", &tmp_str1); - if (!priority) { - max_pri = -1; - goto out; - } - - gf_msg_trace ("quick-read", 0, - "quick-read priority : pattern %s : priority %s", - pattern, priority); - - curr->pattern = gf_strdup (pattern); - if (curr->pattern == NULL) { - max_pri = -1; - goto out; - } - - curr->priority = strtol (priority, &tmp_str2, 0); - if (tmp_str2 && (*tmp_str2)) { - max_pri = -1; - goto out; - } else { - max_pri = max (max_pri, curr->priority); - } - - GF_FREE (dup_str); - dup_str = NULL; - - priority_str = strtok_r (NULL, ",", &tmp_str); + int32_t max_pri = 1; + char *tmp_str = NULL; + char *tmp_str1 = NULL; + char *tmp_str2 = NULL; + char *dup_str = NULL; + char *priority_str = NULL; + char *pattern = NULL; + char *priority = NULL; + char *string = NULL; + struct qr_priority *curr = NULL, *tmp = NULL; + + GF_VALIDATE_OR_GOTO("quick-read", opt_str, out); + GF_VALIDATE_OR_GOTO("quick-read", first, out); + + string = gf_strdup(opt_str); + if (string == NULL) { + max_pri = -1; + goto out; + } + + /* Get the pattern for cache priority. + * "option priority *.jpg:1,abc*:2" etc + */ + /* TODO: inode_lru in table is statically hard-coded to 5, + * should be changed to run-time configuration + */ + priority_str = strtok_r(string, ",", &tmp_str); + while (priority_str) { + curr = GF_CALLOC(1, sizeof(*curr), gf_qr_mt_qr_priority_t); + if (curr == NULL) { + max_pri = -1; + goto out; } -out: - GF_FREE (string); - GF_FREE (dup_str); + list_add_tail(&curr->list, first); - if (max_pri == -1) { - list_for_each_entry_safe (curr, tmp, first, list) { - list_del_init (&curr->list); - GF_FREE (curr->pattern); - GF_FREE (curr); - } + dup_str = gf_strdup(priority_str); + if (dup_str == NULL) { + max_pri = -1; + goto out; } - return max_pri; -} - - -int32_t -qr_init (xlator_t *this) -{ - int32_t ret = -1, i = 0; - qr_private_t *priv = NULL; - qr_conf_t *conf = NULL; - - if (!this->children || this->children->next) { - gf_msg (this->name, GF_LOG_ERROR, 0, - QUICK_READ_MSG_XLATOR_CHILD_MISCONFIGURED, - "FATAL: volume (%s) not configured with exactly one " - "child", this->name); - return -1; + pattern = strtok_r(dup_str, ":", &tmp_str1); + if (!pattern) { + max_pri = -1; + goto out; } - if (!this->parents) { - gf_msg (this->name, GF_LOG_WARNING, 0, - QUICK_READ_MSG_VOL_MISCONFIGURED, - "dangling volume. check volfile "); + priority = strtok_r(NULL, ":", &tmp_str1); + if (!priority) { + max_pri = -1; + goto out; } - priv = GF_CALLOC (1, sizeof (*priv), gf_qr_mt_qr_private_t); - if (priv == NULL) { - ret = -1; - goto out; + gf_msg_trace("quick-read", 0, + "quick-read priority : pattern %s : priority %s", pattern, + priority); + + curr->pattern = gf_strdup(pattern); + if (curr->pattern == NULL) { + max_pri = -1; + goto out; } - LOCK_INIT (&priv->table.lock); - conf = &priv->conf; + curr->priority = strtol(priority, &tmp_str2, 0); + if (tmp_str2 && (*tmp_str2)) { + max_pri = -1; + goto out; + } else { + max_pri = max(max_pri, curr->priority); + } - GF_OPTION_INIT ("max-file-size", conf->max_file_size, size_uint64, out); + GF_FREE(dup_str); + dup_str = NULL; - GF_OPTION_INIT ("cache-timeout", conf->cache_timeout, int32, out); + priority_str = strtok_r(NULL, ",", &tmp_str); + } +out: + GF_FREE(string); - GF_OPTION_INIT ("cache-invalidation", conf->qr_invalidation, bool, out); + GF_FREE(dup_str); - GF_OPTION_INIT ("cache-size", conf->cache_size, size_uint64, out); - if (!check_cache_size_ok (this, conf->cache_size)) { - ret = -1; - goto out; + if (max_pri == -1) { + list_for_each_entry_safe(curr, tmp, first, list) + { + list_del_init(&curr->list); + GF_FREE(curr->pattern); + GF_FREE(curr); } + } - GF_OPTION_INIT ("ctime-invalidation", conf->ctime_invalidation, bool, - out); - - INIT_LIST_HEAD (&conf->priority_list); - conf->max_pri = 1; - if (dict_get (this->options, "priority")) { - char *option_list = data_to_str (dict_get (this->options, - "priority")); - gf_msg_trace (this->name, 0, - "option path %s", option_list); - /* parse the list of pattern:priority */ - conf->max_pri = qr_get_priority_list (option_list, - &conf->priority_list); - - if (conf->max_pri == -1) { - goto out; - } - conf->max_pri ++; - } + return max_pri; +} - priv->table.lru = GF_CALLOC (conf->max_pri, sizeof (*priv->table.lru), - gf_common_mt_list_head); - if (priv->table.lru == NULL) { - ret = -1; - goto out; +int32_t +qr_init(xlator_t *this) +{ + int32_t ret = -1, i = 0; + qr_private_t *priv = NULL; + qr_conf_t *conf = NULL; + + if (!this->children || this->children->next) { + gf_msg(this->name, GF_LOG_ERROR, 0, + QUICK_READ_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, QUICK_READ_MSG_VOL_MISCONFIGURED, + "dangling volume. check volfile "); + } + + priv = GF_CALLOC(1, sizeof(*priv), gf_qr_mt_qr_private_t); + if (priv == NULL) { + ret = -1; + goto out; + } + + LOCK_INIT(&priv->table.lock); + conf = &priv->conf; + + GF_OPTION_INIT("max-file-size", conf->max_file_size, size_uint64, out); + + GF_OPTION_INIT("cache-timeout", conf->cache_timeout, int32, out); + + GF_OPTION_INIT("cache-invalidation", conf->qr_invalidation, bool, out); + + GF_OPTION_INIT("cache-size", conf->cache_size, size_uint64, out); + if (!check_cache_size_ok(this, conf->cache_size)) { + ret = -1; + goto out; + } + + GF_OPTION_INIT("ctime-invalidation", conf->ctime_invalidation, bool, out); + + INIT_LIST_HEAD(&conf->priority_list); + conf->max_pri = 1; + if (dict_get(this->options, "priority")) { + char *option_list = data_to_str(dict_get(this->options, "priority")); + gf_msg_trace(this->name, 0, "option path %s", option_list); + /* parse the list of pattern:priority */ + conf->max_pri = qr_get_priority_list(option_list, &conf->priority_list); + + if (conf->max_pri == -1) { + goto out; } + conf->max_pri++; + } - for (i = 0; i < conf->max_pri; i++) { - INIT_LIST_HEAD (&priv->table.lru[i]); - } + priv->table.lru = GF_CALLOC(conf->max_pri, sizeof(*priv->table.lru), + gf_common_mt_list_head); + if (priv->table.lru == NULL) { + ret = -1; + goto out; + } - ret = 0; + for (i = 0; i < conf->max_pri; i++) { + INIT_LIST_HEAD(&priv->table.lru[i]); + } - time (&priv->last_child_down); - GF_ATOMIC_INIT (priv->generation, 0); - this->private = priv; + ret = 0; + + time(&priv->last_child_down); + GF_ATOMIC_INIT(priv->generation, 0); + this->private = priv; out: - if ((ret == -1) && priv) { - GF_FREE (priv); - } + if ((ret == -1) && priv) { + GF_FREE(priv); + } - return ret; + return ret; } - void -qr_inode_table_destroy (qr_private_t *priv) +qr_inode_table_destroy(qr_private_t *priv) { - int i = 0; - qr_conf_t *conf = NULL; - - conf = &priv->conf; - - for (i = 0; i < conf->max_pri; i++) { - /* There is a known leak of inodes, hence until - * that is fixed, log the assert as warning. - GF_ASSERT (list_empty (&priv->table.lru[i]));*/ - if (!list_empty (&priv->table.lru[i])) { - gf_msg ("quick-read", GF_LOG_INFO, 0, - QUICK_READ_MSG_LRU_NOT_EMPTY, - "quick read inode table lru not empty"); - } + int i = 0; + qr_conf_t *conf = NULL; + + conf = &priv->conf; + + for (i = 0; i < conf->max_pri; i++) { + /* There is a known leak of inodes, hence until + * that is fixed, log the assert as warning. + GF_ASSERT (list_empty (&priv->table.lru[i]));*/ + if (!list_empty(&priv->table.lru[i])) { + gf_msg("quick-read", GF_LOG_INFO, 0, QUICK_READ_MSG_LRU_NOT_EMPTY, + "quick read inode table lru not empty"); } + } - LOCK_DESTROY (&priv->table.lock); + LOCK_DESTROY(&priv->table.lock); - return; + return; } - void -qr_conf_destroy (qr_conf_t *conf) +qr_conf_destroy(qr_conf_t *conf) { - struct qr_priority *curr = NULL, *tmp = NULL; + struct qr_priority *curr = NULL, *tmp = NULL; - list_for_each_entry_safe (curr, tmp, &conf->priority_list, list) { - list_del (&curr->list); - GF_FREE (curr->pattern); - GF_FREE (curr); - } + list_for_each_entry_safe(curr, tmp, &conf->priority_list, list) + { + list_del(&curr->list); + GF_FREE(curr->pattern); + GF_FREE(curr); + } - return; + return; } - void -qr_update_child_down_time (xlator_t *this, time_t *now) +qr_update_child_down_time(xlator_t *this, time_t *now) { - qr_private_t *priv = NULL; + qr_private_t *priv = NULL; - priv = this->private; + priv = this->private; - LOCK (&priv->lock); - { - priv->last_child_down = *now; - } - UNLOCK (&priv->lock); + LOCK(&priv->lock); + { + priv->last_child_down = *now; + } + UNLOCK(&priv->lock); } - static int -qr_invalidate (xlator_t *this, void *data) +qr_invalidate(xlator_t *this, void *data) { - struct gf_upcall *up_data = NULL; - struct gf_upcall_cache_invalidation *up_ci = NULL; - inode_t *inode = NULL; - int ret = 0; - inode_table_t *itable = NULL; - qr_private_t *priv = NULL; - - up_data = (struct gf_upcall *)data; - - if (up_data->event_type != GF_UPCALL_CACHE_INVALIDATION) - goto out; - - priv = this->private; - up_ci = (struct gf_upcall_cache_invalidation *)up_data->data; - - if (up_ci && (up_ci->flags & UP_WRITE_FLAGS)) { - GF_ATOMIC_INC (priv->qr_counter.file_data_invals); - itable = ((xlator_t *)this->graph->top)->itable; - inode = inode_find (itable, up_data->gfid); - if (!inode) { - ret = -1; - goto out; - } - qr_inode_prune (this, inode, qr_get_generation (this, inode)); + struct gf_upcall *up_data = NULL; + struct gf_upcall_cache_invalidation *up_ci = NULL; + inode_t *inode = NULL; + int ret = 0; + inode_table_t *itable = NULL; + qr_private_t *priv = NULL; + + up_data = (struct gf_upcall *)data; + + if (up_data->event_type != GF_UPCALL_CACHE_INVALIDATION) + goto out; + + priv = this->private; + up_ci = (struct gf_upcall_cache_invalidation *)up_data->data; + + if (up_ci && (up_ci->flags & UP_WRITE_FLAGS)) { + GF_ATOMIC_INC(priv->qr_counter.file_data_invals); + itable = ((xlator_t *)this->graph->top)->itable; + inode = inode_find(itable, up_data->gfid); + if (!inode) { + ret = -1; + goto out; } + qr_inode_prune(this, inode, qr_get_generation(this, inode)); + } out: - if (inode) - inode_unref (inode); + if (inode) + inode_unref(inode); - return ret; + return ret; } - int -qr_notify (xlator_t *this, int event, void *data, ...) +qr_notify(xlator_t *this, int event, void *data, ...) { - int ret = 0; - qr_private_t *priv = NULL; - time_t now = 0; - qr_conf_t *conf = NULL; + int ret = 0; + qr_private_t *priv = NULL; + time_t now = 0; + qr_conf_t *conf = NULL; - priv = this->private; - conf = &priv->conf; + priv = this->private; + conf = &priv->conf; - switch (event) { + switch (event) { case GF_EVENT_CHILD_DOWN: case GF_EVENT_SOME_DESCENDENT_DOWN: - time (&now); - qr_update_child_down_time (this, &now); - break; + time(&now); + qr_update_child_down_time(this, &now); + break; case GF_EVENT_UPCALL: - if (conf->qr_invalidation) - ret = qr_invalidate (this, data); - break; + if (conf->qr_invalidation) + ret = qr_invalidate(this, data); + break; default: - break; - } + break; + } - if (default_notify (this, event, data) != 0) - ret = -1; + if (default_notify(this, event, data) != 0) + ret = -1; - return ret; + return ret; } - void -qr_fini (xlator_t *this) +qr_fini(xlator_t *this) { - qr_private_t *priv = NULL; + qr_private_t *priv = NULL; - if (this == NULL) { - goto out; - } + if (this == NULL) { + goto out; + } - priv = this->private; - if (priv == NULL) { - goto out; - } + priv = this->private; + if (priv == NULL) { + goto out; + } - qr_inode_table_destroy (priv); - qr_conf_destroy (&priv->conf); + qr_inode_table_destroy(priv); + qr_conf_destroy(&priv->conf); - this->private = NULL; + this->private = NULL; - GF_FREE (priv); + GF_FREE(priv); out: - return; + return; } -struct xlator_fops qr_fops = { - .lookup = qr_lookup, - .readdirp = qr_readdirp, - .open = qr_open, - .readv = qr_readv, - .writev = qr_writev, - .truncate = qr_truncate, - .ftruncate = qr_ftruncate, - .fallocate = qr_fallocate, - .discard = qr_discard, - .zerofill = qr_zerofill -}; +struct xlator_fops qr_fops = {.lookup = qr_lookup, + .readdirp = qr_readdirp, + .open = qr_open, + .readv = qr_readv, + .writev = qr_writev, + .truncate = qr_truncate, + .ftruncate = qr_ftruncate, + .fallocate = qr_fallocate, + .discard = qr_discard, + .zerofill = qr_zerofill}; struct xlator_cbks qr_cbks = { - .forget = qr_forget, + .forget = qr_forget, }; struct xlator_dumpops qr_dumpops = { - .priv = qr_priv_dump, - .inodectx = qr_inodectx_dump, + .priv = qr_priv_dump, + .inodectx = qr_inodectx_dump, }; struct volume_options qr_options[] = { - { .key = {"priority"}, - .type = GF_OPTION_TYPE_ANY - }, - { .key = {"cache-size"}, - .type = GF_OPTION_TYPE_SIZET, - .min = 0, - .max = INFINITY, - .default_value = "128MB", - .op_version = {1}, - .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - .description = "Size of small file read cache." - }, - { .key = {"cache-timeout"}, - .type = GF_OPTION_TYPE_INT, - .default_value = "1", - .op_version = {1}, - .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - }, - { .key = {"max-file-size"}, - .type = GF_OPTION_TYPE_SIZET, - .min = 0, - .max = 1 * GF_UNIT_KB * 1000, - .default_value = "64KB", - .op_version = {1}, - .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - }, - { .key = {"cache-invalidation"}, - .type = GF_OPTION_TYPE_BOOL, - .default_value = "false", - .op_version = {GD_OP_VERSION_4_0_0}, - .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - .description = "When \"on\", invalidates/updates the metadata cache," - " on receiving the cache-invalidation notifications", - }, - { .key = {"ctime-invalidation"}, - .type = GF_OPTION_TYPE_BOOL, - .default_value = "false", - .op_version = {GD_OP_VERSION_4_2_0}, - .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - .description = "Quick-read by default uses mtime to identify changes " - "to file data. However there are applications like " - "rsync which explicitly set mtime making it unreliable " - "for the purpose of identifying change in file content " - ". Since ctime also changes when content of a file " - " changes and it cannot be set explicitly, it becomes " - " suitable for identifying staleness of cached data. " - "This option makes quick-read to prefer ctime over " - "mtime to validate its cache. However, using ctime " - "can result in false positives as ctime changes with " - "just attribute changes like permission without " - "changes to file data. So, use this only when mtime " - "is not reliable", - }, - { .key = {NULL} } -}; + {.key = {"priority"}, .type = GF_OPTION_TYPE_ANY}, + {.key = {"cache-size"}, + .type = GF_OPTION_TYPE_SIZET, + .min = 0, + .max = INFINITY, + .default_value = "128MB", + .op_version = {1}, + .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .description = "Size of small file read cache."}, + { + .key = {"cache-timeout"}, + .type = GF_OPTION_TYPE_INT, + .default_value = "1", + .op_version = {1}, + .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + }, + { + .key = {"max-file-size"}, + .type = GF_OPTION_TYPE_SIZET, + .min = 0, + .max = 1 * GF_UNIT_KB * 1000, + .default_value = "64KB", + .op_version = {1}, + .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + }, + { + .key = {"cache-invalidation"}, + .type = GF_OPTION_TYPE_BOOL, + .default_value = "false", + .op_version = {GD_OP_VERSION_4_0_0}, + .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .description = "When \"on\", invalidates/updates the metadata cache," + " on receiving the cache-invalidation notifications", + }, + { + .key = {"ctime-invalidation"}, + .type = GF_OPTION_TYPE_BOOL, + .default_value = "false", + .op_version = {GD_OP_VERSION_4_2_0}, + .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .description = "Quick-read by default uses mtime to identify changes " + "to file data. However there are applications like " + "rsync which explicitly set mtime making it unreliable " + "for the purpose of identifying change in file content " + ". Since ctime also changes when content of a file " + " changes and it cannot be set explicitly, it becomes " + " suitable for identifying staleness of cached data. " + "This option makes quick-read to prefer ctime over " + "mtime to validate its cache. However, using ctime " + "can result in false positives as ctime changes with " + "just attribute changes like permission without " + "changes to file data. So, use this only when mtime " + "is not reliable", + }, + {.key = {NULL}}}; xlator_api_t xlator_api = { - .init = qr_init, - .fini = qr_fini, - .notify = qr_notify, - .reconfigure = qr_reconfigure, - .mem_acct_init = qr_mem_acct_init, - .dump_metrics = qr_dump_metrics, - .op_version = {1}, /* Present from the initial version */ - .dumpops = &qr_dumpops, - .fops = &qr_fops, - .cbks = &qr_cbks, - .options = qr_options, - .identifier = "quick-read", - .category = GF_MAINTAINED, + .init = qr_init, + .fini = qr_fini, + .notify = qr_notify, + .reconfigure = qr_reconfigure, + .mem_acct_init = qr_mem_acct_init, + .dump_metrics = qr_dump_metrics, + .op_version = {1}, /* Present from the initial version */ + .dumpops = &qr_dumpops, + .fops = &qr_fops, + .cbks = &qr_cbks, + .options = qr_options, + .identifier = "quick-read", + .category = GF_MAINTAINED, }; |