diff options
author | Xavi Hernandez <jahernan@redhat.com> | 2019-09-25 11:56:35 +0200 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2019-09-26 13:59:51 +0000 |
commit | 61f768eddecc52eb1ba44169526dd674864d0aa1 (patch) | |
tree | cb503339483bbfcebc2a366524e1d841bc0e5128 /xlators/cluster/ec/src/ec.c | |
parent | 80cb838773f3574f68b1fa821fcb712ada350309 (diff) |
cluster/ec: prevent filling shd log with "table not found" messages
When self-heal daemon receives an inodelk contention notification, it tries
to locate the related inode using inode_find() and the inode table owned by
top-most xlator, which in this case doesn't have any inode table. This causes
many messages to be logged by inode_find() function because the inode table
passed is NULL.
This patch prevents this by making sure the inode table is not NULL before
calling inode_find().
Change-Id: I8d001bd180aaaf1521ba40a536b097fcf70c991f
Fixes: bz#1755344
Signed-off-by: Xavi Hernandez <jahernan@redhat.com>
Diffstat (limited to 'xlators/cluster/ec/src/ec.c')
-rw-r--r-- | xlators/cluster/ec/src/ec.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/xlators/cluster/ec/src/ec.c b/xlators/cluster/ec/src/ec.c index f75ad395a4c..d91d77a4962 100644 --- a/xlators/cluster/ec/src/ec.c +++ b/xlators/cluster/ec/src/ec.c @@ -516,6 +516,7 @@ ec_upcall(ec_t *ec, struct gf_upcall *upcall) struct gf_upcall_cache_invalidation *ci = NULL; struct gf_upcall_inodelk_contention *lc = NULL; inode_t *inode; + inode_table_t *table; switch (upcall->event_type) { case GF_UPCALL_CACHE_INVALIDATION: @@ -529,8 +530,18 @@ ec_upcall(ec_t *ec, struct gf_upcall *upcall) /* The lock is not owned by EC, ignore it. */ return _gf_true; } - inode = inode_find(((xlator_t *)ec->xl->graph->top)->itable, - upcall->gfid); + table = ((xlator_t *)ec->xl->graph->top)->itable; + if (table == NULL) { + /* Self-heal daemon doesn't have an inode table on the top + * xlator because it doesn't need it. In this case we should + * use the inode table managed by EC itself where all inodes + * being healed should be present. However self-heal doesn't + * use eager-locking and inodelk's are already released as + * soon as possible. In this case we can safely ignore these + * notifications. */ + return _gf_false; + } + inode = inode_find(table, upcall->gfid); /* If inode is not found, it means that it's already released, * so we can ignore it. Probably it has been released and * destroyed while the contention notification was being sent. |