i show "Received unknown extension type %d" message continue (maybe ping tick) and success meet slave

void clusterProcessPingExtensions(clusterMsg *hdr, clusterLink *link) {
    clusterNode *sender = link->node ? link->node : clusterLookupNode(hdr->sender, CLUSTER_NAMELEN);
    char *ext_hostname = NULL;
    char *ext_humannodename = NULL;
    char *ext_shardid = NULL;
    uint16_t extensions = ntohs(hdr->extensions);
    /* Loop through all the extensions and process them */
    clusterMsgPingExt *ext = getInitialPingExt(hdr, ntohs(hdr->count));
    while (extensions--) {
        uint16_t type = ntohs(ext->type);
        if (type == CLUSTERMSG_EXT_TYPE_HOSTNAME) {
            clusterMsgPingExtHostname *hostname_ext = (clusterMsgPingExtHostname *) &(ext->ext[0].hostname);
            ext_hostname = hostname_ext->hostname;
        } else if (type == CLUSTERMSG_EXT_TYPE_HUMAN_NODENAME) {
            clusterMsgPingExtHumanNodename *humannodename_ext = (clusterMsgPingExtHumanNodename *) &(ext->ext[0].human_nodename);
            ext_humannodename = humannodename_ext->human_nodename;
        } else if (type == CLUSTERMSG_EXT_TYPE_FORGOTTEN_NODE) {
            clusterMsgPingExtForgottenNode *forgotten_node_ext = &(ext->ext[0].forgotten_node);
            clusterNode *n = clusterLookupNode(forgotten_node_ext->name, CLUSTER_NAMELEN);
            if (n && n != myself && !(nodeIsSlave(myself) && myself->slaveof == n)) {
                sds id = sdsnewlen(forgotten_node_ext->name, CLUSTER_NAMELEN);
                dictEntry *de = dictAddOrFind(server.cluster->nodes_black_list, id);
                uint64_t expire = server.unixtime + ntohu64(forgotten_node_ext->ttl);
                dictSetUnsignedIntegerVal(de, expire);
                clusterDelNode(n);
                clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|
                                     CLUSTER_TODO_SAVE_CONFIG);
            }
        } else if (type == CLUSTERMSG_EXT_TYPE_SHARDID) {
            clusterMsgPingExtShardId *shardid_ext = (clusterMsgPingExtShardId *) &(ext->ext[0].shard_id);
            ext_shardid = shardid_ext->shard_id;
        } else {
            /* Unknown type, we will ignore it but log what happened. */
            serverLog(LL_WARNING, "Received unknown extension type %d", type);
        }

        /* We know this will be valid since we validated it ahead of time */
        ext = getNextPingExt(ext);
    }
    /* If the node did not send us a hostname extension, assume
     * they don't have an announced hostname. Otherwise, we'll
     * set it now. */
    updateAnnouncedHostname(sender, ext_hostname);
    updateAnnouncedHumanNodename(sender, ext_humannodename);
    updateShardId(sender, ext_shardid);
}

Comment From: enjoy-binbin

please add and improve your question

Comment From: SunGeolSong

i use redis cluster version 7.0.11 1. master 7.0.11 2. slave 7.2 added 3. mater(7.0.11) log "2764298:M 20 Nov 2023 11:36:34.243 # Received unknown extension type 3" every 1 second 4. maybe 7.0.11 type 3 not defined

Comment From: SunGeolSong

} else if (type == CLUSTERMSG_EXT_TYPE_SHARDID) { clusterMsgPingExtShardId shardid_ext = (clusterMsgPingExtShardId ) &(ext->ext[0].shard_id); ext_shardid = shardid_ext->shard_id; } else { / Unknown type, we will ignore it but log what happened. / serverLog(LL_WARNING, "Received unknown extension type %d", type); }

typedef enum { CLUSTERMSG_EXT_TYPE_HOSTNAME, CLUSTERMSG_EXT_TYPE_HUMAN_NODENAME, CLUSTERMSG_EXT_TYPE_FORGOTTEN_NODE, CLUSTERMSG_EXT_TYPE_SHARDID, // 3 } clusterMsgPi

Comment From: enjoy-binbin

CLUSTERMSG_EXT_TYPE_SHARDID was introduced in Redis7.2, so a Redis 7.0 server can not read it and it will print a warning log (but you can ignore it for now)

Comment From: SunGeolSong

thank you, i upgraded redis cluster 7.0.11 -> 7.2.3

Comment From: enjoy-binbin

@madolson do you think we should limit the freq of the printing? In some scenarios the logs may be overwhelmed by it (e.g. 7.0 / 7.2 mixed cluster)

        } else {
            /* Unknown type, we will ignore it but log what happened. */
            serverLog(LL_WARNING, "Received unknown extension type %d", type);
        }


2032108:M 23 Nov 2023 17:54:58.072 # Received unknown extension type 3
2032108:M 23 Nov 2023 17:54:59.076 # Received unknown extension type 3
2032108:M 23 Nov 2023 17:55:00.080 # Received unknown extension type 3
2032108:M 23 Nov 2023 17:55:01.083 # Received unknown extension type 3
2032108:M 23 Nov 2023 17:55:02.086 # Received unknown extension type 3
2032108:M 23 Nov 2023 17:55:03.090 # Received unknown extension type 3
2032108:M 23 Nov 2023 17:55:04.093 # Received unknown extension type 3
2032108:M 23 Nov 2023 17:55:05.097 # Received unknown extension type 3
2032108:M 23 Nov 2023 17:55:06.102 # Received unknown extension type 3

Comment From: madolson

@madolson do you think we should limit the freq of the printing? In some scenarios the logs may be overwhelmed by it (e.g. 7.0 / 7.2 mixed cluster)

That's probably a good idea. We might want to have some generic functionality for doing time limited logs.

Comment From: enjoy-binbin

maybe we can just warp it with run_with_period(10000)? I see we've used this in places other than serverCron:

    /* Once a second, check if the fragmentation justfies starting a scan
     * or making it more aggressive. */
    run_with_period(1000) {
        computeDefragCycles();
    }