Skip to content

Commit 6fb500e

Browse files
committed
fix ci
1 parent 91f22bd commit 6fb500e

4 files changed

Lines changed: 31 additions & 8 deletions

File tree

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ It provides worker registration, load balancing, health checking, refit weights
88

99
## Table of Contents
1010

11-
- [Overview](#Overview)
11+
- [Overview](#overview)
1212
- [Installation](#installation)
1313
- [Quick Start](#quick-start)
1414
- [Start diffusion workers](#start-diffusion-workers)
@@ -18,7 +18,7 @@ It provides worker registration, load balancing, health checking, refit weights
1818
- [Videos Result Query](#videos-result-query)
1919
- [Model Discovery and Health Checks](#model-discovery-and-health-checks)
2020
- [Worker Management APIs](#worker-management-apis)
21-
- [Optional (business-dependent)](#optional-business-dependent)
21+
- [RL Related API](#rl-related-api)
2222
- [Acknowledgment](#acknowledgment)
2323

2424
---
@@ -209,7 +209,7 @@ curl -X POST http://localhost:30081/v1/videos \
209209
-d '{"model": "Qwen/Qwen-Image", "prompt": "a flowing river"}'
210210

211211
# Poll a specific video job by video_id
212-
curl http://localhost:30081/v1/videos/<video_id>
212+
curl http://localhost:30081/v1/videos/{video_id}
213213

214214

215215
curl -X POST http://localhost:30081/update_weights_from_disk \
@@ -263,11 +263,11 @@ Video query routing is stable by `video_id`: router caches `video_id -> worker`
263263
- `is_dead` (boolean): quarantine (`true`) or recover (`false`) this worker.
264264
- `refresh_video_support` (boolean): re-probe worker `/v1/models` capability.
265265

266-
### Optional (business-dependent)
266+
### RL Related API
267267

268268
| Method | Path | Description |
269269
|---|---|---|
270-
| `POST` | `/update_weights_from_disk` | Reload weights from disk (ops/admin use) |
270+
| `POST` | `/update_weights_from_disk` | Reload weights from disk on all healthy workers |
271271

272272
---
273273

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,4 @@ where = ["src"]
4141

4242
[tool.pytest.ini_options]
4343
testpaths = ["tests/unit"]
44+
pythonpath = ["src"]

src/sglang_diffusion_routing/router/diffusion_router.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,11 @@ def __init__(self, args, verbose: bool = False):
6161
def _setup_routes(self) -> None:
6262
self.app.post("/workers")(self.create_worker)
6363
self.app.get("/workers")(self.get_workers)
64-
self.app.get("/workers/{worker_id}")(self.get_worker)
65-
self.app.put("/workers/{worker_id}")(self.update_worker)
66-
self.app.delete("/workers/{worker_id}")(self.delete_worker)
64+
# worker_id is a URL-encoded worker URL; decoded value can contain "/".
65+
# Use :path converter so encoded slashes still resolve to this route.
66+
self.app.get("/workers/{worker_id:path}")(self.get_worker)
67+
self.app.put("/workers/{worker_id:path}")(self.update_worker)
68+
self.app.delete("/workers/{worker_id:path}")(self.delete_worker)
6769
self.app.post("/v1/images/generations")(self.generate)
6870
self.app.post("/v1/videos")(self.generate_video)
6971
self.app.get("/v1/videos")(self.list_or_poll_videos)
@@ -670,6 +672,15 @@ async def health(self, request: Request):
670672

671673
async def update_weights_from_disk(self, request: Request):
672674
"""Broadcast weight reload to all healthy workers."""
675+
healthy_workers = [
676+
url for url in self.worker_request_counts if url not in self.dead_workers
677+
]
678+
if not healthy_workers:
679+
return JSONResponse(
680+
status_code=503,
681+
content={"error": "No healthy workers available in the pool"},
682+
)
683+
673684
body = await request.body()
674685
headers = dict(request.headers)
675686
results = await self._broadcast_to_workers(

tests/unit/test_router_endpoints.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,3 +327,14 @@ async def fake_broadcast(path: str, body: bytes, headers: dict):
327327
response = client.post("/update_weights_from_disk", json={"model_path": "abc"})
328328
assert response.status_code == 200
329329
assert response.json()["results"][0]["status_code"] == 200
330+
331+
332+
def test_update_weights_from_disk_returns_503_without_healthy_workers():
333+
router = DiffusionRouter(make_router_args())
334+
router.register_worker("http://localhost:10090")
335+
router.dead_workers.add("http://localhost:10090")
336+
337+
with TestClient(router.app) as client:
338+
response = client.post("/update_weights_from_disk", json={"model_path": "abc"})
339+
assert response.status_code == 503
340+
assert "No healthy workers available" in response.json()["error"]

0 commit comments

Comments
 (0)