Emotion Tango: call to individual axis Status fails at move end
When trying individual Icepap axis move through the Position
. State
and Status
attributes, monitoring the Status
attribute fails at the end of the movement preventing a gevent dead lock: LoopExit: This operation would block forever
. This issue could not be reproduced with the Mockup
simulation devices.
The problem was first seen at ID31. the following code with TANGO_HOST=lid002:20000
allows to recreate it:
from PyTango import DeviceProxy
def test_tango_mot(mot_dev, p1, p2):
for i in range(20):
odd = ((i % 2) != 0)
pos = p1 if odd else p2
mot_dev.Position = pos
j = 0
while True:
moving = 'MOVING' in mot_dev.Status if odd else mot_dev.State == 6
if not moving:
break
j += 1
print "OK: %d" % j
print mot_dev.State, mot_dev.Status, mot_dev.Position
mot_dev_name = 'id00/emotion_lid002_icebcu2/m2'
mot_dev = DeviceProxy(mot_dev_name)
test_tango_mot(mot_dev, -1, 1)
generating the following output:
OK: 667
ON Traceback (most recent call last):
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/bliss/tango/servers/axis_ds.py", line 369, in _dev_state
_state = self.axis.state()
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/bliss/common/axis.py", line 81, in func_wrapper
return func(self, *args, **kwargs)
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/bliss/common/axis.py", line 412, in state
state = self.__controller.state(self)
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/bliss/controllers/motors/IcePAP.py", line 201, in state
status = self.libgroup.status(axis.libaxis)
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/bliss/controllers/motors/libicepap/groups.py", line 417, in status
rets[dev] = dev.ackcommand(cmds[dev])
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/bliss/controllers/motors/libicepap/system.py", line 91, in ackcommand
return self._deepdevice.ackcommand(str_cmd, in_data)
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/bliss/controllers/motors/libicepap/deep/device.py", line 525, in ackcommand
return self.__command(str_cmd, in_data, True)
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/bliss/controllers/motors/libicepap/deep/device.py", line 486, in __command
ans = reply.get() #self.__rd_ascii(prefix)
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/bliss/controllers/motors/libicepap/deep/sockdeep.py", line 58, in get
ret, msg = self.queue.get(*args, **kwargs)
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/gevent/queue.py", line 200, in get
result = waiter.get()
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/gevent/hub.py", line 575, in get
return self.hub.switch()
File "/users/blissadm/lib/virtualenvs/bliss/lib/python2.6/site-packages/gevent/hub.py", line 338, in switch
return greenlet.switch(self)
LoopExit: This operation would block forever
0.971999999999
...