Remove duplicate zero-port sentinels (#9240)

The issue is that when a sentinel with the same address and IP is turned on with a different runid, its port is set to 0 but it is still present in the dictionary master->sentinels which contain all the sentinels for a master.

This causes a problem when we do INFO SENTINEL because it takes the size of the dictionary of sentinels. This might also cause a problem for failover if enough sentinels have their port set to 0 since the number of voters in failover is also determined by the size of the dictionary of sentinels.

This commits removes the sentinels with the port set to zero from the dictionary of sentinels.
Fixes #8786
This commit is contained in:
Wen Hui 2021-07-29 05:32:28 -04:00 committed by GitHub
parent b458b2999b
commit db41536454
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 50 additions and 0 deletions

View File

@ -1212,6 +1212,10 @@ int sentinelUpdateSentinelAddressInAllMasters(sentinelRedisInstance *ri) {
if (match->link->pc != NULL)
instanceLinkCloseConnection(match->link,match->link->pc);
/* Remove any sentinel with port number set to 0 */
if (match->addr->port == 0)
dictDelete(master->sentinels,match->name);
if (match == ri) continue; /* Address already updated for it. */
/* Update the address of the matching Sentinel by copying the address

View File

@ -0,0 +1,33 @@
source "../tests/includes/init-tests.tcl"
test "Start/Stop sentinel on same port with a different runID should not change the total number of sentinels" {
set sentinel_id [expr $::instances_count-1]
# Kill sentinel instance
kill_instance sentinel $sentinel_id
# Delete line with myid in sentinels config file
set orgfilename [file join "sentinel_$sentinel_id" "sentinel.conf"]
set tmpfilename "sentinel.conf_tmp"
set dirname "sentinel_$sentinel_id"
delete_lines_with_pattern $orgfilename $tmpfilename "myid"
# Get count of total sentinels
set a [S 0 SENTINEL master mymaster]
set original_count [lindex $a 33]
# Restart sentinel with the modified config file
set pid [exec_instance "sentinel" $dirname $orgfilename]
lappend ::pids $pid
after 5000
# Get new count of total sentinel
set b [S 0 SENTINEL master mymaster]
set curr_count [lindex $b 33]
# If the count is not the same then fail the test
if {$original_count != $curr_count} {
fail "Sentinel count is incorrect, original count being $original_count and current count is $curr_count"
}
}

View File

@ -865,3 +865,16 @@ proc config_set {param value {options {}}} {
}
}
}
proc delete_lines_with_pattern {filename tmpfilename pattern} {
set fh_in [open $filename r]
set fh_out [open $tmpfilename w]
while {[gets $fh_in line] != -1} {
if {![regexp $pattern $line]} {
puts $fh_out $line
}
}
close $fh_in
close $fh_out
file rename -force $tmpfilename $filename
}