Skip to content

Wrong return values for _data_for_key in system.py

When attempting to start some Guardian nodes after upgrade to Debian 10, Python 3, get the following error

2020-05-06_21:56:49.639195Z Starting Advanced LIGO Guardian service: FAST_SHUTTER...
2020-05-06_21:56:50.035708Z Traceback (most recent call last):
2020-05-06_21:56:50.035708Z   File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
2020-05-06_21:56:50.036789Z     "__main__", mod_spec)
2020-05-06_21:56:50.036789Z   File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
2020-05-06_21:56:50.036789Z     exec(code, run_globals)
2020-05-06_21:56:50.036789Z   File "/usr/lib/python3/dist-packages/guardian/__main__.py", line 291, in <module>
2020-05-06_21:56:50.036789Z     main()
2020-05-06_21:56:50.036789Z   File "/usr/lib/python3/dist-packages/guardian/__main__.py", line 152, in main
2020-05-06_21:56:50.036789Z     system.load()
2020-05-06_21:56:50.036789Z   File "/usr/lib/python3/dist-packages/guardian/system.py", line 460, in load
2020-05-06_21:56:50.036789Z     self.add_state(key, obj)
2020-05-06_21:56:50.036789Z   File "/usr/lib/python3/dist-packages/guardian/system.py", line 330, in add_state
2020-05-06_21:56:50.036789Z     if index in self.indices and name != self.index(index):
2020-05-06_21:56:50.036789Z   File "/usr/lib/python3/dist-packages/guardian/system.py", line 766, in index
2020-05-06_21:56:50.036789Z     return self._data_for_key(key)[0]
2020-05-06_21:56:50.036789Z   File "/usr/lib/python3/dist-packages/guardian/system.py", line 732, in _data_for_key
2020-05-06_21:56:50.037791Z     return state, data
2020-05-06_21:56:50.037791Z UnboundLocalError: local variable 'data' referenced before assignment
2020-05-06_21:56:50.076765Z guardian@FAST_SHUTTER.service: Control process exited, code=exited, status=1/FAILURE
2020-05-06_21:56:50.076901Z guardian@FAST_SHUTTER.service: Failed with result 'exit-code'.
2020-05-06_21:56:50.077156Z Failed to start Advanced LIGO Guardian service: FAST_SHUTTER.

In looking at the relevant section on system.py, it appears the return should be 'state, index' not 'state, data'

    def _data_for_key(self, key):
        """Return state (key, data) tuple for state.

        If a string is provided, key is the state index.  If a number
        is provided, key is the state name.

        KeyError or TypeError exceptions are raised where appropriate.

        """
        if isinstance(key, str):
            try:
                data = self._graph.nodes[key]
                return data['index'], data
            except KeyError:
                raise KeyError("%s is not a state name" % key)

        elif isinstance(key, int):
            for state, index in self._graph.nodes(data='index'):
                if index == key:
                    return state, data
            raise KeyError("%s is not a state index" % key)

        else:
            raise TypeError("item must be state name string or index integer.")
Edited by Keith Thorne