+++ 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)
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)
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>
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