{"record":{"id":"a0a369f69f1a64e9","repo":"pentaho/pentaho-kettle","slug":"couldn-t-find-starting-point-in-this-job","errorCode":null,"errorMessage":"Couldn't find starting point in this job.","messagePattern":"Couldn't find starting point in this job\\.","errorType":"exception","errorClass":"KettleJobException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/Job.java","lineNumber":522,"sourceCode":"      Object syncObject = this;\n      if ( parentJob != null ) {\n        syncObject = parentJob; // parallel execution in a job\n      }\n\n      synchronized ( syncObject ) {\n        beginProcessing();\n      }\n\n      Result res = null;\n\n      if ( startJobEntryCopy == null ) {\n        startpoint = jobMeta.findJobEntry( JobMeta.STRING_SPECIAL_START, 0, false );\n      } else {\n        startpoint = startJobEntryCopy;\n        res = startJobEntryResult;\n      }\n      if ( startpoint == null ) {\n        throw new KettleJobException( BaseMessages.getString( PKG, \"Job.Log.CounldNotFindStartingPoint\" ) );\n      }\n\n      JobEntryResult jerEnd = null;\n\n      if ( startpoint.isStart() ) {\n        // Perform optional looping in the special Start job entry...\n        //\n        // long iteration = 0;\n\n        boolean isFirst = true;\n        JobEntrySpecial jes = (JobEntrySpecial) startpoint.getEntry();\n        while ( ( jes.isRepeat() || isFirst ) && !isStopped() ) {\n          isFirst = false;\n          res = execute( 0, null, startpoint, null, BaseMessages.getString( PKG, \"Job.Reason.Started\" ) );\n\n          //\n          // if (iteration > 0 && (iteration % 500) == 0) {\n          // System.out.println(\"other 500 iterations: \" + iteration);","sourceCodeStart":504,"sourceCodeEnd":540,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/Job.java#L504-L540","documentation":"Thrown during Job.execute when the job's starting point cannot be located. Kettle looks for the special 'Start' job entry (JobMeta.STRING_SPECIAL_START) in the job metadata, or uses the provided startJobEntryCopy; if both are null, execution cannot begin and a KettleJobException is thrown.","triggerScenarios":"Calling Job.execute (via run()) on a JobMeta that has no Start job entry and no explicit start entry copy was set.","commonSituations":"Programmatically built JobMeta missing the special Start entry; a job XML/repo definition where the Start entry was deleted or renamed; loading a job from a repository where the entry id didn't match.","solutions":["Add a Start job entry to the JobMeta (jobMeta.createJobEntryCopy with STRING_SPECIAL_START) before executing","Check that the job loaded from file/repository actually contains a Start entry","If starting at a specific entry, set startJobEntryCopy explicitly before run()","Re-export/fix the job definition if the Start entry is missing in the source artifact"],"exampleFix":"// before\nJobMeta jm = new JobMeta(); jm.addJobEntry(myEntry);\n// after\nJobMeta jm = new JobMeta();\nJobEntryCopy start = jm.createJobEntryCopy(startEntry); start.setStarting(true); jm.addJobEntryCopy(start);","handlingStrategy":"validation","validationCode":"JobEntryCopy start = jobMeta.findJobEntry(JobMeta.STRING_SPECIAL_START, 0, false);\nif (start == null && startJobEntryCopy == null) {\n  throw new IllegalStateException(\"Job has no Start entry and no explicit start entry set\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  job.run();\n} catch (KettleJobException e) {\n  if (e.getMessage().contains(\"starting point\")) {\n    log.error(\"JobMeta is missing its Start job entry: \" + jobMeta.getName());\n  }\n}","preventionTips":["Always include a Start job entry when building JobMeta programmatically","Validate loaded job XML/repo definitions contain the Start entry before executing","Don't delete or rename the special Start entry in job editors"],"tags":["job-execution","missing-start-entry"],"backgroundTag":"resource-not-found","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"}