{"record":{"id":"365e6de5e377d34d","repo":"pentaho/pentaho-kettle","slug":"delaymeta-exception-unabletoreadstepinfo","errorCode":"DelayMeta.Exception.UnableToReadStepInfo","errorMessage":"DelayMeta.Exception.UnableToReadStepInfo","messagePattern":"DelayMeta\\.Exception\\.UnableToReadStepInfo","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/delay/DelayMeta.java","lineNumber":133,"sourceCode":"    } else if ( scaletime.equals( ScaleTimeCode[2] ) ) {\n      retval = 2;\n    } else if ( scaletime.equals( ScaleTimeCode[3] ) ) {\n      retval = 3;\n    }\n\n    return retval;\n  }\n\n  private void readData( Node stepnode ) throws KettleXMLException {\n    try {\n      timeout = XMLHandler.getTagValue( stepnode, \"timeout\" );\n      scaletime = XMLHandler.getTagValue( stepnode, \"scaletime\" );\n      // set all unknown values to seconds\n      setScaleTimeCode( getScaleTimeCode() ); // compatibility reasons for transformations before 3.1.1, see PDI-1850,\n                                              // PDI-1532\n\n    } catch ( Exception e ) {\n      throw new KettleXMLException( BaseMessages.getString( PKG, \"DelayMeta.Exception.UnableToReadStepInfo\" ), e );\n    }\n  }\n\n  public void setDefault() {\n    timeout = \"1\"; // default one second\n    scaletime = DEFAULT_SCALE_TIME; // defaults to \"seconds\"\n  }\n\n  public String getTimeOut() {\n    return timeout;\n  }\n\n  public void setTimeOut( String timeout ) {\n    this.timeout = timeout;\n  }\n\n  public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases ) throws KettleException {\n    try {","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/delay/DelayMeta.java#L115-L151","documentation":"DelayMeta.readData reads the Delay step's XML (timeout, scaletime tags) during loadXML. Any exception is wrapped in a KettleXMLException with 'DelayMeta.Exception.UnableToReadStepInfo'. It means the Delay step's XML definition could not be parsed; note transformations before 3.1.1 may lack scaletime, which is normalized for compatibility.","triggerScenarios":"loadXML on a step node where XMLHandler.getTagValue throws due to malformed XML, or where a required tag structure is absent so parsing fails.","commonSituations":"Corrupted or hand-edited .ktr files; transformations exported by very old PDI versions (pre-3.1.1) with unexpected tag layout; truncated file transfers; XML generated by third-party tools missing Delay tags.","solutions":["Inspect the Delay step XML in the .ktr and ensure <timeout> and <scaletime> tags exist inside a well-formed step node.","Re-add the Delay step in Spoon and re-save the transformation.","Restore the transformation file from backup/version control.","If migrating from pre-3.1.1 PDI, re-save the transformation once with a compatible PDI version."],"exampleFix":"// before: missing tags\n<step><name>Delay</name><type>Delay</type></step>\n// after\n<step><name>Delay</name><type>Delay</type>\n  <timeout>1000</timeout>\n  <scaletime>milliseconds</scaletime>\n</step>","handlingStrategy":"validation","validationCode":"// Check the Delay step XML before load\nString timeout = XMLHandler.getTagValue(stepNode, \"timeout\");\nString scaletime = XMLHandler.getTagValue(stepNode, \"scaletime\");\nif (timeout == null || scaletime == null) {\n  throw new KettleException(\"Delay step XML missing timeout/scaletime tags\");\n}","typeGuard":null,"tryCatchPattern":"try { transMeta = new TransMeta(ktrPath); } catch (KettleXMLException e) { logError(\"Delay step unreadable: \" + e.getMessage(), e); // re-create or restore the transformation\ntransMeta = restoreOrRebuild(ktrPath); }","preventionTips":["Edit transformations only in Spoon, never by hand.","Migrate pre-3.1.1 transformations by re-saving them in a supported PDI version.","Verify transferred .ktr files are complete before loading.","Keep transformations in version control."],"tags":["kettle","xml","step-metadata","deserialization"],"backgroundTag":"json-parse-error","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}