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',
|
parser.add_argument('-p', dest='port',
|
||||||
help='RPC port number (if server_addr is IP address)',
|
help='RPC port number (if server_addr is IP address)',
|
||||||
default=5260, type=int)
|
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',
|
parser.add_argument('-v', dest='verbose',
|
||||||
help='Verbose mode', action='store_true')
|
help='Verbose mode', action='store_true')
|
||||||
subparsers = parser.add_subparsers(help='RPC methods')
|
subparsers = parser.add_subparsers(help='RPC methods')
|
||||||
@ -503,5 +506,5 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
args = parser.parse_args()
|
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)
|
args.func(args)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import json
|
import json
|
||||||
import socket
|
import socket
|
||||||
|
import time
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from shlex import quote
|
from shlex import quote
|
||||||
@ -20,8 +21,9 @@ def int_arg(arg):
|
|||||||
|
|
||||||
|
|
||||||
class JSONRPCClient(object):
|
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.verbose = verbose
|
||||||
|
self.timeout = timeout
|
||||||
if addr.startswith('/'):
|
if addr.startswith('/'):
|
||||||
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
||||||
self.sock.connect(addr)
|
self.sock.connect(addr)
|
||||||
@ -56,13 +58,23 @@ class JSONRPCClient(object):
|
|||||||
buf = ''
|
buf = ''
|
||||||
closed = False
|
closed = False
|
||||||
response = {}
|
response = {}
|
||||||
|
start_time = time.clock()
|
||||||
|
|
||||||
while not closed:
|
while not closed:
|
||||||
|
try:
|
||||||
|
timeout = self.timeout - (time.clock() - start_time)
|
||||||
|
if timeout <= 0.0:
|
||||||
|
break
|
||||||
|
|
||||||
|
self.sock.settimeout(timeout)
|
||||||
newdata = self.sock.recv(4096)
|
newdata = self.sock.recv(4096)
|
||||||
if (newdata == b''):
|
if (newdata == b''):
|
||||||
closed = True
|
closed = True
|
||||||
|
|
||||||
buf += newdata
|
buf += newdata
|
||||||
try:
|
|
||||||
response = json.loads(buf)
|
response = json.loads(buf)
|
||||||
|
except socket.timeout:
|
||||||
|
break
|
||||||
except ValueError:
|
except ValueError:
|
||||||
continue # incomplete response; keep buffering
|
continue # incomplete response; keep buffering
|
||||||
break
|
break
|
||||||
@ -70,7 +82,10 @@ class JSONRPCClient(object):
|
|||||||
if not response:
|
if not response:
|
||||||
if method == "kill_instance":
|
if method == "kill_instance":
|
||||||
exit(0)
|
exit(0)
|
||||||
|
if closed:
|
||||||
print "Connection closed with partial response:"
|
print "Connection closed with partial response:"
|
||||||
|
else:
|
||||||
|
print "Timeout while waiting for response:"
|
||||||
print buf
|
print buf
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user