{"record":{"id":"574057aae7d5f5a2","repo":"conductor-oss/conductor","slug":"error-reading-workflow-s","errorCode":null,"errorMessage":"Error reading workflow: %s","messagePattern":"Error reading workflow: (.+?)","errorType":"exception","errorClass":"TransientException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java","lineNumber":195,"sourceCode":"        WorkflowModel workflow = executionDAO.getWorkflow(workflowId, includeTasks);\n        if (workflow == null) {\n            LOGGER.debug(\"Workflow {} not found in executionDAO, checking indexDAO\", workflowId);\n            String json = indexDAO.get(workflowId, RAW_JSON_FIELD);\n            if (json == null) {\n                String errorMsg = String.format(\"No such workflow found by id: %s\", workflowId);\n                LOGGER.error(errorMsg);\n                throw new NotFoundException(errorMsg);\n            }\n\n            try {\n                workflow = objectMapper.readValue(json, WorkflowModel.class);\n                if (!includeTasks) {\n                    workflow.getTasks().clear();\n                }\n            } catch (IOException e) {\n                String errorMsg = String.format(\"Error reading workflow: %s\", workflowId);\n                LOGGER.error(errorMsg);\n                throw new TransientException(errorMsg, e);\n            }\n        }\n        return workflow;\n    }\n\n    /**\n     * Retrieve all workflow executions with the given correlationId and workflow type Uses the\n     * {@link IndexDAO} to search across workflows if the {@link ExecutionDAO} cannot perform\n     * searches across workflows.\n     *\n     * @param workflowName, workflow type to be queried\n     * @param correlationId the correlation id to be queried\n     * @param includeTasks if true, fetches the {@link Task} data within the workflows\n     * @return the list of {@link Workflow} executions matching the correlationId\n     */\n    public List<Workflow> getWorkflowsByCorrelationId(\n            String workflowName, String correlationId, boolean includeTasks) {\n        if (!executionDAO.canSearchAcrossWorkflows()) {","sourceCodeStart":177,"sourceCodeEnd":213,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java#L177-L213","documentation":"Thrown as a TransientException wrapping an IOException when objectMapper.readValue fails to deserialize the RAW_JSON_FIELD retrieved from the IndexDAO. The workflow JSON was found in the index but cannot be parsed back into a WorkflowModel — i.e. the index holds corrupt or schema-incompatible data. Marked transient because it is treated as a recoverable (often retryable) data-access failure rather than a definitive 'does not exist'.","triggerScenarios":"The indexDAO returned a non-null JSON string that is malformed, truncated, or serialized by an incompatible Conductor version whose WorkflowModel schema differs. Fires inside getWorkflowModelFromDataStore's catch (IOException) after the fallback index read.","commonSituations":"A version upgrade changed WorkflowModel fields and old archived JSON no longer deserializes. The index (Elasticsearch) returned a partial/corrupted document. Custom Jackson modules or polymorphic task types whose registered types changed.","solutions":["Inspect the raw JSON in the index for that workflowId to see what fails to parse.","If a schema change broke backward compatibility, add Jackson @JsonIgnoreProperties(ignoreUnknown=true) or migrate the archived documents.","If the document is genuinely corrupt, remove it from the index so the read fails fast with NotFoundException instead of a parse loop.","Because it is a TransientException, ensure callers retry with backoff but cap retries to avoid hammering a permanently corrupt record."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    Workflow wf = executionDAOFacade.getWorkflow(workflowId, true);\n} catch (TransientException e) {\n    // index JSON present but unparseable -> retry with backoff, then surface if persistent\n}","preventionTips":["Keep WorkflowModel backward compatible across upgrades (use @JsonIgnoreProperties(ignoreUnknown = true)).","Register all required Jackson modules on the shared ObjectMapper.","Periodically audit the index for corrupt documents and repair/remove them."],"tags":["workflow","serialization","index-dao","transient","jackson"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}