Bug 1233147
Summary: | [Backup]: Rename and simultaneous movement of a hardlink logs an incorrect entry of RENAME | ||
---|---|---|---|
Product: | [Red Hat Storage] Red Hat Gluster Storage | Reporter: | Sweta Anandpara <sanandpa> |
Component: | glusterfind | Assignee: | Milind Changire <mchangir> |
Status: | CLOSED ERRATA | QA Contact: | Sweta Anandpara <sanandpa> |
Severity: | medium | Docs Contact: | |
Priority: | medium | ||
Version: | rhgs-3.1 | CC: | asrivast, avishwan, khiremat, mchangir, rhs-bugs, storage-qa-internal, vagarwal |
Target Milestone: | --- | ||
Target Release: | RHGS 3.1.0 | ||
Hardware: | Unspecified | ||
OS: | Unspecified | ||
Whiteboard: | |||
Fixed In Version: | glusterfs-3.7.1-8 | Doc Type: | Bug Fix |
Doc Text: | Story Points: | --- | |
Clone Of: | Environment: | ||
Last Closed: | 2015-07-29 05:06:04 UTC | Type: | Bug |
Regression: | --- | Mount Type: | --- |
Documentation: | --- | CRM: | |
Verified Versions: | Category: | --- | |
oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |
Cloudforms Team: | --- | Target Upstream Version: | |
Embargoed: | |||
Bug Depends On: | |||
Bug Blocks: | 1202842, 1223636 |
Description
Sweta Anandpara
2015-06-18 10:31:48 UTC
In case of RENAME hard-link, glusterfind should use the base-name of the old file after constructing the dir-name from the PGFID. I think this should be done as a generic case rather than specifically for hard links. The issue is manifest only with a MODIFY hard-link-1 operation followed by a RENAME hard-link-2 operation. A single RENAME hard-link on its own in a glusterfind session gets correctly emitted as a RENAME hard-link-2 new-hard-link-2 The fix for https://bugzilla.redhat.com/show_bug.cgi?id=1228247 also fixes this Downstream Patch: https://code.engineering.redhat.com/gerrit/#/c/52285/ Verified this on the build 3.7.1-8 build and do see an issue with multiple modify and rename of hardlinks. Detailed logs are pasted below, and sosreports attached in: http://rhsqe-repo.lab.eng.blr.redhat.com/sosreports/1233147 SERVER ========= [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# gluster v list testvol [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# rpm -qa | grep gluster glusterfs-libs-3.7.1-8.el6rhs.x86_64 glusterfs-fuse-3.7.1-8.el6rhs.x86_64 glusterfs-3.7.1-8.el6rhs.x86_64 glusterfs-api-3.7.1-8.el6rhs.x86_64 glusterfs-cli-3.7.1-8.el6rhs.x86_64 glusterfs-geo-replication-3.7.1-8.el6rhs.x86_64 glusterfs-client-xlators-3.7.1-8.el6rhs.x86_64 glusterfs-server-3.7.1-8.el6rhs.x86_64 [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# gluster v create ozone replica 2 10.70.43.140:/rhs/thinbrick1/ozone 10.70.42.75:/rhs/thinbrick1/ozone 10.70.43.140:/rhs/thinbrick2/ozone 10.70.42.75:/rhs/thinbrick2/ozone volume create: ozone: success: please start the volume to access data [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# gluster v info ozone Volume Name: ozone Type: Distributed-Replicate Volume ID: aa2e4386-ab12-4d17-8cf6-894e29e94563 Status: Created Number of Bricks: 2 x 2 = 4 Transport-type: tcp Bricks: Brick1: 10.70.43.140:/rhs/thinbrick1/ozone Brick2: 10.70.42.75:/rhs/thinbrick1/ozone Brick3: 10.70.43.140:/rhs/thinbrick2/ozone Brick4: 10.70.42.75:/rhs/thinbrick2/ozone Options Reconfigured: performance.readdir-ahead: on [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# gluster v start ozone volume start: ozone: success [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# gluster v info ozone Volume Name: ozone Type: Distributed-Replicate Volume ID: aa2e4386-ab12-4d17-8cf6-894e29e94563 Status: Started Number of Bricks: 2 x 2 = 4 Transport-type: tcp Bricks: Brick1: 10.70.43.140:/rhs/thinbrick1/ozone Brick2: 10.70.42.75:/rhs/thinbrick1/ozone Brick3: 10.70.43.140:/rhs/thinbrick2/ozone Brick4: 10.70.42.75:/rhs/thinbrick2/ozone Options Reconfigured: performance.readdir-ahead: on [root@dhcp43-140 ~]# glusterfind list SESSION VOLUME SESSION TIME --------------------------------------------------------------------------- testvol_session_53 testvol 2015-07-07 00:00:23 [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# glusterfind create so1 ozone Session so1 created with volume ozone [root@dhcp43-140 ~]# glusterfind create so12ozone usage: glusterfind create [-h] [--debug] [--force] [--reset-session-time] session volume glusterfind create: error: too few arguments [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# glusterfind create so12 ozone Session so12 created with volume ozone [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# glusterfind delete so12 ozone root.42.75's password: root.42.75's password: root.42.75's password: Session so12 with volume ozone deleted [root@dhcp43-140 ~]# glusterfind list SESSION VOLUME SESSION TIME --------------------------------------------------------------------------- testvol_session_53 testvol 2015-07-07 00:00:23 so1 ozone 2015-07-09 21:30:24 [root@dhcp43-140 ~]# glusterfind create so2 ozone Session so2 created with volume ozone [root@dhcp43-140 ~]# glusterfind create so3 ozone Session so3 created with volume ozone [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# glusterfind list SESSION VOLUME SESSION TIME --------------------------------------------------------------------------- so2 ozone 2015-07-09 21:31:31 testvol_session_53 testvol 2015-07-07 00:00:23 so1 ozone 2015-07-09 21:30:24 so3 ozone 2015-07-09 21:32:37 [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# glusterfind pre so1 ozone /tmp/out1 Generated output file /tmp/out1 [root@dhcp43-140 ~]# cat /tmp/out1 MODIFY .trashcan%2F NEW test1 NEW test2 NEW test3 NEW dir1 NEW dir1%2F%2Fdir2 NEW dir1%2Fdir2%2F%2Fdir3 NEW dir1%2Fdir2%2Fdir3%2F%2Fdir4 NEW d1 NEW d1%2F%2Fd2 NEW d1%2Fd2%2F%2Fd3 [root@dhcp43-140 ~]# glusterfind post so1 ozone Session so1 with volume ozone updated [root@dhcp43-140 ~]# glusterfind pre so1 ozone /tmp/out1 Generated output file /tmp/out1 [root@dhcp43-140 ~]# cat /tmp/out1 NEW dir1%2Fdir2%2Fdir3%2F%2Fd3a [root@dhcp43-140 ~]# glusterfind post so1 ozone Session so1 with volume ozone updated [root@dhcp43-140 ~]# glusterfind pre so1 ozone /tmp/out1 Generated output file /tmp/out1 [root@dhcp43-140 ~]# cat /tmp/out1 RENAME dir1%2Fdir2%2Fdir3%2F%2Fd3a d3a MODIFY d3a [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# glusterfind post so1 ozone Session so1 with volume ozone updated [root@dhcp43-140 ~]# glusterfind pre so1 ozone /tmp/out1 Generated output file /tmp/out1 [root@dhcp43-140 ~]# cat /tmp/out1 MODIFY .trashcan%2Finternal_op%2F RENAME test1 dir1%2Fdir2%2F%2Ftest1 MODIFY dir1%2Fdir2%2Ftest1 [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# glusterfind post so1 ozone Session so1 with volume ozone updated [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# glusterfind pre so2 ozone /tmp/out2 Generated output file /tmp/out2 [root@dhcp43-140 ~]# glusterfind pre so1 ozone /tmp/out1 Generated output file /tmp/out1 [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# cat /tmp/out1 RENAME test2 dir1%2Fdir2%2Fdir3%2Fdir4%2F%2Ftest22 MODIFY dir1%2Fdir2%2Fdir3%2Fdir4%2Ftest22 [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# cat /tmp/out2 MODIFY .trashcan%2F NEW dir1%2Fdir2%2F%2Ftest1 NEW dir1%2Fdir2%2Fdir3%2Fdir4%2F%2Ftest22 NEW test3 NEW dir1 NEW dir1%2F%2Fdir2 NEW dir1%2Fdir2%2F%2Fdir3 NEW dir1%2Fdir2%2Fdir3%2F%2Fdir4 NEW d1 NEW d1%2F%2Fd2 NEW d1%2Fd2%2F%2Fd3 NEW d3a MODIFY .trashcan%2Finternal_op%2F [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# glusterfind post so1 ozone Session so1 with volume ozone updated [root@dhcp43-140 ~]# glusterfind post so2 ozone Session so2 with volume ozone updated [root@dhcp43-140 ~]# glusterfind pre so1 ozone /tmp/out1 Generated output file /tmp/out1 [root@dhcp43-140 ~]# cat /tmp/out1 NEW dir1%2Fdir2%2F%2Ftest22_link NEW test3_ln [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# glusterfind post so2 ozone Pre script is not run [root@dhcp43-140 ~]# glusterfind post so1 ozone Session so1 with volume ozone updated [root@dhcp43-140 ~]# glusterfind pre so1 ozone /tmp/out1 Generated output file /tmp/out1 [root@dhcp43-140 ~]# cat /tmp/out1 RENAME test3_ln d1%2Fd2%2Fd3%2F%2Ftest3_link2 [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# [root@dhcp43-140 ~]# glusterfind post so1 ozone Session so1 with volume ozone updated [root@dhcp43-140 ~]# glusterfind pre so1 ozone /tmp/out1 Generated output file /tmp/out1 [root@dhcp43-140 ~]# cat /tmp/out1 RENAME dir1%2Fdir2%2F%2Ftest22_link test22_link RENAME dir1%2Fdir2%2Fdir3%2Fdir4%2Ftest22 test22_link MODIFY dir1%2Fdir2%2Fdir3%2Fdir4%2Ftest22 MODIFY test22_link [root@dhcp43-140 ~]# CLIENT ======== [root@dhcp43-71 ~]# [root@dhcp43-71 ~]# mount | grep testvol 10.70.43.93:testvol on /mnt/glusterfs type fuse.glusterfs (rw,default_permissions,allow_other,max_read=131072) [root@dhcp43-71 ~]# [root@dhcp43-71 ~]# [root@dhcp43-71 ~]# mount | grep oz 10.70.42.30:/ozone on /mnt/ozone type fuse.glusterfs (rw,default_permissions,allow_other,max_read=131072) 10.70.43.93:/ozone on /mnt/oz type fuse.glusterfs (rw,default_permissions,allow_other,max_read=131072) [root@dhcp43-71 ~]# umount /mnt/ozone [root@dhcp43-71 ~]# mount -t glusterfs 10.70.43.140:/ozone /mnt/ozone [root@dhcp43-71 ~]# cd /mnt/ozone [root@dhcp43-71 ozone]# ls -a . .. .trashcan [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# echo "what a beautiful day" > test1 [root@dhcp43-71 ozone]# echo "hello world" > test2 [root@dhcp43-71 ozone]# touch test3 [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# mkdir -p dir1/dir2/dir3/dir4 [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# ls -a . .. dir1 test1 test2 test3 .trashcan [root@dhcp43-71 ozone]# mkdir -p d1/d2/d3 [root@dhcp43-71 ozone]# touch d1/dia [root@dhcp43-71 ozone]# rm d1/dia rm: remove regular empty file `d1/dia'? y [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# echo "whatever" > d1/d2/d3/d3a [root@dhcp43-71 ozone]# mv d1/d2/d3/d3a dir1/dir2/dir3/ [root@dhcp43-71 ozone]# ls d1/d2/d3/ [root@dhcp43-71 ozone]# ls dir1/dir2/dir3/ d3a dir4 [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# echo 'whatever again' >> dir1/dir2/dir3/d3a [root@dhcp43-71 ozone]# mv dir1/dir2/dir3/d3a . [root@dhcp43-71 ozone]# ls -a . .. d1 d3a dir1 test1 test2 test3 .trashcan [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# find . ./.trashcan ./.trashcan/internal_op ./test1 ./test2 ./dir1 ./dir1/dir2 ./dir1/dir2/dir3 ./dir1/dir2/dir3/dir4 ./d1 ./d1/d2 ./d1/d2/d3 ./d3a ./test3 [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# cat test1 what a beautiful day [root@dhcp43-71 ozone]# echo ".. and it is raining" >> test1 [root@dhcp43-71 ozone]# mv test1 dir1/dir2/ [root@dhcp43-71 ozone]# mv dir1/dir2/test1 dir1/dir2/dir3/dir4/ [root@dhcp43-71 ozone]# echo ".. even more" >> dir1/dir2/dir3/dir4/test1 [root@dhcp43-71 ozone]# mv dir1/dir2/dir3/dir4/test1 dir1/dir2/ [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# ls -lrt total 3 -rw-r--r--. 1 root root 12 Jul 9 21:43 test2 -rw-r--r--. 1 root root 0 Jul 9 21:43 test3 drwxr-xr-x. 3 root root 34 Jul 9 21:43 dir1 drwxr-xr-x. 3 root root 30 Jul 10 00:16 d1 -rw-r--r--. 1 root root 24 Jul 10 00:20 d3a [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# mv test2 test2new [root@dhcp43-71 ozone]# mv test2new d1/d2/ [root@dhcp43-71 ozone]# cat d1/d2/test2new hello world [root@dhcp43-71 ozone]# echo ".." >> d1/d2/test2new [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# echo "here I come.. " >> d1/d2/test2new [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# mv d1/d2/test2new d1/d2/test22 [root@dhcp43-71 ozone]# mv d1/d2/test22 dir1/dir2/dir3/dir4/ [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# l s-lrt -bash: l: command not found [root@dhcp43-71 ozone]# ls -lrt total 3 -rw-r--r--. 1 root root 0 Jul 9 21:43 test3 drwxr-xr-x. 3 root root 34 Jul 9 21:43 dir1 drwxr-xr-x. 3 root root 30 Jul 10 00:16 d1 -rw-r--r--. 1 root root 24 Jul 10 00:20 d3a [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# ln dir1/dir2/dir3/dir4/test22 dir1/dir2/test22_link [root@dhcp43-71 ozone]# ls dir1/dir2/test22_link dir1/dir2/test22_link [root@dhcp43-71 ozone]# ll dir1/dir2/test22_link -rw-r--r--. 2 root root 30 Jul 10 00:26 dir1/dir2/test22_link [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# cat dir1/dir2/test22_link hello world .. here I come.. [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# link test3 test3_link [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# mv test3_link test3_ln [root@dhcp43-71 ozone]# l s-lrt -bash: l: command not found [root@dhcp43-71 ozone]# ls -lrt total 3 -rw-r--r--. 2 root root 0 Jul 9 21:43 test3_ln -rw-r--r--. 2 root root 0 Jul 9 21:43 test3 drwxr-xr-x. 3 root root 34 Jul 9 21:43 dir1 drwxr-xr-x. 3 root root 30 Jul 10 00:16 d1 -rw-r--r--. 1 root root 24 Jul 10 00:20 d3a [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# mv test3_ln d1/d2/d3/test3_link [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# mv d1/d2/d3/test3_link d1/d2/d3/test3_link2 [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# ls d1/d2/d3/ test3_link2 [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# cat dir1/dir2/ dir3/ test1 test22_link [root@dhcp43-71 ozone]# cat dir1/dir2/test22_link hello world .. here I come.. [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# echo "still coming" >> dir1/dir2/test22_link [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# mv dir1/dir2/test22_link . [root@dhcp43-71 ozone]# [root@dhcp43-71 ozone]# ls -lrt total 3 -rw-r--r--. 2 root root 0 Jul 9 21:43 test3 drwxr-xr-x. 3 root root 34 Jul 9 21:43 dir1 drwxr-xr-x. 3 root root 30 Jul 10 00:16 d1 -rw-r--r--. 1 root root 24 Jul 10 00:20 d3a -rw-r--r--. 2 root root 43 Jul 10 00:35 test22_link [root@dhcp43-71 ozone]# The issue which was originally filed logged an incorrect entry of rename - which would be incorrect representation of the filesystem. The present behaviour shows that the correct entry IS logged, along with an incorrect entry. In other words: instead of one RENAME, we get two RENAME entries. But the correct entry does get logged *first* everytime. Provided the second RENAME entry fails with eexist error (by whichever application that might use this api). Will raise a new bug for the issue that is mentioned above, and move this to fixed in 3.1 everglades. Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://rhn.redhat.com/errata/RHSA-2015-1495.html |