Hello,
We are using Riak's multiget function from the Python API, and we have noticed
that our service would sometimes hang and need to be restarted. After some
searching, we found that the cause was Riak's multiget function.
Consider the following simple example where we are using multiget to only get a
single object and we are passing a timeout of 1 millisecond.
import riak, riak_pb
riak_client = riak.RiakClient(host='localhost,
pb_port=8087, protocol='pbc')
for n in range(0,10:
print riak_client.multiget([('test_bucket',
'398eed5613da8d0918cd64b3cf1d44b2')],
timeout=1) #ms
A RiakError is raised, but the script just hangs after that and can only be
stopped with a signal 9:
Exception in thread riak.client.multiget-worker-0:
Traceback (most recent call last):
File "/usr/local/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/usr/local/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/local/lib/python2.6/site-packages/riak/client/multiget.py", line
130, in _fetcher
**task.options)
File "/usr/local/lib/python2.6/site-packages/riak/bucket.py", line 206, in get
return obj.reload(r=r, pr=pr, timeout=timeout)
File "/usr/local/lib/python2.6/site-packages/riak/riak_object.py", line 307,
in reload
self.client.get(self, r=r, pr=pr, timeout=timeout)
File "/usr/local/lib/python2.6/site-packages/riak/client/transport.py", line
127, in wrapper
return self._with_retries(pool, thunk)
File "/usr/local/lib/python2.6/site-packages/riak/client/transport.py", line
69, in _with_retries
return fn(transport)
File "/usr/local/lib/python2.6/site-packages/riak/client/transport.py", line
125, in thunk
return fn(self, transport, *args, **kwargs)
File "/usr/local/lib/python2.6/site-packages/riak/client/operations.py", line
315, in get
return transport.get(robj, r=r, pr=pr, timeout=timeout)
File
"/usr/local/lib/python2.6/site-packages/riak/transports/pbc/transport.py", line
146, in get
MSG_CODE_GET_RESP)
File
"/usr/local/lib/python2.6/site-packages/riak/transports/pbc/connection.py",
line 43, in _request
return self._recv_msg(expect)
File
"/usr/local/lib/python2.6/site-packages/riak/transports/pbc/connection.py",
line 55, in _recv_msg
raise RiakError(err.errmsg)
RiakError: 'timeout'
We are not able to catch the exception because it occurs in a different thread.
So, when this occurs, it renders our service unusable until a restart is issued.
I would like to know if anybody else has encountered this and if there are any
known work-arounds or a patch for riak/client/multiget.py that will propagate
the timeout exception so the main thread no longer waits for it to never return.
Thanks,
Jeff_______________________________________________
riak-users mailing list
[email protected]
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com