{"record":{"id":"fff9525fa335fdb0","repo":"pentaho/pentaho-kettle","slug":"elasticsearchbulkdialog-error-nonodesfound","errorCode":"ElasticSearchBulkDialog.Error.NoNodesFound","errorMessage":"ElasticSearchBulkDialog.Error.NoNodesFound","messagePattern":"ElasticSearchBulkDialog\\.Error\\.NoNodesFound","errorType":"exception","errorClass":"KettleStepException","httpStatus":null,"severity":"error","filePath":"plugins/elasticsearch-bulk-insert/core/src/main/java/org/pentaho/di/trans/steps/elasticsearchbulk/ElasticSearchBulk.java","lineNumber":226,"sourceCode":"      if ( isJsonInsert ) {\n        addSourceFromJsonString( row, requestBuilder );\n      } else {\n        addSourceFromRowFields( requestBuilder, rowMeta, row );\n      }\n\n      currentRequest.add( requestBuilder );\n      requestsBuffer.add( requestBuilder );\n\n      if ( currentRequest.numberOfActions() >= batchSize ) {\n        return processBatch( true );\n      } else {\n        return true;\n      }\n\n    } catch ( KettleStepException e ) {\n      throw e;\n    } catch ( NoNodeAvailableException e ) {\n      throw new KettleStepException( BaseMessages.getString( PKG, \"ElasticSearchBulkDialog.Error.NoNodesFound\" ) );\n    } catch ( Exception e ) {\n      throw new KettleStepException( BaseMessages.getString( PKG, \"ElasticSearchBulk.Log.Exception\", e\n              .getLocalizedMessage() ), e );\n    }\n  }\n\n  /**\n   * @param row\n   * @param requestBuilder\n   */\n  private void addSourceFromJsonString( Object[] row, IndexRequestBuilder requestBuilder ) throws KettleStepException {\n    Object jsonString = row[jsonFieldIdx];\n    if ( jsonString instanceof byte[] ) {\n      requestBuilder.setSource( (byte[]) jsonString, XContentType.JSON );\n    } else if ( jsonString instanceof String ) {\n      requestBuilder.setSource( (String) jsonString, XContentType.JSON );\n    } else {\n      throw new KettleStepException( BaseMessages.getString( \"ElasticSearchBulk.Error.NoJsonFieldFormat\" ) );","sourceCodeStart":208,"sourceCodeEnd":244,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/elasticsearch-bulk-insert/core/src/main/java/org/pentaho/di/trans/steps/elasticsearchbulk/ElasticSearchBulk.java#L208-L244","documentation":"indexRow converts rows into bulk requests for Elasticsearch. When the client throws NoNodeAvailableException (no reachable node in the cluster), it is translated to KettleStepException 'ElasticSearchBulkDialog.Error.NoNodesFound'. It means the step could not connect to any configured Elasticsearch node.","triggerScenarios":"indexRow executing a bulk request while every configured node is unreachable — wrong host/port, cluster down, or transport mismatch.","commonSituations":"Elasticsearch not running or restarted on another port; firewall blocking 9200/9300; wrong transport vs HTTP protocol/transport plugin for the ES version; DNS/hostname typos in node list.","solutions":["Verify Elasticsearch is running and reachable at the configured hosts/ports (curl http://host:9200)","Check firewall/network rules between PDI and the cluster","Confirm the transport protocol and version match your Elasticsearch version","Validate the nodes list in the step dialog for typos"],"exampleFix":"// before\n// nodes: es1.example.com:9300 (ES down)\n// after\n// start the cluster and confirm: curl -s es1.example.com:9200 -> 200","handlingStrategy":"validation","validationCode":"// health-check the cluster before running the transformation\nHttpURLConnection c = (HttpURLConnection) new URL(\"http://\" + host + \":\" + port + \"/\").openConnection();\nc.setConnectTimeout(3000);\nif (c.getResponseCode() != 200) throw new IllegalStateException(\"Elasticsearch not reachable at \" + host + \":\" + port);","typeGuard":null,"tryCatchPattern":"try { ... } catch (KettleStepException e) { if (e.getMessage().contains(\"NoNodesFound\")) { logError(\"Elasticsearch cluster unreachable — check hosts/ports and cluster status\"); } throw e; }","preventionTips":["Monitor cluster health and node counts before scheduled runs","Pin protocol/transport settings to the deployed ES version","Verify firewall rules for the configured node ports","Use stable DNS names and validate the nodes list in the dialog"],"tags":["elasticsearch","pdi","network","connectivity"],"backgroundTag":"connection-refused","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"}