{"record":{"id":"15bd3c596854839e","repo":"weaviate/weaviate","slug":"raft-intra-rpc-port-must-be-greater-than-0","errorCode":null,"errorMessage":"raft.intra_rpc_port must be greater than 0","messagePattern":"raft\\.intra_rpc_port must be greater than 0","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"usecases/config/config_handler.go","lineNumber":1203,"sourceCode":"\tDrainSleep         *runtime.DynamicValue[time.Duration]\n\n\tConsistencyWaitTimeout time.Duration\n\n\tBootstrapTimeout   time.Duration\n\tBootstrapExpect    int\n\tMetadataOnlyVoters bool\n\n\tEnableOneNodeRecovery bool\n\tForceOneNodeRecovery  bool\n}\n\nfunc (r *Raft) Validate() error {\n\tif r.Port == 0 {\n\t\treturn fmt.Errorf(\"raft.port must be greater than 0\")\n\t}\n\n\tif r.InternalRPCPort == 0 {\n\t\treturn fmt.Errorf(\"raft.intra_rpc_port must be greater than 0\")\n\t}\n\n\tuniqueMap := make(map[string]struct{}, len(r.Join))\n\tupdatedJoinList := make([]string, len(r.Join))\n\tfor i, nodeNameAndPort := range r.Join {\n\t\t// Check that the format is correct. In case only node name is present we append the default raft port\n\t\tnodeNameAndPortSplitted := strings.Split(nodeNameAndPort, \":\")\n\t\tif len(nodeNameAndPortSplitted) == 0 {\n\t\t\treturn fmt.Errorf(\"raft.join element %s has no node name\", nodeNameAndPort)\n\t\t} else if len(nodeNameAndPortSplitted) < 2 {\n\t\t\t// If user only specify a node name and no port, use the default raft port\n\t\t\tnodeNameAndPortSplitted = append(nodeNameAndPortSplitted, fmt.Sprintf(\"%d\", DefaultRaftPort))\n\t\t} else if len(nodeNameAndPortSplitted) > 2 {\n\t\t\treturn fmt.Errorf(\"raft.join element %s has unexpected amount of element\", nodeNameAndPort)\n\t\t}\n\n\t\t// Check that the node name is unique\n\t\tnodeName := nodeNameAndPortSplitted[0]","sourceCodeStart":1185,"sourceCodeEnd":1221,"githubUrl":"https://github.com/weaviate/weaviate/blob/75aa4b6d11f8818305aafd4440b4e32794f7ca04/usecases/config/config_handler.go#L1185-L1221","documentation":"Configuration validation error: the raft.join list contains the same node entry more than times than one. Duplicate join targets would create ambiguous cluster membership, so validation rejects the configuration at startup.","triggerScenarios":"Starting Weaviate with raft enabled without setting raft.intra_rpc_port / RAFT_INTERNAL_RPC_PORT, leaving the default 0.","commonSituations":"Configuring raft.port but forgetting the companion internal RPC port; copying a partial raft config from docs or a colleague; env-var-only setups where only some RAFT_* vars are exported.","solutions":["Set raft.intra_rpc_port (yaml) or RAFT_INTERNAL_RPC_PORT env var to a valid port, e.g. 7001","Ensure each raft node's config defines both raft.port and raft.intra_rpc_port","Review the multi-node setup docs to confirm all required raft ports are set"],"exampleFix":"// before\nraft:\n  port: 7000\n// after\nraft:\n  port: 7000\n  intra_rpc_port: 7001","handlingStrategy":"validation","validationCode":"if raftEnabled {\n  if raftPort == 0 || internalRPCPort == 0 {\n    panic(\"RAFT_PORT and RAFT_INTERNAL_RPC_PORT must both be set when raft is enabled\")\n  }\n}","typeGuard":null,"tryCatchPattern":"err := server.Start()\nif err != nil && strings.Contains(err.Error(), \"intra_rpc_port must be greater than 0\") {\n  // surface which env var is missing: RAFT_INTERNAL_RPC_PORT\n}","preventionTips":["Always configure raft.port and raft.intra_rpc_port as a pair","Pick non-overlapping defaults (e.g. 7000/7001) in your deployment templates","Check for partially exported RAFT_* env var sets before startup"],"tags":["configuration","raft","clustering","startup","weaviate"],"backgroundTag":"missing-config-value","analyzedSha":"75aa4b6d11f8818305aafd4440b4e32794f7ca04","analyzedAt":"2026-09-04T14:58:20.392Z","contentChangedAt":"2026-09-04T14:58:20.392Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}