Skip to content

Commit bcfcdf4

Browse files
committed
Delay console token consumption
1 parent 1704fff commit bcfcdf4

2 files changed

Lines changed: 14 additions & 12 deletions

File tree

host-agent/firecracker-agent.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ async def console_websocket(token: str, websocket: WebSocket):
207207
if not CONSOLE_TOKEN_MANAGER:
208208
await websocket.close(code=1008)
209209
return
210-
info = CONSOLE_TOKEN_MANAGER.consume(token)
210+
info = CONSOLE_TOKEN_MANAGER.peek(token)
211211
if not info:
212212
await websocket.close(code=1008)
213213
return
@@ -222,6 +222,7 @@ async def console_websocket(token: str, websocket: WebSocket):
222222
return
223223

224224
await websocket.accept()
225+
info = CONSOLE_TOKEN_MANAGER.consume(token)
225226
close_event = asyncio.Event()
226227

227228
async def ws_to_tcp():

host-agent/utils/console_tokens.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,27 @@ def issue(self, vm_name: str, port: int, password: Optional[str], session_name:
2020
"port": int(port),
2121
"password": password,
2222
"session": session_name,
23-
"expires_at": time.time() + self.ttl,
23+
"issued_at": time.time(),
2424
}
2525
with self._lock:
2626
self._tokens[token] = entry
2727
return token
2828

29-
def consume(self, token: str) -> Optional[Dict[str, object]]:
30-
if not token:
31-
return None
29+
def peek(self, token: str) -> Optional[Dict[str, object]]:
3230
with self._lock:
33-
entry = self._tokens.pop(token, None)
31+
entry = self._tokens.get(token)
3432
if not entry:
3533
return None
36-
if entry["expires_at"] < time.time():
34+
if entry.get("issued_at", 0) + self.ttl < time.time():
35+
self.consume(token)
3736
return None
3837
return entry
3938

40-
def purge_expired(self) -> None:
41-
cutoff = time.time()
39+
def consume(self, token: str) -> Optional[Dict[str, object]]:
4240
with self._lock:
43-
expired = [tok for tok, info in self._tokens.items() if info["expires_at"] < cutoff]
44-
for tok in expired:
45-
self._tokens.pop(tok, None)
41+
entry = self._tokens.pop(token, None)
42+
if not entry:
43+
return None
44+
if entry.get("issued_at", 0) + self.ttl < time.time():
45+
return None
46+
return entry

0 commit comments

Comments
 (0)