{"record":{"id":"5ed5515bbba9974b","repo":"pentaho/pentaho-kettle","slug":"no-master-server-was-specified-in-cluster-schema","errorCode":null,"errorMessage":"No master server was specified in cluster schema [\" + clusterSchema + \"]","messagePattern":"No master server was specified in cluster schema \\[\" \\+ clusterSchema \\+ \"\\]","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/cluster/TransSplitter.java","lineNumber":181,"sourceCode":"   *          the originalTransformation to set\n   */\n  public void setOriginalTransformation( TransMeta originalTransformation ) {\n    this.originalTransformation = originalTransformation;\n  }\n\n  private void checkClusterConfiguration() throws KettleException {\n    Map<String, ClusterSchema> map = new Hashtable<String, ClusterSchema>();\n    List<StepMeta> steps = originalTransformation.getSteps();\n    for ( int i = 0; i < steps.size(); i++ ) {\n      StepMeta step = steps.get( i );\n      ClusterSchema clusterSchema = step.getClusterSchema();\n      if ( clusterSchema != null ) {\n        map.put( clusterSchema.getName(), clusterSchema );\n\n        // Make sure we have at least one master to work with.\n        //\n        if ( clusterSchema.findMaster() == null ) {\n          throw new KettleException( \"No master server was specified in cluster schema [\" + clusterSchema + \"]\" );\n        }\n\n        // Remember cluster details while we have the cluster handy\n        //\n        socketsBufferSize =\n          Const.toInt(\n            originalTransformation.environmentSubstitute( clusterSchema.getSocketsBufferSize() ), 50000 );\n        compressingSocketStreams = clusterSchema.isSocketsCompressed();\n\n        // Validate the number of slaves. We need at least one to have a valid cluster\n        //\n        List<SlaveServer> slaves = clusterSchema.getSlaveServersFromMasterOrLocal();\n        int count = 0;\n        for ( int s = 0; s < slaves.size(); s++ ) {\n          if ( !slaves.get( s ).isMaster() ) {\n            count++;\n          }\n        }","sourceCodeStart":163,"sourceCodeEnd":199,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/cluster/TransSplitter.java#L163-L199","documentation":"TransSplitter.checkClusterConfiguration() iterates every cluster schema used by the transformation and throws KettleException 'No master server was specified in cluster schema [<schema>]' when clusterSchema.findMaster() returns null. Unlike error 1226 (dynamic resolution at split time), this is the upfront validation of static cluster configuration.","triggerScenarios":"checkClusterConfiguration(), invoked from splitOriginalTransformation(), encountering a (non-empty) ClusterSchema in the transformation whose slave-server list has no server with isMaster()==true.","commonSituations":"Creating a cluster schema and adding only slave servers; forgetting to designate a master after editing cluster members; schema referenced by steps but configured with stale/removed master entry.","solutions":["Designate exactly one master server in the cluster schema (SlaveServer.setMaster(true) or the master checkbox in Spoon).","Re-check the cluster schema used by the transformation's clustered steps and re-save the metadata.","Run checkClusterConfiguration() in a pre-flight validation before cluster submission to fail fast.","If the environment has no master (e.g. testing), switch to local/standalone execution instead of clustering."],"exampleFix":"// before\nClusterSchema cs = new ClusterSchema(\"cs1\", Arrays.asList(slaveA, slaveB), socketsBuf);\n// after\nslaveA.setMaster(true);\nClusterSchema cs = new ClusterSchema(\"cs1\", Arrays.asList(slaveA, slaveB), socketsBuf);","handlingStrategy":"validation","validationCode":"for (ClusterSchema cs : usedClusterSchemas) {\n  if (cs.findMaster() == null)\n    throw new IllegalStateException(\"Cluster schema '\" + cs.getName() + \"' has no master server\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  splitter.splitOriginalTransformation();\n} catch (KettleException e) {\n  if (e.getMessage().startsWith(\"No master server was specified\")) {\n    // fix cluster schema, then retry\n  }\n}","preventionTips":["Run splitter.checkClusterConfiguration() as a pre-flight step","Keep exactly one master per cluster schema","Re-validate cluster schemas after any slave-server edits"],"tags":["kettle","clustering","cluster-schema","validation"],"backgroundTag":"missing-required-config-field","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"}