Uploaded image for project: 'Thrift'
  1. Thrift
  2. THRIFT-1062

Problems with python tutorials

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 0.9
    • Fix Version/s: 0.9.1
    • Component/s: Python - Library, Tutorial
    • Labels:
      None
    • Environment:

      Thrift trunk (svn rev:1071191), python 2.7, FreeBSD/amd64 8-stable

      Description

      I'm trying to do some experiments with python and thrift, starting with the tutorials in the source code.
      First test: making tutorials/py.twisted client and server interact.
      Started the server with: tutorial/py.twisted]# python PythonServer.py
      and the client with:
      tutorial/py.twisted]# python PythonClient.py
      Traceback (most recent call last):
      File "PythonClient.py", line 26, in <module>
      from tutorial import Calculator
      ImportError: No module named tutorial

      The problem is that PythonClient uses the python and not the py.twisted path: sys.path.append('../gen-py')
      changing that to gen-py.twisted solves the problem:
      tutorial/py.twisted]# python PythonClient.py
      ping()
      1+1=2
      InvalidOperation: InvalidOperation(what=4, why='Cannot divide by 0')
      15-10=5
      Check log: 5

      Second test: make python twisted server work with python (not the twisted one) client:
      tutorial/py.twisted]# python PythonServer.py
      tutorial/py]# python PythonClient.py
      TSocket read 0 bytes

      Please note here, that the server listens only on IPv4, 127.0.0.1, while the clients connects to 'localhost', which resolves to ::1 (IPv6) and 127.0.0.1, so the first connection request is refused and only the seconds succeeds:
      12:07:24.887750 IP6 ::1.45100 > ::1.9090: Flags [S], seq 445533509, win 65535, options [mss 16324,nop,wscale 3,sackOK,TS val 7743539 ecr 0], length 0
      12:07:24.887785 IP6 ::1.9090 > ::1.45100: Flags [R.], seq 0, ack 445533510, win 0, length 0
      12:07:24.887924 IP 127.0.0.1.48945 > 127.0.0.1.9090: Flags [S], seq 3667752274, win 65535, options [mss 16344,nop,wscale 3,sackOK,TS val 7743539 ecr 0], length 0
      12:07:24.887948 IP 127.0.0.1.9090 > 127.0.0.1.48945: Flags [S.], seq 3988782459, ack 3667752275, win 65535, options [mss 16344,nop,wscale 3,sackOK,TS val 1390952173 ecr 7743539], length 0
      Changing localhost to 127.0.0.1 (to work around the first IPv6 connection request) changes nothing:
      transport = TSocket.TSocket('localhost', 9090) -> transport = TSocket.TSocket('127.0.0.1', 9090)
      tutorial/py]# python PythonClient.py
      TSocket read 0 bytes

      Trying the other way: starting the python server and connecting with python client:
      tutorial/py]# python PythonServer.py
      Starting the server...
      Traceback (most recent call last):
      File "PythonServer.py", line 95, in <module>
      server.serve()
      File "/usr/local/lib/python2.7/site-packages/thrift/server/TServer.py", line 74, in serve
      self.serverTransport.listen()
      File "/usr/local/lib/python2.7/site-packages/thrift/transport/TSocket.py", line 136, in listen
      res0 = self._resolveAddr()
      File "/usr/local/lib/python2.7/site-packages/thrift/transport/TSocket.py", line 31, in _resolveAddr
      return socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE | socket.AI_ADDRCONFIG)
      TypeError: getaddrinfo() argument 1 must be string or None
      Here it seems the problem is that no host has been given, and getaddrinfo fails on that.
      Giving the listen address explicitly:
      transport = TSocket.TServerSocket(9090) -> transport = TSocket.TServerSocket('127.0.0.1',9090)
      makes the server start.
      Connecting with the client:
      tutorial/py]# python PythonClient.py
      ping()
      1+1=2
      InvalidOperation: InvalidOperation(what=4, why='Cannot divide by 0')
      15-10=5
      Check log: 5
      gives the expected result. So the python client can interact with the python server, but the

      Looking at the code, I can't see why these two can't interact. BTW, I've tried the Ruby client, and it can work with the python server, but not with the python twisted server.
      So I guess python twisted server (and so the client) is incompatible with everything else. Which seems pretty bad...
      Or I'm just on the wrong track somewhere.

        Attachments

          Activity

            People

            • Assignee:
              roger Roger Meier
              Reporter:
              bra@fsn.hu Attila Nagy
            • Votes:
              1 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: