pytransitions / transitions

A lightweight, object-oriented finite state machine implementation in Python with many extensions
MIT License
5.49k stars 524 forks source link

Transitions can cause Python to segfault due to a stack overflow #517

Closed thedrow closed 3 years ago

thedrow commented 3 years ago
/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/bin/python /snap/pycharm-community/226/plugins/python-ce/helpers/pydev/pydevconsole.py --mode=client --port=36065

import sys; print('Python %s on %s' % (sys.version, sys.platform))
sys.path.extend(['/home/thedrow/Documents/Projects/celery-infra/jumpstarter'])

PyDev console: starting.

Python 3.9.1 (default, Feb  4 2021, 17:55:50) 
[GCC 5.4.0 20160609] on linux
>>> def foo(e):
...     e.machine.to_c()
...     
>>> from transitions import Machine
>>> m = Machine(states=['a', 'b', 'c'], initial='a', send_event=True)
>>> m.finalize_event.append(foo)
>>> m.to_b()
Fatal Python error: _Py_CheckRecursiveCall: Cannot recover from stack overflow.
Python runtime state: initialized

Thread 0x00007ff50b2c6640 (most recent call first):
  File "/home/linuxbrew/.linuxbrew/opt/python@3.9/lib/python3.9/threading.py", line 312 in wait
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/pydev/_pydev_comm/pydev_io.py", line 40 in read
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/pydev/_pydev_comm/pydev_transport.py", line 27 in read_request
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/pydev/_pydev_comm/pydev_transport.py", line 215 in read
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/third_party/thriftpy/_shaded_thriftpy/transport/buffered/__init__.py", line 39 in _read
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/third_party/thriftpy/_shaded_thriftpy/transport/__init__.py", line 14 in readall
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/third_party/thriftpy/_shaded_thriftpy/transport/__init__.py", line 32 in read
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/third_party/thriftpy/_shaded_thriftpy/protocol/binary.py", line 164 in read_message_begin
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/third_party/thriftpy/_shaded_thriftpy/protocol/binary.py", line 371 in read_message_begin
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/third_party/thriftpy/_shaded_thriftpy/thrift.py", line 212 in process_in
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/third_party/thriftpy/_shaded_thriftpy/thrift.py", line 257 in process
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/pydev/_pydev_comm/pydev_server.py", line 34 in handle
  File "/home/linuxbrew/.linuxbrew/opt/python@3.9/lib/python3.9/threading.py", line 892 in run
  File "/home/linuxbrew/.linuxbrew/opt/python@3.9/lib/python3.9/threading.py", line 954 in _bootstrap_inner
  File "/home/linuxbrew/.linuxbrew/opt/python@3.9/lib/python3.9/threading.py", line 912 in _bootstrap

Thread 0x00007ff50bac7640 (most recent call first):
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/pydev/_pydev_comm/pydev_io.py", line 110 in readall
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/pydev/_pydev_comm/pydev_transport.py", line 45 in _read_frame
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/pydev/_pydev_comm/pydev_transport.py", line 37 in _read_and_dispatch_next_frame
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/pydev/_pydev_comm/pydev_transport.py", line 64 in _read_forever
  File "/home/linuxbrew/.linuxbrew/opt/python@3.9/lib/python3.9/threading.py", line 892 in run
  File "/home/linuxbrew/.linuxbrew/opt/python@3.9/lib/python3.9/threading.py", line 954 in _bootstrap_inner
  File "/home/linuxbrew/.linuxbrew/opt/python@3.9/lib/python3.9/threading.py", line 912 in _bootstrap

Current thread 0x00007ff511985d40 (most recent call first):
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 727 in get_model_state
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 399 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1148 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 393 in trigger
  File "<input>", line 2 in foo
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1102 in callback
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 1083 in callbacks
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 427 in _process
  File "/home/thedrow/.cache/pypoetry/virtualenvs/jumpstarter-q-gDbjwh-py3.9/lib/python3.9/site-packages/transitions/core.py", line 411 in _trigger
  ...

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

Naturally, this makes total sense but we need to find a way to raise an error much earlier so that the process wouldn't crash.

matanox commented 3 years ago

Why is specialized library handling sensible for a recursive condition that is the result of explicit user coding? It is rather explicit that this is an infinite recursion unless I'm missing something really big about this code example.

thedrow commented 3 years ago

Python shouldn't segfault but raise an exception instead and if it does, we need to mitigate it because we don't need the entire process to crash. If this happens in a different thread, it has a different stack.

aleneum commented 3 years ago

Executing

from transitions import Machine

def foo(e):
    e.machine.to_c()

m = Machine(states=['a', 'b', 'c'], initial='a', send_event=True)
m.finalize_event.append(foo)
m.to_b()

gives me a(n expected) RecursionError: maximum recursion depth exceeded while calling a Python object. Callbacks passed to finalize have no specific try/catch handling so far. But if your setting segfaults, I doubt that

try:
    m.to_b()
except RecursionError:
    pass

would make a difference.

aleneum commented 3 years ago

Right now I don't see how such a recursion -- especially if its a bit less obvious than the presented case -- can be anticipated. It's is, however, possible to track the current depth of an Event with a MixIn and hit the brakes when things get too deep:

from transitions import Machine, Event

def foo(e):
    e.machine.to_c()

class RecursionTracking(Event):

    limit = 100

    def __init__(self, *args, **kwargs):
        self.current_depth = 0
        super().__init__(*args, **kwargs)

    def _process(self, event_data):
        if self.current_depth > self.limit:
            print(f"Recursion limit of {self.limit} reached")
            # raise RecursionError(f"Recursion limit of {self.limit} reached")
            return False

        self.current_depth += 1
        res = super()._process(event_data)
        self.current_depth -= 1
        return res

class RecursionLimiter(Machine):

    event_cls = RecursionTracking

m = RecursionLimiter(states=['a', 'b', 'c'], initial='a', send_event=True)
m.finalize_event.append(foo)
m.to_b()
thedrow commented 3 years ago

Feel free to close this as 'won't fix' if that's the case.

aleneum commented 3 years ago

Well, I'd gladly fix it (even though I am not hundred percent sure I know what 'it' actually is) if its considered a bug. Right now I don't understand (yet) how (and also why) a state machine library should prevent recursion errors but maybe you mean something different. As mentioned earlier, I cannot reproduce the segfault issue you faced but "only" an expected RecursionError.

The issue I currently see is that the assumption that finalize callbacks are handled in a way that does not raise exceptions cannot be uphold. Consequently, finalize callbacks should also be guarded with a try/except statement.

thedrow commented 3 years ago

What worried me is that Python crashes that way. If you can't reproduce the segfault it's probably not worth looking into.

aleneum commented 3 years ago

I see. Well, if there is some leaking memory or other resource management issues this if of course an issue. But right now I would assume that the segfault is setting related and not particularly caused by transitions. If you find evidence that this assumption is not correct, let me know.

1b3854c added try/except for finalize callbacks and thus silences raised exceptions there. From now on only the original error will be raised.

aleneum commented 2 years ago

Hello @thedrow, I am not sure if this is still relevant for you since the issue is rather old but I am curious if you somehow or somewhere rely on the fact that starting with transition 0.8.8, exceptions in finalize_event are suppressed. I was considering removing try/catch from finalize_event again to enable users to deal with issues instead of hunting them first but wanted to hear your experience first.

thedrow commented 2 years ago

I haven't worked on Jumpstarter for a while but I think that was the problem or part of it. Generally, when you finalize, you should disallow transitions. That would fix this issue permanently and provide a meaningful error.