in sfintegration/ServiceData.cs [632:766]
private static void Handler(Object sender, EventArgs eargs)
{
EnvoyDefaults.LogMessage("Notification Handler: Start", EnvoyDefaults.IndentOperation.BeginLevel);
try
{
var notification = ((FabricClient.ServiceManagementClient.ServiceNotificationEventArgs)eargs).Notification;
if (notification.Endpoints.Count == 0)
{
//remove
lock (lock_)
{
if (partitions_ != null)
{
partitions_.Remove(notification.PartitionId);
RemovePartitionFromService(notification.PartitionId);
}
else
{
partitionsAdd_.Remove(notification.PartitionId);
partitionsRemove_[notification.PartitionId] = null;
}
EnvoyDefaults.LogMessage("Notification Handler: End", EnvoyDefaults.IndentOperation.EndLevel);
return;
}
}
List<SF_Endpoint> listeners = new List<SF_Endpoint>();
ServiceEndpointRole role = ServiceEndpointRole.Invalid;
EnvoyDefaults.LogMessage(String.Format("{0}: Start Enumerating Replicas", notification.PartitionId),
EnvoyDefaults.IndentOperation.BeginLevel);
EnvoyDefaults.LogMessage(String.Format("{0}: Replica Count = {1}", notification.PartitionId,
notification.Endpoints.Count()));
foreach (var notificationEndpoint in notification.Endpoints)
{
if (notificationEndpoint.Address.Length == 0)
{
EnvoyDefaults.LogMessage("_Node = <Empty>");
continue;
}
EnvoyDefaults.LogMessage(String.Format("_Node = {0}", notificationEndpoint.Address));
JObject addresses;
try
{
addresses = JObject.Parse(notificationEndpoint.Address);
}
catch
{
continue;
}
var notificationListeners = addresses["Endpoints"].Value<JObject>();
foreach (var notificationListener in notificationListeners)
{
int listenerIndex = listeners.FindIndex(x => x.Name == notificationListener.Key);
if (listenerIndex == -1)
{
listeners.Add(new SF_Endpoint(notificationListener.Key));
listenerIndex = listeners.Count - 1;
}
try
{
var listenerAddressString = notificationListener.Value.ToString();
EnvoyDefaults.LogMessage(String.Format("AddressString = {0}", listenerAddressString));
var listenerAddress = new UriBuilder(listenerAddressString).Uri;
if (listenerAddress.HostNameType == UriHostNameType.Dns)
{
var ipaddrs = Dns.GetHostAddresses(listenerAddress.Host);
foreach (var ipaddr in ipaddrs)
{
if (ipaddr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
var saddrstring = ipaddr.ToString();
if (saddrstring.StartsWith("172"))
{
listenerAddress = new Uri(listenerAddress.Scheme + "://" +
saddrstring +
":" + listenerAddress.Port + listenerAddress.PathAndQuery);
break;
}
}
}
}
listeners[listenerIndex].AddInstance(notificationEndpoint.Role, listenerAddress);
}
catch (System.Exception e)
{
EnvoyDefaults.LogMessage(String.Format("Error = {0}", e));
}
}
if (role == ServiceEndpointRole.Invalid)
{
role = notificationEndpoint.Role;
}
}
EnvoyDefaults.LogMessage(String.Format("{0}: End Enumerating Replicas", notification.PartitionId),
EnvoyDefaults.IndentOperation.EndLevel);
// Remove any listeners without active endpoints
listeners.RemoveAll(x => x.InstanceCount() == 0);
if (listeners.Count == 0)
{
EnvoyDefaults.LogMessage("Notification Handler: End", EnvoyDefaults.IndentOperation.EndLevel);
return;
}
var partitionInfo = new SF_Partition(notification.ServiceName,
(role == ServiceEndpointRole.Stateless) ? ServiceKind.Stateless : ServiceKind.Stateful,
notification.PartitionInfo,
notification.Version,
listeners
);
lock (lock_)
{
if (partitions_ != null)
{
partitions_[notification.PartitionId] = partitionInfo;
AddPartitionToService(notification.PartitionId, partitionInfo);
}
else
{
partitionsRemove_.Remove(notification.PartitionId);
partitionsAdd_[notification.PartitionId] = partitionInfo;
}
}
}
catch (Exception e)
{
EnvoyDefaults.LogMessage(String.Format("Error = {0}", e.Message));
EnvoyDefaults.LogMessage(String.Format("Error = {0}", e.StackTrace));
}
EnvoyDefaults.LogMessage("Notification Handler: End", EnvoyDefaults.IndentOperation.EndLevel);
}