• Chen Tianjie's avatar
    Support TLS service when "tls-cluster" is not enabled and persist both plain... · 22a29935
    Chen Tianjie authored
    Support TLS service when "tls-cluster" is not enabled and persist both plain and TLS port in nodes.conf (#12233)
    
    Originally, when "tls-cluster" is enabled, `port` is set to TLS port. In order to support non-TLS clients, `pport` is used to propagate TCP port across cluster nodes. However when "tls-cluster" is disabled, `port` is set to TCP port, and `pport` is not used, which means the cluster cannot provide TLS service unless "tls-cluster" is on.
    ```
    typedef struct {
        // ...
        uint16_t port;  /* Latest known clients port (TLS or plain). */
        uint16_t pport; /* Latest known clients plaintext port. Only used if the main clients port is for TLS. */
        // ...
    } clusterNode;
    ```
    ```
    typedef struct {
        // ...
        uint16_t port;   /* TCP base port number. */
        uint16_t pport;  /* Sender TCP plaintext port, if base port is TLS */
        // ...
    } clusterMsg;
    ```
    This PR renames `port` and `pport` in `clusterNode` to `tcp_port` and `tls_port`, to record both ports no matter "tls-cluster" is enabled or disabled.
    
    This allows to provide TLS service to clients when "tls-cluster" is disabled: when displaying cluster topology, or giving `MOVED` error, server can provide TLS or TCP port according to client's connection type, no matter what type of connection cluster bus is using.
    
    For backwards compatibility, `port` and `pport` in `clusterMsg` are preserved, when "tls-cluster" is enabled, `port` is set to TLS port and `pport` is set to TCP port, when "tls-cluster" is disabled, `port` is set to TCP port and `pport` is set to TLS port (instead of 0).
    
    Also, in the nodes.conf file, a new aux field displaying an extra port is added to complete the persisted info. We may have `tls_port=xxxxx` or `tcp_port=xxxxx` in the aux field, to complete the cluster topology, while the other port is stored in the normal `<ip>:<port>` field. The format is shown below.
    ```
    <node-id> <ip>:<tcp_port>@<cport>,<hostname>,shard-id=...,tls-port=6379 myself,master - 0 0 0 connected 0-1000
    ```
    Or we can switch the position of two ports, both can be correctly resolved.
    ```
    <node-id> <ip>:<tls_port>@<cport>,<hostname>,shard-id=...,tcp-port=6379 myself,master - 0 0 0 connected 0-1000
    ```
    22a29935
cluster-response-tls.tcl 3.99 KB