diff options
author | Kotresh HR <khiremat@redhat.com> | 2018-09-28 06:11:52 -0400 |
---|---|---|
committer | Amar Tumballi <amarts@redhat.com> | 2018-10-02 05:49:24 +0000 |
commit | ff00ce1d55e34ec77e93e742533928edf653e2d2 (patch) | |
tree | 9dec37cef1e6f13996b3921f888a77d1e59b97da | |
parent | d06bbb617ee9449759cd069141a085c313524298 (diff) |
georep: python2 to python3 compat - pickle
Handle py2 and py3 compatibility for pickling and unpickling.
Geo-rep pickles and unpickles reading sys.stdin and sys.stdout streams.
py2 and py3 compatibility expects the streams to be opened in binary
mode but the sys.stdout objects are different in python2
and python3
python2:
>>> type(sys.stdout)
<type 'file'>
python3:
>>> type(sys.stdout)
<class '_io.TextIOWrapper'>
So in order to access binary stream, using sys.stdin.buffer in python3
Updates: #411
Change-Id: I1a633ccdddff5baf0cf05a8b493add39ddf75bd7
Signed-off-by: Kotresh HR <khiremat@redhat.com>
-rw-r--r-- | geo-replication/syncdaemon/repce.py | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/geo-replication/syncdaemon/repce.py b/geo-replication/syncdaemon/repce.py index 6910fd068ad..6065b828c99 100644 --- a/geo-replication/syncdaemon/repce.py +++ b/geo-replication/syncdaemon/repce.py @@ -8,6 +8,7 @@ # cases as published by the Free Software Foundation. # +import _io import os import sys import time @@ -28,13 +29,13 @@ except ImportError: from syncdutils import Thread, select, lf -pickle_proto = -1 +pickle_proto = 2 repce_version = 1.0 def ioparse(i, o): if isinstance(i, int): - i = os.fdopen(i) + i = os.fdopen(i, 'rb') # rely on duck typing for recognizing # streams as that works uniformly # in py2 and py3 @@ -54,8 +55,15 @@ def send(out, *args): def recv(inf): - """load an object from input stream""" - return pickle.load(inf) + """load an object from input stream + python2 and python3 compatibility, inf is sys.stdin + and is opened as text stream by default. Hence using the + buffer attribute + """ + if isinstance(inf, _io.TextIOWrapper): + return pickle.load(inf.buffer) + else: + return pickle.load(inf) class RepceServer(object): |