major refactor
This commit is contained in:
@@ -326,6 +326,7 @@ def node_compile_report(state: DetectState) -> dict:
|
||||
|
||||
_CHECKPOINT_ENABLED = os.environ.get("MPR_CHECKPOINT", "").strip() == "1"
|
||||
_frames_manifest: dict[str, dict[int, str]] = {} # job_id → manifest (cached per job)
|
||||
_latest_checkpoint: dict[str, str] = {} # job_id → latest checkpoint_id
|
||||
|
||||
|
||||
class PipelineCancelled(Exception):
|
||||
@@ -361,17 +362,33 @@ def _checkpointing_node(node_name: str, node_fn):
|
||||
if not job_id:
|
||||
return result
|
||||
|
||||
from detect.checkpoint import save_checkpoint, save_frames
|
||||
from detect.checkpoint import save_stage_output, save_frames
|
||||
from detect.stages.base import _REGISTRY
|
||||
|
||||
merged = {**state, **result}
|
||||
|
||||
# Save frames once (first checkpoint), reuse manifest after
|
||||
# Save frames once (first node), reuse manifest after
|
||||
manifest = _frames_manifest.get(job_id)
|
||||
if manifest is None and node_name == "extract_frames":
|
||||
manifest = save_frames(job_id, merged.get("frames", []))
|
||||
_frames_manifest[job_id] = manifest
|
||||
|
||||
save_checkpoint(job_id, node_name, stage_index, merged, frames_manifest=manifest)
|
||||
# Serialize stage output using the stage's serialize_fn if available
|
||||
stage_cls = _REGISTRY.get(node_name)
|
||||
serialize_fn = getattr(getattr(stage_cls, "definition", None), "serialize_fn", None)
|
||||
if serialize_fn:
|
||||
output_json = serialize_fn(merged, job_id)
|
||||
else:
|
||||
output_json = {}
|
||||
|
||||
parent_id = _latest_checkpoint.get(job_id)
|
||||
new_checkpoint_id = save_stage_output(
|
||||
timeline_id=job_id,
|
||||
parent_checkpoint_id=parent_id,
|
||||
stage_name=node_name,
|
||||
output_json=output_json,
|
||||
)
|
||||
_latest_checkpoint[job_id] = new_checkpoint_id
|
||||
return result
|
||||
|
||||
wrapper.__name__ = node_fn.__name__
|
||||
|
||||
Reference in New Issue
Block a user