Преглед на файлове

Don't try to send events to nonrunning processes.

Chris McDonough преди 18 години
родител
ревизия
d5454ce593
променени са 2 файла, в които са добавени 23 реда и са изтрити 2 реда
  1. 3 1
      src/supervisor/process.py
  2. 20 1
      src/supervisor/tests/test_process.py

+ 3 - 1
src/supervisor/process.py

@@ -45,7 +45,7 @@ class Subprocess:
     pid = 0 # Subprocess pid; 0 when not running
     config = None # ProcessConfig instance
     state = None # process state code
-    listener_state = None # listener state code
+    listener_state = None # listener state code (if we're an event listener)
     laststart = 0 # Last time the subprocess was started; 0 if never
     laststop = 0  # Last time the subprocess was stopped; 0 if never
     delay = 0 # If nonzero, delay starting or killing until this time
@@ -606,6 +606,8 @@ class EventListenerPool(ProcessGroupBase):
             # all events
             raise NotImplementedError(etype)
         for process in self.processes.values():
+            if process.state != ProcessStates.RUNNING:
+                continue
             if process.listener_state == EventListenerStates.READY:
                 payload = serializer(event)
                 try:

+ 20 - 1
src/supervisor/tests/test_process.py

@@ -1083,7 +1083,7 @@ class EventListenerPoolTests(ProcessGroupBaseTests):
         self.assertTrue(pool.config.options.logger.data[1].startswith(
             'Failed sending buffered event'))
     
-    def test_transition_event_handled(self):
+    def test_transition_event_proc_not_running(self):
         options = DummyOptions()
         from supervisor.process import ProcessStates
         pconfig1 = DummyPConfig(options, 'process1', 'process1','/bin/process1')
@@ -1098,6 +1098,25 @@ class EventListenerPoolTests(ProcessGroupBaseTests):
         pool.event_buffer = [event]
         pool.transition()
         self.assertEqual(process1.transitioned, True)
+        self.assertEqual(pool.event_buffer, [event])
+        self.assertEqual(process1.stdin_buffer, '')
+        self.assertEqual(process1.listener_state, EventListenerStates.READY)
+
+    def test_transition_event_proc_running(self):
+        options = DummyOptions()
+        from supervisor.process import ProcessStates
+        pconfig1 = DummyPConfig(options, 'process1', 'process1','/bin/process1')
+        process1 = DummyProcess(pconfig1, state=ProcessStates.RUNNING)
+        gconfig = DummyPGroupConfig(options, pconfigs=[pconfig1])
+        pool = self._makeOne(gconfig)
+        pool.processes = {'process1': process1}
+        from supervisor.events import StartingFromStoppedEvent
+        from supervisor.states import EventListenerStates
+        event = StartingFromStoppedEvent(process1)
+        process1.listener_state = EventListenerStates.READY
+        pool.event_buffer = [event]
+        pool.transition()
+        self.assertEqual(process1.transitioned, True)
         self.assertEqual(pool.event_buffer, [])
         self.assertEqual(
             process1.stdin_buffer,