]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/ceph_daemon: use small chunk for recv 13804/head
authorXiaoxi Chen <xiaoxchen@ebay.com>
Mon, 6 Mar 2017 09:31:00 +0000 (02:31 -0700)
committerXiaoxi Chen <xiaoxchen@ebay.com>
Fri, 10 Mar 2017 01:23:00 +0000 (18:23 -0700)
socket.recv(bufsize) accept signed int in python, so if
we want to load huge data (mds -> cache_dump is an instance)
from admin socket , an EOVERFLOW exception will be throw.

Workaround by capping READ_CHUNK_SIZE(4096) bytes each call.

Signed-off-by: Xiaoxi Chen <xiaoxchen@ebay.com>
src/pybind/ceph_daemon.py

index 505b8656834db54df7ce5f987e7cee0413c55d6a..ec81d0cbb4a9780227061ba502e9fcb4f0edfd67 100755 (executable)
@@ -21,6 +21,7 @@ from ceph_argparse import parse_json_funcsigs, validate_command
 
 COUNTER = 0x8
 LONG_RUNNING_AVG = 0x4
+READ_CHUNK_SIZE = 4096
 
 
 def admin_socket(asok_path, cmd, format=''):
@@ -45,7 +46,10 @@ def admin_socket(asok_path, cmd, format=''):
 
             got = 0
             while got < l:
-                bit = sock.recv(l - got)
+                # recv() receives signed int, i.e max 2GB
+                # workaround by capping READ_CHUNK_SIZE per call.
+                want = min(l - got, READ_CHUNK_SIZE)
+                bit = sock.recv(want)
                 sock_ret += bit
                 got += len(bit)