{"record":{"id":"e67dc2fdcaa72dbc","repo":"infiniflow/ragflow","slug":"sandbox-local-max-memory-mb-must-be-greater-than-0","errorCode":null,"errorMessage":"SANDBOX_LOCAL_MAX_MEMORY_MB must be greater than 0.","messagePattern":"SANDBOX_LOCAL_MAX_MEMORY_MB must be greater than 0\\.","errorType":"exception","errorClass":"SandboxProviderConfigError","httpStatus":null,"severity":"error","filePath":"agent/sandbox/providers/local.py","lineNumber":262,"sourceCode":"                \"min\": 0,\n                \"max\": 100,\n            },\n            \"max_artifact_bytes\": {\n                \"type\": \"integer\",\n                \"required\": False,\n                \"default\": 10485760,\n                \"label\": \"Max Artifact Size (bytes)\",\n                \"description\": \"Maximum size of a single artifact file. Unit: bytes.\",\n                \"min\": 1024,\n                \"max\": 104857600,\n            },\n        }\n\n    def _validate_limits(self) -> None:\n        if self.timeout <= 0:\n            raise SandboxProviderConfigError(\"SANDBOX_LOCAL_TIMEOUT must be greater than 0.\")\n        if self.max_memory_mb <= 0:\n            raise SandboxProviderConfigError(\"SANDBOX_LOCAL_MAX_MEMORY_MB must be greater than 0.\")\n        if self.max_output_bytes <= 0:\n            raise SandboxProviderConfigError(\"SANDBOX_LOCAL_MAX_OUTPUT_BYTES must be greater than 0.\")\n        if self.max_artifacts < 0:\n            raise SandboxProviderConfigError(\"SANDBOX_LOCAL_MAX_ARTIFACTS must be greater than or equal to 0.\")\n        if self.max_artifact_bytes <= 0:\n            raise SandboxProviderConfigError(\"SANDBOX_LOCAL_MAX_ARTIFACT_BYTES must be greater than 0.\")\n\n    def _prepare_script(self, instance_dir: Path, language: str, code: str, args_json: str) -> tuple[list[str], Path]:\n        if language == \"python\":\n            script_path = instance_dir / \"main.py\"\n            script_path.write_text(build_python_wrapper(code, args_json), encoding=\"utf-8\")\n            return [self.python_bin, str(script_path)], script_path\n        if language in {\"javascript\", \"nodejs\"}:\n            script_path = instance_dir / \"main.js\"\n            script_path.write_text(build_javascript_wrapper(code, args_json), encoding=\"utf-8\")\n            return [self.node_bin, str(script_path)], script_path\n        raise RuntimeError(f\"Unsupported language for local provider: {language}\")\n","sourceCodeStart":244,"sourceCodeEnd":280,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/agent/sandbox/providers/local.py#L244-L280","documentation":"Raised by LocalProvider._validate_limits() during initialize() when 'max_memory_mb' is zero or negative. The value is applied as an address-space rlimit (RLIMIT_AS) on the spawned child process via _limit_child_process, so a non-positive limit is rejected at configuration time with SandboxProviderConfigError. Default is 512 MB.","triggerScenarios":"Calling initialize({'max_memory_mb': 0}) or a negative value; int() coercion of a config string '0'. Also setting it very low (e.g. 1) passes validation but causes child MemoryError at runtime — though that is a separate failure.","commonSituations":"Trying to express 'unlimited memory' with 0; copying a container memory limit of 0 from an orchestration manifest; unit confusion (passing bytes like 536870912 instead of MB, which silently passes but is absurd).","solutions":["Set 'max_memory_mb' to a positive MB value (e.g. 512, the default) in the initialize() config.","Omit the key to use the 512 MB default.","Verify the upstream env/config variable that feeds max_memory_mb and ensure it is expressed in megabytes, not bytes.","If the workload genuinely needs no cap, still set a large positive value (e.g. 65536, the schema max) — 0 is not accepted."],"exampleFix":"// before\nprovider.initialize({\"max_memory_mb\": 0})\n\n// after\nprovider.initialize({\"max_memory_mb\": 512})","handlingStrategy":"validation","validationCode":"def valid_memory(config: dict) -> bool:\n    return int(config.get(\"max_memory_mb\", 512)) > 0","typeGuard":null,"tryCatchPattern":"try:\n    provider.initialize(config)\nexcept SandboxProviderConfigError as e:\n    if \"SANDBOX_LOCAL_MAX_MEMORY_MB\" in str(e):\n        config[\"max_memory_mb\"] = 512\n        provider.initialize(config)\n    else:\n        raise","preventionTips":["Express memory in MB, not bytes, when building the config.","Use a single config-builder function shared by tests so invalid values are caught in CI.","Remember rlimits are address-space caps; pick a value headroom above the workload's peak RSS."],"tags":["sandbox","configuration","local-provider","memory","validation"],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}