krishvishal commented on code in PR #3754:
URL: https://github.com/apache/iggy/pull/3754#discussion_r3657024444
##########
core/server-ng/src/bootstrap.rs:
##########
@@ -2112,31 +2117,52 @@ fn resolve_optional_listener_addr(
Ok(None)
}
+/// Client-facing listener addresses resolved for this cluster node. Each port
+/// comes from the node's roster entry, falling back to the top-level listener
+/// default when the roster leaves it unset.
+struct ClusterClientAddrs {
+ client: SocketAddr,
+ ws: Option<SocketAddr>,
+ quic: Option<SocketAddr>,
+ http: Option<SocketAddr>,
+}
+
fn resolve_cluster_client_addrs(
self_node: &configs::ng_cluster::ClusterNodeConfig,
default_client_addr: SocketAddr,
default_ws_addr: Option<SocketAddr>,
default_quic_addr: Option<SocketAddr>,
-) -> Result<(SocketAddr, Option<SocketAddr>, Option<SocketAddr>),
ServerNgError> {
+ default_http_addr: Option<SocketAddr>,
+) -> Result<ClusterClientAddrs, ServerNgError> {
let client_port = self_node
.ports
.tcp
.unwrap_or_else(|| default_client_addr.port());
- let client_listen_addr =
- socket_addr_from_parts("cluster.nodes[*].ports.tcp", &self_node.ip,
client_port)?;
- let ws_listen_addr = resolve_cluster_optional_addr(
+ let client = socket_addr_from_parts("cluster.nodes[*].ports.tcp",
&self_node.ip, client_port)?;
+ let ws = resolve_cluster_optional_addr(
self_node,
"cluster.nodes[*].ports.websocket",
default_ws_addr,
|ports| ports.websocket,
)?;
- let quic_listen_addr = resolve_cluster_optional_addr(
+ let quic = resolve_cluster_optional_addr(
self_node,
"cluster.nodes[*].ports.quic",
default_quic_addr,
|ports| ports.quic,
)?;
- Ok((client_listen_addr, ws_listen_addr, quic_listen_addr))
+ let http = resolve_cluster_optional_addr(
+ self_node,
+ "cluster.nodes[*].ports.http",
+ default_http_addr,
+ |ports| ports.http,
+ )?;
Review Comment:
Cluster mode discards the host from `[http].address`.
`bootstrap.rs:2154-2159` -> `resolve_cluster_optional_addr:2168-2179` takes
only
`default_addr.port()`, then `socket_addr_from_parts:3014-3027` =
`SocketAddr::new(self_node.ip, port)`. Operator host dropped, not merged.
- `config.toml:41` = `127.0.0.1:3000`, documented `:40` "listens on localhost
only"; example node `ip = "192.168.1.100"` (`:644`). So `cluster.enabled =
true`
silently moves JWT minting and `/ui` from loopback to the cluster
interface.
No log, no warning.
- `Dockerfile:58`, `helm/.../values.yaml:95`, `web/docker-compose.yml:24` all
`0.0.0.0:3000` (helm `README.md:209` requires it). Those narrow to the
roster
IP, breaking loopback probes and sidecar scrapes.
- Validation misses both: `cluster.rs:257-276` guards `if let Some(port)`, so
unset ports resolving to one shared endpoint are never compared.
`TransportPorts.http` (`cluster.rs:160`) undocumented.
Fix: `SocketAddr::new(default_http_addr.ip(), roster_port_or_default)`. If
ws/quic symmetry is preferred, log the effective bind when it differs from
`http.address` and document it on `TransportPorts` + `[cluster]`.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]