scripts/rpc: add timeout waiting for response

Optional '-t' parameter with default 60s.

Change-Id: Id1124d16ad2fc205433ee1e643939502c4641547
Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-on: https://review.gerrithub.io/403350
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Pawel Wodkowski 2018-03-09 16:20:34 +01:00 committed by Jim Harris
parent 43ae70924c
commit 14c4a4286f
2 changed files with 25 additions and 7 deletions

View File

@ -11,6 +11,9 @@ if __name__ == "__main__":
parser.add_argument('-p', dest='port',
help='RPC port number (if server_addr is IP address)',
default=5260, type=int)
parser.add_argument('-t', dest='timeout',
help='Timout as a floating point number expressed in seconds waiting for reponse. Default: 60.0',
default=60.0, type=float)
parser.add_argument('-v', dest='verbose',
help='Verbose mode', action='store_true')
subparsers = parser.add_subparsers(help='RPC methods')
@ -503,5 +506,5 @@ if __name__ == "__main__":
args = parser.parse_args()
args.client = rpc.client.JSONRPCClient(args.server_addr, args.port, args.verbose)
args.client = rpc.client.JSONRPCClient(args.server_addr, args.port, args.verbose, args.timeout)
args.func(args)

View File

@ -1,5 +1,6 @@
import json
import socket
import time
try:
from shlex import quote
@ -20,8 +21,9 @@ def int_arg(arg):
class JSONRPCClient(object):
def __init__(self, addr, port=None, verbose=False):
def __init__(self, addr, port=None, verbose=False, timeout=60.0):
self.verbose = verbose
self.timeout = timeout
if addr.startswith('/'):
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.sock.connect(addr)
@ -56,13 +58,23 @@ class JSONRPCClient(object):
buf = ''
closed = False
response = {}
start_time = time.clock()
while not closed:
newdata = self.sock.recv(4096)
if (newdata == b''):
closed = True
buf += newdata
try:
timeout = self.timeout - (time.clock() - start_time)
if timeout <= 0.0:
break
self.sock.settimeout(timeout)
newdata = self.sock.recv(4096)
if (newdata == b''):
closed = True
buf += newdata
response = json.loads(buf)
except socket.timeout:
break
except ValueError:
continue # incomplete response; keep buffering
break
@ -70,7 +82,10 @@ class JSONRPCClient(object):
if not response:
if method == "kill_instance":
exit(0)
print "Connection closed with partial response:"
if closed:
print "Connection closed with partial response:"
else:
print "Timeout while waiting for response:"
print buf
exit(1)