-
Notifications
You must be signed in to change notification settings - Fork 24
Open
Labels
Description
STS assumes single-threaded execution, but signal handlers from the console (^C and ^D) break that assumption.
This causes a few problems, such as:
- When switching back to Fuzzer mode from interactive
- When switching to Interactive to Fuzzer the second time
I believe the problem may be related to io_master.raw_input's BackgroundIOThread?
The symptoms are usually that io_workers are closed due to empty reads (I believe because MuxSelect.select is interrupted, and doesn't properly handle syscall error codes)
Interrupt handlers are defined in a few places:
- simulator.py handles sigint
- fuzzer.py adds a shim layer for sigint that drops to interactive upon the first sigint
- replayer.py also adds a shim layer.
Here's an example stack trace:
STS [next] >ERROR:core:Exception while handling OpenFlowBuffer!PendingMessage...
Traceback (most recent call last):
File "/home/mininet/sts/pox/pox/lib/revent/revent.py", line 233, in raiseEventNoErrors
return self.raiseEvent(event, args, *kw)
File "/home/mininet/sts/pox/pox/lib/revent/revent.py", line 280, in raiseEvent
rv = event._invoke(handler, args, *kw)
File "/home/mininet/sts/pox/pox/lib/revent/revent.py", line 158, in _invoke
return handler(self, args, *kw)
File "/home/mininet/sts/sts/openflow_buffer.py", line 88, in _pass_through_handler
self.schedule(pending_message)
File "/home/mininet/sts/sts/openflow_buffer.py", line 141, in schedule
raise ValueError("No such pending message %s" % pending_message)
TypeError: not all arguments converted during string formatting
TODO:
- in python, does an async signal fork another thread? Or temporarily move the main thread?
- How many theads are running when this thing crashes? Is it possible that multiple BackgroundIOThreads are running?