Skip to content

Commit 1f8a680

Browse files
committed
core:services:kraken: Fix 5 min timeout
* Make sure kraken does not keeps reattaching to stream logs due to internal aiohttp 5 minutes timeout
1 parent 66d3e39 commit 1f8a680

File tree

4 files changed

+24
-13
lines changed

4 files changed

+24
-13
lines changed

core/services/kraken/harbor/container.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ async def get_running_container_by_name(cls, container_name: str) -> ContainerMo
113113

114114
@classmethod
115115
async def get_container_log_by_name(cls, container_name: str) -> AsyncGenerator[str, None]:
116-
async with DockerCtx() as client:
116+
async with DockerCtx(timeout=0) as client:
117117
try:
118118
container = await cls.get_raw_container_by_name(client, container_name)
119119
except ContainerNotFound as error:

core/services/kraken/harbor/contexts.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
from typing import Any
1+
from typing import Any, Optional
22

3+
import aiohttp
34
from aiodocker import Docker
45

56

@@ -8,8 +9,20 @@ class DockerCtx:
89
Context manager for Docker clients.
910
"""
1011

11-
def __init__(self) -> None:
12-
self._client: Docker = Docker()
12+
def __init__(self, timeout: Optional[int] = None) -> None:
13+
if timeout is None:
14+
self._client: Docker = Docker()
15+
else:
16+
# aiodocker will not create a session if is different from None
17+
self._client: Docker = Docker(session=True) # type: ignore
18+
# We insert a new session with desired timeout
19+
self._client.session = self._client.session = aiohttp.ClientSession(
20+
connector=self._client.connector,
21+
timeout=aiohttp.ClientTimeout(
22+
total=None if timeout == 0 else timeout,
23+
sock_read=None if timeout == 0 else timeout,
24+
),
25+
)
1326

1427
async def __aenter__(self) -> Docker:
1528
return self._client

core/services/kraken/kraken.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,12 @@ async def kill_dangling_containers(self) -> None:
165165
except Exception as e:
166166
logger.warning(f"Dangling container {container_name} could not be removed: {e}")
167167

168+
async def check_extension_logs_task(self) -> None:
169+
try:
170+
await self.extension_log_publisher.sync_with_running_extensions()
171+
except Exception as error:
172+
logger.debug(f"Failed to sync extension log streams: {error}")
173+
168174
async def start_starter_task(self) -> None:
169175
while self.is_running:
170176
await self.init_dead_extensions()
@@ -177,17 +183,10 @@ async def start_cleaner_task(self) -> None:
177183
await self.kill_invalid_extensions()
178184
await self.kill_dangling_containers()
179185
await self.cleanup_temporary_extensions()
186+
await self.check_extension_logs_task()
180187

181188
await asyncio.sleep(60)
182189

183-
async def start_extension_logs_task(self) -> None:
184-
while self.is_running:
185-
try:
186-
await self.extension_log_publisher.sync_with_running_extensions()
187-
except Exception as error:
188-
logger.debug(f"Failed to sync extension log streams: {error}")
189-
await asyncio.sleep(2)
190-
191190
async def stop(self) -> None:
192191
self.is_running = False
193192
await self.extension_log_publisher.shutdown()

core/services/kraken/main.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ async def main() -> None:
3838
# Launch background tasks
3939
asyncio.create_task(kraken.start_cleaner_task())
4040
asyncio.create_task(kraken.start_starter_task())
41-
asyncio.create_task(kraken.start_extension_logs_task())
4241
asyncio.create_task(jobs.start())
4342

4443
await server.serve()

0 commit comments

Comments
 (0)