3604df
From e823c2f8f4b53aedc2bd69408966ca2df5869bfa Mon Sep 17 00:00:00 2001
3604df
From: moagrawa <moagrawa@redhat.com>
3604df
Date: Thu, 2 Feb 2017 09:26:25 +0530
3604df
Subject: [PATCH 281/285] rpc/socket.c : Bonnie++ hangs during rewrites in
3604df
 ganesha + SSL
3604df
3604df
Problem: Bonnie++ rewrite operation hangs in ganesha + SSL environment
3604df
3604df
Solution: Bonnie++ hangs during execution of rewrite operation in
3604df
          ganesha + SSL environment.It was hanged due to blocking on poll
3604df
          call in ssl_do because no POLLOUT event was getting on socket.
3604df
          Socket is not getting POLLOUT event because all other threads
3604df
          are waiting to get lock and lock is not released ssl_do
3604df
          because it is not getting any event on poll.To correct it
3604df
          update the condition in ssl_do as same in getting error
3604df
          SSL_ERROR_WANT_READ.
3604df
3604df
Test:     To test the patch followed below procedure
3604df
          1) Setup 2X2 Ganesha + SSL environment.
3604df
          2) Run bonnie from 3 nfs client parallely
3604df
          3) After run "Rewwrite operation" by bonnie it is hanged.
3604df
          4) After apply the patch it is not hanged.
3604df
3604df
> BUG: 1418213
3604df
> Change-Id: I5985cbbc4cfdac5d287268d791e31c274abc3c8d
3604df
> Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
3604df
> Reviewed-on: https://review.gluster.org/16501
3604df
> Smoke: Gluster Build System <jenkins@build.gluster.org>
3604df
> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
3604df
> Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
3604df
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
3604df
> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
3604df
> cherry picked from commit d7077bca4b372a056d23416294e729637e9af94e
3604df
3604df
BUG: 1408576
3604df
Change-Id: Ida63faaf07f090f2e433fc19630bbb18f6b4619b
3604df
Signed-off-by: moagrawa <moagrawa@redhat.com>
3604df
Reviewed-on: https://code.engineering.redhat.com/gerrit/96684
3604df
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
3604df
---
3604df
 rpc/rpc-transport/socket/src/socket.c | 5 +++++
3604df
 1 file changed, 5 insertions(+)
3604df
3604df
diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c
3604df
index da2f97f..7314047 100644
3604df
--- a/rpc/rpc-transport/socket/src/socket.c
3604df
+++ b/rpc/rpc-transport/socket/src/socket.c
3604df
@@ -263,6 +263,11 @@ ssl_do (rpc_transport_t *this, void *buf, size_t len, SSL_trinary_func *func)
3604df
 			}
3604df
 			break;
3604df
 		case SSL_ERROR_WANT_WRITE:
3604df
+                        if ((func == (SSL_trinary_func *)SSL_read)
3604df
+                            || (func == (SSL_trinary_func *) SSL_write)) {
3604df
+                                errno = EAGAIN;
3604df
+                                return r;
3604df
+                        }
3604df
 			pfd.fd = priv->sock;
3604df
 			pfd.events = POLLOUT;
3604df
 			if (poll(&pfd,1,-1) < 0) {
3604df
-- 
3604df
2.9.3
3604df