private void ProcessBrokerChange(string path, IEnumerable<string> childs)
{
if (path != ZooKeeperClient.DefaultBrokerIdsPath)
{
return;
}
List<int> updatedBrokers = childs.Select(x => int.Parse(x, CultureInfo.InvariantCulture)).ToList();
List<int> oldBrokers = this.oldBrokerIdMap.Select(x => x.Key).ToList();
List<int> newBrokers = updatedBrokers.Except(oldBrokers).ToList();
Logger.Debug("List of newly registered brokers -> " + newBrokers.ToMultiString(","));
foreach (int bid in newBrokers)
{
string brokerInfo = this.zkclient.ReadData<string>(ZooKeeperClient.DefaultBrokerIdsPath + "/" + bid);
string[] brokerHost = brokerInfo.Split(':');
var port = int.Parse(brokerHost[2], CultureInfo.InvariantCulture);
this.actualBrokerIdMap.Add(bid, new Broker(bid, brokerHost[1], brokerHost[1], port));
if (this.callback != null)
{
Logger.Debug("Invoking the callback for broker: " + bid);
this.callback(bid, brokerHost[1], port);
}
}
List<int> deadBrokers = oldBrokers.Except(updatedBrokers).ToList();
Logger.Debug("Deleting broker ids for dead brokers -> " + deadBrokers.ToMultiString(","));
foreach (int bid in deadBrokers)
{
Logger.Debug("Deleting dead broker: " + bid);
this.actualBrokerIdMap.Remove(bid);
foreach (var topicMap in this.actualBrokerTopicsPartitionsMap)
{
int affected = topicMap.Value.RemoveWhere(x => x.BrokerId == bid);
if (affected > 0)
{
Logger.Debug("Removing dead broker " + bid + " for topic: " + topicMap.Key);
Logger.Debug("Actual list of mapped brokers is -> " + topicMap.Value.ToMultiString(x => x.ToString(), ","));
}
}
}
}