From 3e7c6b338deb7a8b95b208b1aa087f97fb58549f Mon Sep 17 00:00:00 2001 From: Raghavendra G Date: Fri, 25 May 2018 08:16:41 +0530 Subject: [PATCH 287/305] Revert "performance/write-behind: fix flush stuck by former failed writes" This reverts commit 9340b3c7a6c8556d6f1d4046de0dbd1946a64963. operations/writes across different fds of the same file cannot be considered as independent. For eg., man 2 fsync states, fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache pages for) the file referred to by the file descriptor fd to the disk device This means fsync is an operation on file and fd is just a way to reach file. So, it has to sync writes done on other fds too. Patch 9340b3c7a6c, prevents this. The problem fixed by patch 9340b3c7a6c - a flush on an fd is hung on a failed write (held in cache for retrying) on a different fd - is solved in this patch by making sure __wb_request_waiting_on considers failed writes on any fd as dependent on flush/fsync on any fd (not just the fd on which writes happened) opened on the same file. This means failed writes on any fd are either synced or thrown away on witnessing flush/fsync on any fd of the same file. >Change-Id: Iee748cebb6d2a5b32f9328aff2b5b7cbf6c52c05 >Signed-off-by: Raghavendra G >Updates: bz#1512691 upstream patch: https://review.gluster.org/20082 BUG: 1518710 Change-Id: Ie9df1cb2fcd698db3d186485fd61ea6dc1c1fcb7 Signed-off-by: Raghavendra G Reviewed-on: https://code.engineering.redhat.com/gerrit/140063 Tested-by: RHGS Build Bot Reviewed-by: Csaba Henk Tested-by: Csaba Henk Reviewed-by: Sunil Kumar Heggodu Gopala Acharya --- xlators/performance/write-behind/src/write-behind.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/xlators/performance/write-behind/src/write-behind.c b/xlators/performance/write-behind/src/write-behind.c index 7104eb9..ca1cb63 100644 --- a/xlators/performance/write-behind/src/write-behind.c +++ b/xlators/performance/write-behind/src/write-behind.c @@ -287,10 +287,6 @@ wb_requests_conflict (wb_request_t *lie, wb_request_t *req) us in the todo list */ return _gf_false; - /* requests from different fd do not conflict with each other. */ - if (req->fd && (req->fd != lie->fd)) - return _gf_false; - if (lie->ordering.append) /* all modifications wait for the completion of outstanding append */ @@ -743,9 +739,8 @@ __wb_request_waiting_on (wb_request_t *req) wb_inode = req->wb_inode; list_for_each_entry (trav, &wb_inode->todo, todo) { - if ((trav->fd == req->fd) - && ((trav->stub->fop == GF_FOP_FLUSH) - || (trav->stub->fop == GF_FOP_FSYNC)) + if (((trav->stub->fop == GF_FOP_FLUSH) || (trav->stub->fop + == GF_FOP_FSYNC)) && (trav->gen >= req->gen)) return trav; } -- 1.8.3.1