Description of problem: When client sends DELETE request for an object which does not exist, gluster-swift internally calls unlink() despite determining earlier that the file does not exist. Version-Release number of selected component (if applicable): RHGS 3.1.3 swiftonfile-2.3.0-3.el7rhgs How reproducible: Send a DELETE request on a non-existent object. Steps to Reproduce: 1. Create a container 2. Send DELETE for a non-existing object curl -i http://localhost:8080/v1/AUTH_test/c1/blah_blah -X DELETE HTTP/1.1 404 Not Found Content-Length: 70 Content-Type: text/html; charset=UTF-8 X-Trans-Id: txb18a11352229424c9a7eb-005775136a Date: Thu, 30 Jun 2016 12:41:14 GMT <html><h1>Not Found</h1><p>The resource could not be found.</p></html> Before sending DELETE, attach strace to object-server process and monitor syscalls. root# ps aux | grep object-server root 1398 0.7 1.2 266960 26268 ? Ss 18:10 0:00 /usr/bin/python /usr/bin/swift-object-server /etc/swift/object-server.conf root 1427 0.0 1.1 1413920 22756 ? Sl 18:10 0:00 /usr/bin/python /usr/bin/swift-object-server /etc/swift/object-server.conf root 1510 0.0 0.1 112672 2100 pts/1 S+ 18:10 0:00 grep --color=auto object-server root# strace -ff -p 1398,1427 Process 1398 attached Process 1427 attached with 21 threads [pid 1427] getxattr("/mnt/gluster-object/test/c1/f1", "user.swift.metadata", 0x0, 0) = -1 ENOENT (No such file or directory) [pid 1427] getxattr("/mnt/gluster-object/test/c1/f1", "user.swift.metadata", 0x0, 0) = -1 ENOENT (No such file or directory) [pid 1427] unlink("/mnt/gluster-object/test/c1/f1") = -1 ENOENT (No such file or directory) Actual results: unlink() is called on the non-existent path. Expected results: unlink() should not be called non-existent path.
Upstream patch: http://review.gluster.org/#/c/14501/
Upstream change has been merged.
Downstream changes have been submitted and merged. rhel7 - https://code.engineering.redhat.com/gerrit/#/c/85036/ rhel6 - https://code.engineering.redhat.com/gerrit/#/c/85055/
Verified When a DELETE is sent on a non-existent object , there was a unlink call which gluster.swift was making. With the fix, when a DELETE is sent on a non-existent object , gluster swift doesn't call unlink.Tried with deleting multiple objects (10000) curl -i httv1/AUTH_test/dir1/fake -X DELETE strace -ff -p 11860,11883 [pid 11883] poll([{fd=12, events=POLLIN|POLLPRI|POLLERR|POLLHUP}, {fd=4, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 2, 60000) = 1 ([{fd=4, revents=POLLIN}]) [pid 11883] accept(4, {sa_family=AF_INET, sin_port=htons(35514), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5 [pid 11883] fcntl(5, F_GETFL) = 0x2 (flags O_RDWR) [pid 11883] fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0 [pid 11883] fcntl(5, F_GETFL) = 0x802 (flags O_RDWR|O_NONBLOCK) [pid 11883] fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0 [pid 11883] accept(4, 0x7ffda869aa90, [16]) = -1 EAGAIN (Resource temporarily unavailable) [pid 11883] recvfrom(5, "DELETE /test/0/AUTH_test/dir1/fa"..., 65536, 0, NULL, NULL) = 422 [pid 11883] getsockname(5, {sa_family=AF_INET, sin_port=htons(6010), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 [pid 11883] lstat("/mnt/gluster-object/test", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 11883] lstat("/mnt/gluster-object/test/..", {st_mode=S_IFDIR|0755, st_size=63, ...}) = 0 [pid 11883] getxattr("/mnt/gluster-object/test/dir1/fake", "user.swift.metadata", 0x0, 0) = -1 ENOENT (No such file or directory) [pid 11883] sendto(5, "HTTP/1.1 404 Not Found\r\nContent-"..., 251, 0, NULL, 0) = 251 [pid 11883] shutdown(5, SHUT_RDWR) = 0 [pid 11883] close(5) = 0 [pid 11883] poll([{fd=12, events=POLLIN|POLLPRI|POLLERR|POLLHUP}, {fd=4, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 2, 60000 Marking the BZ verified.
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/RHBA-2017-0488.html