@@ -900,15 +900,30 @@ func (s *Service) HandleHello(ownAddress, remoteAddress string, req *HelloReques
900
900
// ID already found, update peer data
901
901
for i , p := range s .myPeers .AllPeers {
902
902
if p .ID == req .SlaveID {
903
- s .myPeers .AllPeers [i ].Port = req .SlavePort
904
903
if s .cfg .AllPortOffsetsUnique {
905
904
s .myPeers .AllPeers [i ].Address = slaveAddr
906
905
} else {
907
- // Slave address may not change
908
- if p .Address != slaveAddr {
906
+ // Need to check if this particular address does appear in
907
+ // another peer, if so, we forbid to change the address:
908
+ addrFoundInOtherPeer := false
909
+ for _ , pp := range s .myPeers .AllPeers {
910
+ if pp .ID != req .SlaveID && pp .Address == slaveAddr {
911
+ addrFoundInOtherPeer = true
912
+ break
913
+ }
914
+ }
915
+ // Slave address may not change in this case
916
+ if addrFoundInOtherPeer && p .Address != slaveAddr {
909
917
return ClusterConfig {}, maskAny (client .NewBadRequestError ("Cannot change slave address while using an existing ID." ))
910
918
}
919
+ // We accept the new address (it might be the old one):
920
+ s .myPeers .AllPeers [i ].Address = slaveAddr
921
+ // However, since we also accept the port, we must set the
922
+ // port ofset of that replaced peer to 0 such that the AllPeers
923
+ // information actually contains the right port.
924
+ s .myPeers .AllPeers [i ].PortOffset = 0
911
925
}
926
+ s .myPeers .AllPeers [i ].Port = req .SlavePort
912
927
s .myPeers .AllPeers [i ].DataDir = req .DataDir
913
928
}
914
929
}
0 commit comments