lmcache--lmcache
173 行
5.5 KiB
Python
173 行
5.5 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
# Standard
|
|
import json
|
|
|
|
# Third Party
|
|
from fastapi import APIRouter
|
|
from starlette.requests import Request
|
|
from starlette.responses import PlainTextResponse
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.put("/freeze/enable")
|
|
async def enable_freeze(request: Request):
|
|
"""
|
|
Enable freeze mode for the LMCache engine.
|
|
|
|
When freeze mode is enabled:
|
|
- All store operations will be skipped (no new data stored)
|
|
- Only local_cpu backend will be used for retrieval
|
|
- No admit/evict messages will be generated
|
|
This protects the local_cpu hot cache from changes.
|
|
|
|
Args:
|
|
request (Request): The FastAPI request object containing application state.
|
|
|
|
Returns:
|
|
PlainTextResponse: A JSON response indicating the operation status.
|
|
|
|
Example:
|
|
```bash
|
|
curl -X PUT "http://localhost:8000/freeze/enable"
|
|
# Response: {"status": "success", "freeze": true}
|
|
```
|
|
"""
|
|
try:
|
|
lmcache_adapter = request.app.state.lmcache_adapter
|
|
lmcache_engine = getattr(lmcache_adapter, "lmcache_engine", None)
|
|
if not lmcache_engine:
|
|
error_info = {
|
|
"error": "/freeze/enable API is unavailable",
|
|
"message": "LMCache engine not configured.",
|
|
}
|
|
return PlainTextResponse(
|
|
content=json.dumps(error_info, indent=2),
|
|
media_type="application/json",
|
|
status_code=503, # Service Unavailable
|
|
)
|
|
|
|
lmcache_engine.freeze(True)
|
|
success_info = {
|
|
"status": "success",
|
|
"freeze": True,
|
|
"message": "Freeze mode enabled successfully",
|
|
}
|
|
return PlainTextResponse(
|
|
content=json.dumps(success_info, indent=2),
|
|
media_type="application/json",
|
|
)
|
|
except Exception as e:
|
|
error_msg = "Failed to enable freeze mode"
|
|
error_info = {"error": error_msg, "message": str(e)}
|
|
return PlainTextResponse(
|
|
content=json.dumps(error_info, indent=2),
|
|
media_type="application/json",
|
|
status_code=500,
|
|
)
|
|
|
|
|
|
@router.put("/freeze/disable")
|
|
async def disable_freeze(request: Request):
|
|
"""
|
|
Disable freeze mode for the LMCache engine.
|
|
|
|
When freeze mode is disabled, store operations will proceed normally.
|
|
|
|
Args:
|
|
request (Request): The FastAPI request object containing application state.
|
|
|
|
Returns:
|
|
PlainTextResponse: A JSON response indicating the operation status.
|
|
|
|
Example:
|
|
```bash
|
|
curl -X PUT "http://localhost:8000/freeze/disable"
|
|
# Response: {"status": "success", "freeze": false}
|
|
```
|
|
"""
|
|
try:
|
|
lmcache_adapter = request.app.state.lmcache_adapter
|
|
lmcache_engine = getattr(lmcache_adapter, "lmcache_engine", None)
|
|
if not lmcache_engine:
|
|
error_info = {
|
|
"error": "/freeze/disable API is unavailable",
|
|
"message": "LMCache engine not configured.",
|
|
}
|
|
return PlainTextResponse(
|
|
content=json.dumps(error_info, indent=2),
|
|
media_type="application/json",
|
|
status_code=503, # Service Unavailable
|
|
)
|
|
|
|
lmcache_engine.freeze(False)
|
|
success_info = {
|
|
"status": "success",
|
|
"freeze": False,
|
|
"message": "Freeze mode disabled successfully",
|
|
}
|
|
return PlainTextResponse(
|
|
content=json.dumps(success_info, indent=2),
|
|
media_type="application/json",
|
|
)
|
|
except Exception as e:
|
|
error_msg = "Failed to disable freeze mode"
|
|
error_info = {"error": error_msg, "message": str(e)}
|
|
return PlainTextResponse(
|
|
content=json.dumps(error_info, indent=2),
|
|
media_type="application/json",
|
|
status_code=500,
|
|
)
|
|
|
|
|
|
@router.get("/freeze/status")
|
|
async def get_freeze_status(request: Request):
|
|
"""
|
|
Get the current freeze mode status of the LMCache engine.
|
|
|
|
Args:
|
|
request (Request): The FastAPI request object containing application state.
|
|
|
|
Returns:
|
|
PlainTextResponse: JSON response with current freeze mode status.
|
|
|
|
Example:
|
|
```bash
|
|
curl -X GET "http://localhost:8000/freeze/status"
|
|
# Response: {"status": "success", "freeze": true}
|
|
```
|
|
"""
|
|
try:
|
|
lmcache_adapter = request.app.state.lmcache_adapter
|
|
lmcache_engine = getattr(lmcache_adapter, "lmcache_engine", None)
|
|
if not lmcache_engine:
|
|
error_info = {
|
|
"error": "/freeze/status API is unavailable",
|
|
"message": "LMCache engine not configured.",
|
|
}
|
|
return PlainTextResponse(
|
|
content=json.dumps(error_info, indent=2),
|
|
media_type="application/json",
|
|
status_code=503, # Service Unavailable
|
|
)
|
|
|
|
freeze_mode = lmcache_engine.is_frozen()
|
|
mode_str = "enabled" if freeze_mode else "disabled"
|
|
success_info = {
|
|
"status": "success",
|
|
"freeze": freeze_mode,
|
|
"message": "Freeze mode is " + mode_str,
|
|
}
|
|
return PlainTextResponse(
|
|
content=json.dumps(success_info, indent=2),
|
|
media_type="application/json",
|
|
)
|
|
except Exception as e:
|
|
error_msg = "Failed to get freeze mode status"
|
|
error_info = {"error": error_msg, "message": str(e)}
|
|
return PlainTextResponse(
|
|
content=json.dumps(error_info, indent=2),
|
|
media_type="application/json",
|
|
status_code=500,
|
|
)
|