Compare commits

...

4 Commits

Author SHA1 Message Date
openhands
984b46098b Fix file descriptor leak in LogBuffer when closing runtime 2024-11-14 14:40:47 +00:00
Robert Brennan
06b0dd387a remove second logbuffer 2024-11-14 09:32:28 -05:00
Robert Brennan
b513ebba2d close github 2024-11-14 09:10:39 -05:00
Robert Brennan
277d9b2732 fix websocket close 2024-11-13 17:34:14 -05:00
3 changed files with 19 additions and 10 deletions

View File

@@ -111,6 +111,9 @@ class LogBuffer:
def close(self, timeout: float = 5.0):
self._stop_event.set()
self.log_stream_thread.join(timeout)
# Close the log generator to release the file descriptor
if hasattr(self.log_generator, 'close'):
self.log_generator.close()
class EventStreamRuntime(Runtime):
@@ -232,6 +235,8 @@ class EventStreamRuntime(Runtime):
f'Container started: {self.container_name}. VSCode URL: {self.vscode_url}',
)
self.log_buffer = LogBuffer(self.container, self.log)
if not self.attach_to_existing:
self.log('info', f'Waiting for client to become ready at {self.api_url}...')
self.send_status_message('STATUS$WAITING_FOR_CLIENT')
@@ -358,7 +363,6 @@ class EventStreamRuntime(Runtime):
environment=environment,
volumes=volumes,
)
self.log_buffer = LogBuffer(self.container, self.log)
self.log('debug', f'Container started. Server url: {self.api_url}')
self.send_status_message('STATUS$CONTAINER_STARTED')
except docker.errors.APIError as e:
@@ -385,11 +389,9 @@ class EventStreamRuntime(Runtime):
raise e
def _attach_to_container(self):
container = self.docker_client.containers.get(self.container_name)
self.log_buffer = LogBuffer(container, self.log)
self.container = container
self._container_port = 0
for port in container.attrs['NetworkSettings']['Ports']:
self.container = self.docker_client.containers.get(self.container_name)
for port in self.container.attrs['NetworkSettings']['Ports']: # type: ignore
self._container_port = int(port.split('/')[0])
break
self._host_port = self._container_port

View File

@@ -115,13 +115,15 @@ async def get_github_user(token: str) -> str:
github handle of the user
"""
logger.debug('Fetching GitHub user info from token')
g = Github(token)
try:
g = Github(token)
user = await call_sync_from_async(g.get_user)
login = user.login
logger.info(f'Successfully retrieved GitHub user: {login}')
return login
except GithubException as e:
logger.error(f'Error making request to GitHub API: {str(e)}')
logger.error(e)
raise
finally:
g.close()
login = user.login
logger.info(f'Successfully retrieved GitHub user: {login}')
return login

View File

@@ -51,7 +51,12 @@ class Session:
def close(self):
self.is_alive = False
self.agent_session.close()
try:
if self.websocket is not None:
self.websocket.close()
self.websocket = None
finally:
self.agent_session.close()
async def loop_recv(self):
try: