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:
parent
43ae70924c
commit
14c4a4286f
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user