Red Hat Bugzilla – Bug 1250855
sharding - Renames on non-sharded files failing with ENOMEM
Last modified: 2016-06-16 09:29:42 EDT
Description of problem:
Same as the subject.
Version-Release number of selected component (if applicable):
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.
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)
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.
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 (firstname.lastname@example.org)
REVIEW: http://review.gluster.org/11854 (features/shard: Fill inode ctx in readdir(p) callback too) posted (#2) for review on master by Pranith Kumar Karampuri (email@example.com)
COMMIT: http://review.gluster.org/11854 committed in master by Raghavendra G (firstname.lastname@example.org)
Author: Krutika Dhananjay <email@example.com>
Date: Thu Aug 6 12:19:23 2015 +0530
features/shard: Fill inode ctx in readdir(p) callback too
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.
Signed-off-by: Krutika Dhananjay <firstname.lastname@example.org>
Tested-by: NetBSD Build System <email@example.com>
Reviewed-by: Pranith Kumar Karampuri <firstname.lastname@example.org>
Tested-by: Gluster Build System <email@example.com>
Fix for this BZ is already present in a GlusterFS release. You can find clone of this BZ, fixed in a GlusterFS release and closed. Hence closing this mainline BZ as well.
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.8.0, please open a new bug report.
glusterfs-3.8.0 has been announced on the Gluster mailinglists , packages for several distributions should become available in the near future. Keep an eye on the Gluster Users mailinglist  and the update infrastructure for your distribution.