Commit 14c4a428 authored by Pawel Wodkowski's avatar Pawel Wodkowski Committed by Jim Harris
Browse files

scripts/rpc: add timeout waiting for response



Optional '-t' parameter with default 60s.

Change-Id: Id1124d16ad2fc205433ee1e643939502c4641547
Signed-off-by: default avatarPawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-on: https://review.gerrithub.io/403350


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 43ae7092
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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)
+21 −6
Original line number Diff line number Diff line
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:
            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
            try:
                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)
            if closed:
                print "Connection closed with partial response:"
            else:
                print "Timeout while waiting for response:"
            print buf
            exit(1)