← Back to team overview

openstack team mailing list archive

Re: [grizzly]Problems of qpid as rpcbackend


Hi Ray,
Thanks for your reply.
try .... except .... change to line 386 only solve cinder-scheduler or
nova-compute service which is the similar implementation stop raise
However,  all cinder-volume queue be removed when one of
multi-cinder-volume service stop. It is another problem.
I use pdb module to trace two different sevice stop(cinder-scheduler and
I describe two different implemention stop service
cinder-scheduler catch the signal to stop will to call _launcher.stop()
cinder/service.py line 612
_launcher.stop() will kill all service thread which run service.start and
service.wait .
After thread killed, I found that connection.session.recievers is [], that
means all consumer released. I'm not sure connection closed or not.
I found that the method kill() of class service not be called.

cinder-volume launch two processes,  service run in child process
(service.py line 227) and parent process watch the status of child.
When parent process catch to stop signal, it send the stop signal to child
child process will catch signal and call service.stop (service.py  line 239)

And I use pdb to trace stop steps. I found that
connection.session.receivers is not [] and including three
receivers(cinder-volume, cinder-volume.node1, cinder-volume_fanout)
qpid will remove receivers of session, then MessageCancel and QueueDelete
will set to qpidd.
I think QueueDelete told the qpidd to delete all cinder-volume queues.

2013/5/30 Ray Pekowski <pekowski@xxxxxxxxx>

> I am not familiar with impl_qpid,py, but am familiar with amqp.py and have
> had problems around rpc_amqp.cleanup() the Pool.empty() method it calls.
> It was a totally different problem, but I decided to take a look at your
> problem.  I noticed that in impl_qpid.py the only other place a
> connection.close() is done is surrounded by this code:
>             # Close the session if necessary
>             if self.connection.opened():
>                 try:
>                     self.connection.close()
>                 except qpid_exceptions.ConnectionError:
>                     pass
> I suggest you wrap the close at line 386 of impl_qpid.py with the same
> code and your problem will be fixed.  Here is the line identified from your
> call stack:
>   File "/usr/lib/python2.6/site-
> packages/cinder/openstack/common/rpc/impl_qpid.py", line 386, in close
>     self.connection.close()
> If that works, open a bug report.
> Good catch
> Ray