Bug 1251106 - sharding - Renames on non-sharded files failing with ENOMEM
Summary: sharding - Renames on non-sharded files failing with ENOMEM
Keywords:
Status: CLOSED CURRENTRELEASE
Alias: None
Product: GlusterFS
Classification: Community
Component: sharding
Version: 3.7.3
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Krutika Dhananjay
QA Contact: bugs@gluster.org
URL:
Whiteboard:
Depends On: 1250855
Blocks: glusterfs-3.7.4
TreeView+ depends on / blocked
 
Reported: 2015-08-06 13:11 UTC by Krutika Dhananjay
Modified: 2015-09-09 09:39 UTC (History)
1 user (show)

Fixed In Version: glusterfs-3.7.4
Clone Of: 1250855
Environment:
Last Closed: 2015-09-09 09:39:08 UTC
Regression: ---
Mount Type: ---
Documentation: ---
CRM:
Verified Versions:
Embargoed:


Attachments (Terms of Use)

Description Krutika Dhananjay 2015-08-06 13:11:16 UTC
+++ This bug was initially created as a clone of Bug #1250855 +++

Description of problem:

Same as the subject.

Version-Release number of selected component (if applicable):


How reproducible:


Steps to Reproduce:
1. Create a plain distribute volume, start it, mount it using FUSE and create a few directories and a few files under them.
2. Enable sharding on the volume.
3. cd into one of the directories.
4. Perform ls (=> readdirp)
5. In a loop, rename all of the files under the directory.

Actual results:
Renames on some of them fails with ENOMEM.
Also seen are logs of the following kind in <mount>.log per failed rename:

[2015-08-06 07:15:08.652746] E [shard.c:2191:shard_rename] 2-dis-shard: Failed to get block size from inode ctx of c3bce9d1-37f4-4f95-8257-23a5d223149d
[2015-08-06 07:15:08.652780] W [fuse-bridge.c:1725:fuse_rename_cbk] 0-glusterfs-fuse: 59652: /bin/alsa-info -> /bin/alsa-info-sharded => -1 (Cannot allocate memory)

Expected results:


Additional info:

I tried the same experiment with one change: stat-prefetch set to off at (1) and volume mounted with entry-timeout and attribute-timeout equal to 0 and was not able to hit this issue.

Turns out this is due to shard translator expecting inode ctx to be populated for each linked inode in most fop paths, failing which it would fail the operation with ENOMEM. And the only place where shard translator initialises the inode ctx is LOOKUP. Just after the graph switch in step 2, the `ls` in step 4 could cause the entries to be fetched and linked in fuse-bridge via readdirp(). This could prevent LOOKUPs on the entries from being called or reaching shard translator before RENAMEs are wound. And a failure to GET the inode ctx in memory will cause shard translator to fail the fop with ENOMEM.

The solution would be to initialise the inode ctx in shard_readdir_cbk() if it doesn't exist already.

--- Additional comment from Anand Avati on 2015-08-06 09:09:51 EDT ---

REVIEW: http://review.gluster.org/11854 (features/shard: Fill inode ctx in readdir(p) callback too) posted (#1) for review on master by Krutika Dhananjay (kdhananj)

Comment 1 Anand Avati 2015-08-08 13:23:16 UTC
REVIEW: http://review.gluster.org/11866 (features/shard: Fill inode ctx in readdir(p) callback too) posted (#1) for review on release-3.7 by Krutika Dhananjay (kdhananj)

Comment 2 Anand Avati 2015-08-12 12:11:18 UTC
COMMIT: http://review.gluster.org/11866 committed in release-3.7 by Raghavendra G (rgowdapp) 
------
commit e4726e843574c0db108fce1fc375241b72d7aed4
Author: Krutika Dhananjay <kdhananj>
Date:   Thu Aug 6 12:19:23 2015 +0530

    features/shard: Fill inode ctx in readdir(p) callback too
    
            Backport of: http://review.gluster.org/#/c/11854/
    
    The only place where shard translator was initialising inode ctx
    was lookup callback. But if the inodes are created and linked through
    readdirp, shard_lookup() path _may_ not be exercised before FUSE
    winds other fops on them. Since shard translator does an
    inode_ctx_get() first thing in most fops, an uninitialised ctx could
    cause it to fail the operation with ENOMEM.
    
    The solution would be to also initialise inode ctx if it has not been
    done already in readdir(p) callback.
    
    Change-Id: I6384e2d4c6b443c02c6620bbbc38279ddfad18ae
    BUG: 1251106
    Signed-off-by: Krutika Dhananjay <kdhananj>
    Reviewed-on: http://review.gluster.org/11866
    Tested-by: NetBSD Build System <jenkins.org>
    Tested-by: Gluster Build System <jenkins.com>
    Reviewed-by: Raghavendra G <rgowdapp>

Comment 3 Kaushal 2015-09-09 09:39:08 UTC
This bug is getting closed because a release has been made available that should address the reported issue. In case the problem is still not fixed with glusterfs-3.7.4, please open a new bug report.

glusterfs-3.7.4 has been announced on the Gluster mailinglists [1], packages for several distributions should become available in the near future. Keep an eye on the Gluster Users mailinglist [2] and the update infrastructure for your distribution.

[1] http://thread.gmane.org/gmane.comp.file-systems.gluster.devel/12496
[2] http://thread.gmane.org/gmane.comp.file-systems.gluster.user


Note You need to log in before you can comment on or make changes to this bug.