private static void Handler()

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);
        }