summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormohit84 <moagrawa@redhat.com>2020-11-24 15:29:58 +0530
committerGitHub <noreply@github.com>2020-11-24 15:29:58 +0530
commit06d5cd06724bbef7970167df1cdd191717672cff (patch)
treea83454e9f28c894fca0f93afc4bfa3ab6663a85c
parent4d336a753b67a7ac000d4989d6d36e9ba78b5c99 (diff)
downloadglusterfs-06d5cd06724bbef7970167df1cdd191717672cff.tar.gz
glusterfs-06d5cd06724bbef7970167df1cdd191717672cff.tar.xz
glusterfs-06d5cd06724bbef7970167df1cdd191717672cff.zip
core: tcmu-runner process continuous growing logs lru_size showing -1 (#1776)
* core: tcmu-runner process continuous growing logs lru_size showing -1 At the time of calling inode_table_prune it checks if current lru_size is greater than lru_limit but lru_list is empty it throws a log message "Empty inode lru list found but with (%d) lru_size".As per code reading it seems lru_size is out of sync with the actual number of inodes in lru_list. Due to throwing continuous error messages entire disk is getting full and the user has to restart the tcmu-runner process to use the volumes.The log message was introduce by a patch https://review.gluster.org/#/c/glusterfs/+/15087/. Solution: Introduce a flag in_lru_list to take decision about inode is being part of lru_list or not. Fixes: #1775 Signed-off-by: Mohit Agrawal <moagrawa@redhat.com> Change-Id: I4b836bebf4b5db65fbf88ff41c6c88f4a7ac55c1 * core: tcmu-runner process continuous growing logs lru_size showing -1 Update in_lru_list flag only while modify lru_size Fixes: #1775 Change-Id: I3bea1c6e748b4f50437999bae59edeb3d7677f47 Signed-off-by: Mohit Agrawal <moagrawa@redhat.com> * core: tcmu-runner process continuous growing logs lru_size showing -1 Resolve comments in inode_table_destroy and inode_table_prune Fixes: #1775 Change-Id: I5aa4d8c254f0fe374daa5ec604f643dea8dd56ff Signed-off-by: Mohit Agrawal moagrawa@redhat.com * core: tcmu-runner process continuous growing logs lru_size showing -1 Update in_lru_list only while update lru_size Fixes: #1775 Change-Id: I950eb1f0010c3d4bcc44a33225a502d2291d1a83 Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
-rw-r--r--libglusterfs/src/glusterfs/inode.h1
-rw-r--r--libglusterfs/src/inode.c14
2 files changed, 15 insertions, 0 deletions
diff --git a/libglusterfs/src/glusterfs/inode.h b/libglusterfs/src/glusterfs/inode.h
index c126822698..d7dfb1bddd 100644
--- a/libglusterfs/src/glusterfs/inode.h
+++ b/libglusterfs/src/glusterfs/inode.h
@@ -114,6 +114,7 @@ struct _inode {
struct _inode_ctx *_ctx; /* replacement for dict_t *(inode->ctx) */
bool in_invalidate_list; /* Set if inode is in table invalidate list */
bool invalidate_sent; /* Set it if invalidator_fn is called for inode */
+ bool in_lru_list; /* Set if inode is in table lru list */
};
#define UUID0_STR "00000000-0000-0000-0000-000000000000"
diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c
index 5a15932f60..8b7cb7f41d 100644
--- a/libglusterfs/src/inode.c
+++ b/libglusterfs/src/inode.c
@@ -413,8 +413,10 @@ __inode_passivate(inode_t *inode)
dentry_t *dentry = NULL;
dentry_t *t = NULL;
+ GF_ASSERT(!inode->in_lru_list);
list_move_tail(&inode->list, &inode->table->lru);
inode->table->lru_size++;
+ inode->in_lru_list = _gf_true;
list_for_each_entry_safe(dentry, t, &inode->dentry_list, inode_list)
{
@@ -562,7 +564,10 @@ __inode_ref(inode_t *inode, bool is_invalidate)
inode->in_invalidate_list = false;
inode->table->invalidate_size--;
} else {
+ GF_ASSERT(inode->table->lru_size > 0);
+ GF_ASSERT(inode->in_lru_list);
inode->table->lru_size--;
+ inode->in_lru_list = _gf_false;
}
if (is_invalidate) {
inode->in_invalidate_list = true;
@@ -701,6 +706,8 @@ inode_new(inode_table_t *table)
{
list_add(&inode->list, &table->lru);
table->lru_size++;
+ GF_ASSERT(!inode->in_lru_list);
+ inode->in_lru_list = _gf_true;
__inode_ref(inode, false);
}
pthread_mutex_unlock(&table->lock);
@@ -1564,6 +1571,7 @@ inode_table_prune(inode_table_t *table)
lru_size = table->lru_size;
while (lru_size > (table->lru_limit)) {
if (list_empty(&table->lru)) {
+ GF_ASSERT(0);
gf_msg_callingfn(THIS->name, GF_LOG_WARNING, 0,
LG_MSG_INVALID_INODE_LIST,
"Empty inode lru list found"
@@ -1574,6 +1582,7 @@ inode_table_prune(inode_table_t *table)
lru_size--;
entry = list_entry(table->lru.next, inode_t, list);
+ GF_ASSERT(entry->in_lru_list);
/* The logic of invalidation is required only if invalidator_fn
is present */
if (table->invalidator_fn) {
@@ -1591,6 +1600,7 @@ inode_table_prune(inode_table_t *table)
}
table->lru_size--;
+ entry->in_lru_list = _gf_false;
__inode_retire(entry);
ret++;
}
@@ -1646,6 +1656,7 @@ __inode_table_init_root(inode_table_t *table)
list_add(&root->list, &table->lru);
table->lru_size++;
+ root->in_lru_list = _gf_true;
iatt.ia_gfid[15] = 1;
iatt.ia_ino = 1;
@@ -1907,8 +1918,11 @@ inode_table_destroy(inode_table_t *inode_table)
while (!list_empty(&inode_table->lru)) {
trav = list_first_entry(&inode_table->lru, inode_t, list);
inode_forget_atomic(trav, 0);
+ GF_ASSERT(inode_table->lru_size > 0);
+ GF_ASSERT(trav->in_lru_list);
__inode_retire(trav);
inode_table->lru_size--;
+ trav->in_lru_list = _gf_false;
}
/* Same logic for invalidate list */