{"record":{"id":"18653c5970a3858d","repo":"pentaho/pentaho-kettle","slug":"clusterschema-nomasterserverdefined","errorCode":null,"errorMessage":"ClusterSchema.NoMasterServerDefined","messagePattern":"ClusterSchema\\.NoMasterServerDefined","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/cluster/ClusterSchema.java","lineNumber":280,"sourceCode":"  }\n\n  /**\n   * @param basePort\n   *          the basePort to set\n   */\n  public void setBasePort( String basePort ) {\n    this.basePort = basePort;\n  }\n\n  public SlaveServer findMaster() throws KettleException {\n    for ( int i = 0; i < slaveServers.size(); i++ ) {\n      SlaveServer slaveServer = slaveServers.get( i );\n      if ( slaveServer.isMaster() ) {\n        return slaveServer;\n      }\n    }\n    if ( slaveServers.size() > 0 ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"ClusterSchema.NoMasterServerDefined\", name ) );\n    }\n    throw new KettleException( BaseMessages.getString( PKG, \"ClusterSchema.NoSlaveServerDefined\", name ) );\n  }\n\n  /**\n   * @return The number of slave servers, excluding the master server\n   */\n  public int findNrSlaves() {\n    int nr = 0;\n    for ( int i = 0; i < slaveServers.size(); i++ ) {\n      SlaveServer slaveServer = slaveServers.get( i );\n      if ( !slaveServer.isMaster() ) {\n        nr++;\n      }\n    }\n    return nr;\n  }\n","sourceCodeStart":262,"sourceCodeEnd":298,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/cluster/ClusterSchema.java#L262-L298","documentation":"Thrown by ClusterSchema.findMaster when the cluster schema has slave servers defined but none of them is marked as master. A clustered transformation requires exactly one master slave server to coordinate execution.","triggerScenarios":"findMaster is called (e.g. by TransSplitter, getMasterServer, or cluster configuration check) while slaveServers is non-empty and no SlaveServer.isMaster() returns true.","commonSituations":"Cluster schema configured with slaves only and the master checkbox left unset; schema imported from XML or metadata where master flag was lost; master renamed without updating the cluster schema.","solutions":["Open the cluster schema and mark one slave server as master (isMaster=true)","Verify via getSlaveServers() that at least one entry has master set before splitting a transformation","Re-create the cluster schema definition if it came from an older/round-tripped export"],"exampleFix":"// before: schema with only slaves\nschema.getSlaveServers().forEach(s -> s.setMaster(false));\nsplitter.splitOriginalTransformation(transMeta);\n// after: designate a master before splitting\nboolean hasMaster = schema.getSlaveServers().stream().anyMatch(SlaveServer::isMaster);\nif (!hasMaster && !schema.getSlaveServers().isEmpty()) { schema.getSlaveServers().get(0).setMaster(true); }\nsplitter.splitOriginalTransformation(transMeta);","handlingStrategy":"validation","validationCode":"// Before clustering, verify a master exists\nboolean hasMaster = clusterSchema.getSlaveServers().stream().anyMatch(SlaveServer::isMaster);\nif (!hasMaster) { throw new KettleException(\"Cluster schema '\" + clusterSchema.getName() + \"' has no master\"); }","typeGuard":"boolean isUsableClusterSchema(ClusterSchema s) { return s != null && !s.getSlaveServers().isEmpty() && s.getSlaveServers().stream().anyMatch(SlaveServer::isMaster); }","tryCatchPattern":"try { SlaveServer master = clusterSchema.findMaster(); }\ncatch (KettleException e) { // no master defined — fix schema in UI/metadata before retry\n  throw new IllegalStateException(\"Configure a master in cluster schema\", e); }","preventionTips":["Always mark exactly one slave as master when creating a cluster schema","Re-check schema definitions after importing/exporting metadata","Validate cluster config with TransSplitter before production runs"],"tags":["clustering","configuration","kettle"],"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"}