Add in-memory metadata cache to avoid redundant disk I/O
List, prune, and delete operations now use a lightweight in-memory cache of snapshot metadata (everything except graphData). Only get_full_record() and update_meta() hit disk after warm-up, keeping sidebar loads and auto-capture prune cycles fast. Key changes: - snapshot_storage.py: cache layer (_cache, _cache_warmed, _extract_meta, _ensure_cached), new get_full_record() and update_meta() functions, all existing functions updated to use cache - snapshot_routes.py: new /get and /update-meta endpoints - snapshot_manager.js: db_getFullRecord() and db_updateMeta() helpers, lazy graphData fetch in restore/swap/diff/preview/tooltip, label/notes/ lock use update_meta instead of full put to preserve graphData on disk Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -40,6 +40,43 @@ async def list_snapshots(request):
|
||||
return web.json_response({"error": str(e)}, status=500)
|
||||
|
||||
|
||||
@routes.post("/snapshot-manager/get")
|
||||
async def get_snapshot(request):
|
||||
try:
|
||||
data = await request.json()
|
||||
workflow_key = data.get("workflowKey")
|
||||
snapshot_id = data.get("id")
|
||||
if not workflow_key or not snapshot_id:
|
||||
return web.json_response({"error": "Missing workflowKey or id"}, status=400)
|
||||
record = storage.get_full_record(workflow_key, snapshot_id)
|
||||
if record is None:
|
||||
return web.json_response({"error": "Not found"}, status=404)
|
||||
return web.json_response(record)
|
||||
except ValueError as e:
|
||||
return web.json_response({"error": str(e)}, status=400)
|
||||
except Exception as e:
|
||||
return web.json_response({"error": str(e)}, status=500)
|
||||
|
||||
|
||||
@routes.post("/snapshot-manager/update-meta")
|
||||
async def update_snapshot_meta(request):
|
||||
try:
|
||||
data = await request.json()
|
||||
workflow_key = data.get("workflowKey")
|
||||
snapshot_id = data.get("id")
|
||||
fields = data.get("fields")
|
||||
if not workflow_key or not snapshot_id or not isinstance(fields, dict):
|
||||
return web.json_response({"error": "Missing workflowKey, id, or fields"}, status=400)
|
||||
ok = storage.update_meta(workflow_key, snapshot_id, fields)
|
||||
if not ok:
|
||||
return web.json_response({"error": "Not found"}, status=404)
|
||||
return web.json_response({"ok": True})
|
||||
except ValueError as e:
|
||||
return web.json_response({"error": str(e)}, status=400)
|
||||
except Exception as e:
|
||||
return web.json_response({"error": str(e)}, status=500)
|
||||
|
||||
|
||||
@routes.post("/snapshot-manager/delete")
|
||||
async def delete_snapshot(request):
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user