[BugFix] Reject invalid data-parallel RPC ports (#51469)

Signed-off-by: aoshen02 <aoshen@inferact.ai> Co-authored-by: OpenAI Codex <codex@openai.com>

aoshen02 committed Aug 8, 2026 at 12:23 UTC 22a175921c4718f195d1eaddf5a26c9aaa07a326
4 files changed +24 -8
tests/test_config.py
+15
@@ -380,6 +380,21 @@ def test_async_scheduling_with_pipeline_parallelism_is_allowed():
380 assert cfg.scheduler_config.async_scheduling is True
381
382
383 +def test_data_parallel_rpc_port_has_fixed_default():
384 + assert ParallelConfig().data_parallel_rpc_port == 29550
385 +
386 +
387 +@pytest.mark.parametrize("port", [1, 29550, 65535])
388 +def test_data_parallel_rpc_port_accepts_valid_ports(port: int):
389 + assert ParallelConfig(data_parallel_rpc_port=port).data_parallel_rpc_port == port
390 +
391 +
392 +@pytest.mark.parametrize("port", [-1, 0, 65536])
393 +def test_data_parallel_rpc_port_rejects_invalid_ports(port: int):
394 + with pytest.raises(ValidationError):
395 + ParallelConfig(data_parallel_rpc_port=port)
396 +
397 +
398 def test_reconfigure_for_independent_dp_rank_on_multinode_dense_model():
399 parallel_config = ParallelConfig(
400 tensor_parallel_size=8,
vllm/config/parallel.py
+2 -2
@@ -140,8 +140,8 @@ class ParallelConfig:
140 """Local rank of the data parallel group, set only in SPMD mode."""
141 data_parallel_master_ip: str = "127.0.0.1"
142 """IP of the data parallel master."""
143 - data_parallel_rpc_port: int = 29550
144 - """Port for data parallel messaging."""
143 + data_parallel_rpc_port: int = Field(default=29550, ge=1, le=65535)
144 + """Fixed port for data parallel messaging, shared by all nodes."""
145 data_parallel_master_port: int = 29500
146 """Port of the data parallel master."""
147 data_parallel_backend: DataParallelBackend = "mp"
vllm/engine/arg_utils.py
+2 -1
@@ -1100,7 +1100,8 @@ class EngineArgs:
1100 "--data-parallel-rpc-port",
1101 "-dpp",
1102 type=int,
1103 - help="Port for data parallel RPC communication.",
1103 + help="Fixed port for data parallel RPC communication. All nodes "
1104 + "must use the same port.",
1105 )
1106 parallel_group.add_argument(
1107 "--data-parallel-backend",
vllm/v1/engine/utils.py
+5 -5
@@ -1165,11 +1165,11 @@ def launch_core_engines(
1165 if parallel_config.enable_elastic_ep:
1166 handshake_local_only = False
1167
1168 - # Preserve "port=0 means auto-pick" for the handshake address, which
1169 - # is consumed by engines spawned in this process and so cannot defer
1170 - # port resolution to bind time.
1171 - rpc_port = parallel_config.data_parallel_rpc_port or get_open_port()
1172 - handshake_address = get_engine_client_zmq_addr(handshake_local_only, host, rpc_port)
1168 + handshake_address = get_engine_client_zmq_addr(
1169 + handshake_local_only,
1170 + host,
1171 + parallel_config.data_parallel_rpc_port,
1172 + )
1173
1174 if local_engines_only and dp_rank > 0:
1175 assert not handshake_local_only