Просмотр исходного кода

Fix browser env leak after resetting agent (#1589)

* add more teardown

* add browser process teardown logic in agent controller

* remove testing code

---------

Co-authored-by: Robert Brennan <accounts@rbren.io>
Frank Xu 1 год назад
Родитель
Сommit
ae7f208d51
2 измененных файлов с 13 добавлено и 2 удалено
  1. 1 0
      opendevin/controller/agent_controller.py
  2. 12 2
      opendevin/runtime/browser/browser_env.py

+ 1 - 0
opendevin/controller/agent_controller.py

@@ -96,6 +96,7 @@ class AgentController:
             self.agent_task.cancel()
         self.event_stream.unsubscribe(EventStreamSubscriber.AGENT_CONTROLLER)
         self.action_manager.sandbox.close()
+        self.browser.close()
         await self.set_agent_state_to(AgentState.STOPPED)
 
     def update_state_for_step(self, i):

+ 12 - 2
opendevin/runtime/browser/browser_env.py

@@ -55,6 +55,7 @@ class BrowserEnv:
                     unique_request_id, action_data = self.browser_side.recv()
                     # shutdown the browser environment
                     if unique_request_id == 'SHUTDOWN':
+                        logger.info('SHUTDOWN recv, shutting down browser env...')
                         env.close()
                         return
                     action = action_data['action']
@@ -69,6 +70,10 @@ class BrowserEnv:
                     self.browser_side.send((unique_request_id, obs))
             except KeyboardInterrupt:
                 logger.info('Browser env process interrupted by user.')
+                try:
+                    env.close()
+                except Exception:
+                    pass
                 return
 
     def step(self, action_str: str, timeout: float = 10) -> dict:
@@ -86,8 +91,13 @@ class BrowserEnv:
                     return obs
 
     def close(self):
-        self.agent_side.send(('SHUTDOWN', None))
-        self.process.join()
+        try:
+            self.agent_side.send(('SHUTDOWN', None))
+            self.process.join()
+            self.agent_side.close()
+            self.browser_side.close()
+        except Exception:
+            pass
 
     @staticmethod
     def image_to_png_base64_url(image: np.ndarray | Image.Image):