tcalmant / jsonrpclib

A Python (2 & 3) JSON-RPC over HTTP that mirrors the syntax of xmlrpclib (aka jsonrpclib-pelix)
https://jsonrpclib-pelix.readthedocs.io/
Apache License 2.0
53 stars 24 forks source link

Issue with PooledJSONRPCServer (can't connect) #18

Closed byaka closed 9 years ago

byaka commented 9 years ago

Import's section

from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
from jsonrpclib.SimpleJSONRPCServer import PooledJSONRPCServer
from jsonrpclib.threadpool import ThreadPool
from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCRequestHandler
import SocketServer

First try

   server=SimpleJSONRPCServer(("0.0.0.0", 8099), requestHandler=myRequestHandler, logRequests=False)
   server.register_instance(mySharedMethods())
   server.serve_forever()

work fine

Second try

   class ThreadedJSONRPCServer(SocketServer.ThreadingMixIn, SimpleJSONRPCServer):
      pass
   server=ThreadedJSONRPCServer(("0.0.0.0", 8099), requestHandler=myRequestHandler, logRequests=False)
   server.register_instance(mySharedMethods())
   server.serve_forever()

work fine too

And third try

   request_pool=ThreadPool(max_threads=50, min_threads=2)
   request_pool.start()
   server=PooledJSONRPCServer(("0.0.0.0", 8099), requestHandler=myRequestHandler, thread_pool=request_pool, logRequests=False)
   server.register_instance(mySharedMethods())
   server.serve_forever()

starting without error, but i can't connect to server. Any request wait forever. When i kill request, i have stack every time in one place. Maybe it's help..

/usr/local/lib/python2.7/dist-packages/jsonrpclib/jsonrpc.pyc in __call__(self, *args, **kwargs)
    565             return self.__send(self.__name, args)
    566         else:
--> 567             return self.__send(self.__name, kwargs)
    568 
    569     def __getattr__(self, name):

/usr/local/lib/python2.7/dist-packages/jsonrpclib/jsonrpc.pyc in _request(self, methodname, params, rpcid)
    442                         rpcid=rpcid, version=self.__version,
    443                         config=self._config)
--> 444         response = self._run_request(request)
    445         check_for_errors(response)
    446         return response['result']

/usr/local/lib/python2.7/dist-packages/jsonrpclib/jsonrpc.pyc in _run_request(self, request, notify)
    475             self.__handler,
    476             request,
--> 477             verbose=self.__verbose
    478         )
    479 

/usr/lib/python2.7/xmlrpclib.pyc in request(self, host, handler, request_body, verbose)
   1262         for i in (0, 1):
   1263             try:
-> 1264                 return self.single_request(host, handler, request_body, verbose)
   1265             except socket.error, e:
   1266                 if i or e.errno not in (errno.ECONNRESET, errno.ECONNABORTED, errno.EPIPE):

/usr/lib/python2.7/xmlrpclib.pyc in single_request(self, host, handler, request_body, verbose)
   1292             self.send_content(h, request_body)
   1293 
-> 1294             response = h.getresponse(buffering=True)
   1295             if response.status == 200:
   1296                 self.verbose = verbose

/usr/lib/python2.7/httplib.pyc in getresponse(self, buffering)
   1043         response = self.response_class(*args, **kwds)
   1044 
-> 1045         response.begin()
   1046         assert response.will_close != _UNKNOWN
   1047         self.__state = _CS_IDLE

/usr/lib/python2.7/httplib.pyc in begin(self)
    407         # read until we get a non-100 response
    408         while True:
--> 409             version, status, reason = self._read_status()
    410             if status != CONTINUE:
    411                 break

/usr/lib/python2.7/httplib.pyc in _read_status(self)
    363     def _read_status(self):
    364         # Initialize with Simple-Response defaults
--> 365         line = self.fp.readline(_MAXLINE + 1)
    366         if len(line) > _MAXLINE:
    367             raise LineTooLong("header line")

/usr/lib/python2.7/socket.pyc in readline(self, size)
    474             while True:
    475                 try:
--> 476                     data = self._sock.recv(self._rbufsize)
    477                 except error, e:
    478                     if e.args[0] == EINTR:

KeyboardInterrupt: 
tcalmant commented 9 years ago

Bug reproduced, I get the following trace in server logs:

ERROR:jsonrpclib.threadpool:Error executing process_request_thread: process_request_thread() takes exactly 3 arguments (2 given)
Traceback (most recent call last):
  File "/mnt/data/thomas/repos-git/jsonrpclib/jsonrpclib/threadpool.py", line 469, in __run
    future.execute(method, args, kwargs)
  File "/mnt/data/thomas/repos-git/jsonrpclib/jsonrpclib/threadpool.py", line 191, in execute
    result = method(*args, **kwargs)
TypeError: process_request_thread() takes exactly 3 arguments (2 given)
byaka commented 9 years ago

U so quick, Thx!