Duplicate subscriptions; can't unsubscribe
This is a migration of Redmine issue #5576.
Original Description (2017-08-21):
You can subscribe two or more times to an LVAlert node and you definitely shouldn't be able to do that. And once you have multiple subscriptions, you can't unsubscribe at all. Here's a long example:
Subscribe to a node:
(gracedb)[tanner.prestegard@tanner-test:
/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --subscriptions/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --subscribe --node external_snews
Node: tanner_test1 [ subscribed subid=VO5QO2G7tSd85qN98yU32nacN4gvtKfTfJ10ukjE] (gracedb)[tanner.prestegard@tanner-test:
Successfully subscribed to node external_snews (gracedb)[tanner.prestegard@tanner-test:~/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --subscriptions Node: tanner_test1 [ subscribed subid=VO5QO2G7tSd85qN98yU32nacN4gvtKfTfJ10ukjE] Node: external_snews [ subscribed subid=AMrdDCV36Nj2SzIy5Kgh6FI83LwJrYewGEaE6L6r] Unsubscribe from a node:(gracedb)[tanner.prestegard@tanner-test:
/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --unsubscribe --node external_snews/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --subscriptions
Successfully completed operation (gracedb)[tanner.prestegard@tanner-test:
Node: tanner_test1 [ subscribed subid=VO5QO2G7tSd85qN98yU32nacN4gvtKfTfJ10ukjE] Subscribe to a node twice:(gracedb)[tanner.prestegard@tanner-test:
/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --subscribe --node external_snews/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --subscriptions Node: tanner_test1 [ subscribed subid=VO5QO2G7tSd85qN98yU32nacN4gvtKfTfJ10ukjE] Node: external_snews [ subscribed subid=ieP1IdWTRkG4bHd6g3XfjmOtm5PMG3z2Wy36PswL] (gracedb)[tanner.prestegard@tanner-test:
Successfully subscribed to node external_snews (gracedb)[tanner.prestegard@tanner-test:/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --subscribe --node external_snews/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --subscriptions Node: tanner_test1 [ subscribed subid=VO5QO2G7tSd85qN98yU32nacN4gvtKfTfJ10ukjE] Node: external_snews [ subscribed subid=ieP1IdWTRkG4bHd6g3XfjmOtm5PMG3z2Wy36PswL] Node: external_snews [ subscribed subid=98rC5asLPv7uLJUm4Oc5mJONzWeMrHBpyGiiyJ27] Can't unsubscribe:
Successfully subscribed to node external_snews (gracedb)[tanner.prestegard@tanner-test:(gracedb)[tanner.prestegard@tanner-test:~/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --unsubscribe --node external_snews Traceback (most recent call last): File "/home/tanner.prestegard/gracedb/bin/lvalert_admin", line 299, in s.loop(1) File "/usr/lib/python2.7/dist-packages/pyxmpp/client.py", line 241, in loop act=stream.loop_iter(timeout) File "/usr/lib/python2.7/dist-packages/pyxmpp/streambase.py", line 619, in loop_iter return self._loop_iter(timeout) File "/usr/lib/python2.7/dist-packages/pyxmpp/streambase.py", line 640, in _loop_iter self._process() File "/usr/lib/python2.7/dist-packages/pyxmpp/streamtls.py", line 194, in _process StreamBase._process(self) File "/usr/lib/python2.7/dist-packages/pyxmpp/streambase.py", line 661, in _process self._read() File "/usr/lib/python2.7/dist-packages/pyxmpp/streamtls.py", line 187, in _read self._read_tls() File "/usr/lib/python2.7/dist-packages/pyxmpp/streamtls.py", line 181, in _read_tls self._feed_reader(r) File "/usr/lib/python2.7/dist-packages/pyxmpp/streambase.py", line 701, in _feed_reader r=self._reader.feed(data) File "/usr/lib/python2.7/dist-packages/pyxmpp/xmlextra.py", line 555, in feed return self.reader.feed(s) File "/usr/lib/python2.7/dist-packages/pyxmpp/xmlextra.py", line 59, in _stanza self.stanza(doc,node) File "/usr/lib/python2.7/dist-packages/pyxmpp/streambase.py", line 420, in stanza self._process_node(node) File "/usr/lib/python2.7/dist-packages/pyxmpp/stream.py", line 106, in _process_node StreamBase._process_node(self,xmlnode) File "/usr/lib/python2.7/dist-packages/pyxmpp/streambase.py", line 734, in _process_node self.process_stanza(stanza) File "/home/tanner.prestegard/gracedb/local/lib/python2.7/site-packages/ligo/lvalert/lvstanzaprocessor.py", line 281, in process_stanza if self.process_iq(stanza): File "/home/tanner.prestegard/gracedb/local/lib/python2.7/site-packages/ligo/lvalert/lvstanzaprocessor.py", line 127, in process_iq response = err_handler(stanza) File "/home/tanner.prestegard/gracedb/local/lib/python2.7/site-packages/ligo/lvalert/pubsub.py", line 235, in generic_error raise FatalClientError("Failed to establish a session: "+msg) pyxmpp.exceptions.FatalClientError: Failed to establish a session: Bad request There is an option to "unsubscribe by subid", and although the code doesn't break, it doesn't remove the subscription:
(gracedb)[tanner.prestegard@tanner-test:
/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --subscriptions Node: tanner_test1 [ subscribed subid=VO5QO2G7tSd85qN98yU32nacN4gvtKfTfJ10ukjE] Node: external_snews [ subscribed subid=ieP1IdWTRkG4bHd6g3XfjmOtm5PMG3z2Wy36PswL] Node: external_snews [ subscribed subid=98rC5asLPv7uLJUm4Oc5mJONzWeMrHBpyGiiyJ27] (gracedb)[tanner.prestegard@tanner-test:/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --unsubscribe-subid=98rC5asLPv7uLJUm4Oc5mJONzWeMrHBpyGiiyJ27 (gracedb)[tanner.prestegard@tanner-test:~/lvalert_testing]$ lvalert_admin -s lvalert-test.cgca.uwm.edu --subscriptions Node: tanner_test1 [ subscribed subid=VO5QO2G7tSd85qN98yU32nacN4gvtKfTfJ10ukjE] Node: external_snews [ subscribed subid=ieP1IdWTRkG4bHd6g3XfjmOtm5PMG3z2Wy36PswL] Node: external_snews [ subscribed subid=98rC5asLPv7uLJUm4Oc5mJONzWeMrHBpyGiiyJ27] This option doesn't seem to work at all, as I also tried it with a node I was only subscribed to once, and I was not unsubscribed.
And follow-up comments:
Updated by Tanner Prestegard
Note that multiple subscriptions does not seem to have any effect on your ability to receive messages which are pushed to the node.
Updated by Tanner Prestegard
Update: you actually can unsubscribe, by using --unsubscribe and --unsubscribe-subid together:
lvalert_admin -s lvalert-test.cgca.uwm.edu --unsubscribe --node external_snews --unsubscribe-subid=98rC5asLPv7uLJUm4Oc5mJONzWeMrHBpyGiiyJ27
But you should still not be able to subscribe multiple times in the first place...
Update:
I've seen this same behavior with the SleekXMPP library in some initial testing, the subscriber API call should be smart enough to recognize that a subscription already exists before it makes a new subscription.