Opc.Ua.Server.DiagnosticsNodeManager.DoScan C# (CSharp) Method

DoScan() private method

Reports notifications for any monitored diagnostic nodes.
private DoScan ( object alwaysUpdateArrays ) : void
alwaysUpdateArrays object
return void
        private void DoScan(object alwaysUpdateArrays)
        {
            try
            {
                lock (Lock)
                {
                    if (!m_diagnosticsEnabled)
                    {
                        return;
                    }

                    m_lastDiagnosticsScanTime = DateTime.UtcNow;
                
                    // update server diagnostics.
                    UpdateServerDiagnosticsSummary();
                   
                    // update session diagnostics.
                    bool sessionsChanged = alwaysUpdateArrays != null;
                    SessionDiagnosticsDataType[] sessionArray = new SessionDiagnosticsDataType[m_sessions.Count];

                    for (int ii = 0; ii < m_sessions.Count; ii++)
                    {
                        SessionDiagnosticsData diagnostics = m_sessions[ii];

                        if (UpdateSessionDiagnostics(diagnostics, sessionArray, ii))
                        {
                            sessionsChanged = true;
                        }
                    }

                    // check of the session diagnostics array node needs to be updated.
                    SessionDiagnosticsArrayState sessionsNode = (SessionDiagnosticsArrayState)FindPredefinedNode(
                        VariableIds.Server_ServerDiagnostics_SessionsDiagnosticsSummary_SessionDiagnosticsArray,
                        typeof(SessionDiagnosticsArrayState));
                                                
                    if (sessionsNode != null && (sessionsNode.Value == null || StatusCode.IsBad(sessionsNode.StatusCode) || sessionsChanged))
                    {
                        sessionsNode.Value = sessionArray;
                        sessionsNode.ClearChangeMasks(SystemContext, false);
                    }
                      
                    bool sessionsSecurityChanged = alwaysUpdateArrays != null;
                    SessionSecurityDiagnosticsDataType[] sessionSecurityArray = new SessionSecurityDiagnosticsDataType[m_sessions.Count];

                    for (int ii = 0; ii < m_sessions.Count; ii++)
                    {                        
                        SessionDiagnosticsData diagnostics = m_sessions[ii];

                        if (UpdateSessionSecurityDiagnostics(diagnostics, sessionSecurityArray, ii))
                        {
                            sessionsChanged = true;
                        }
                    }

                    // check of the array node needs to be updated.
                    SessionSecurityDiagnosticsArrayState sessionsSecurityNode = (SessionSecurityDiagnosticsArrayState)FindPredefinedNode(
                        VariableIds.Server_ServerDiagnostics_SessionsDiagnosticsSummary_SessionSecurityDiagnosticsArray,
                        typeof(SessionSecurityDiagnosticsArrayState));
                                                
                    if (sessionsSecurityNode != null && (sessionsSecurityNode.Value == null || StatusCode.IsBad(sessionsSecurityNode.StatusCode) || sessionsSecurityChanged))
                    {
                        sessionsSecurityNode.Value = sessionSecurityArray;
                        sessionsSecurityNode.ClearChangeMasks(SystemContext, false);
                    }

                    bool subscriptionsChanged = alwaysUpdateArrays != null;
                    SubscriptionDiagnosticsDataType[] subscriptionArray = new SubscriptionDiagnosticsDataType[m_subscriptions.Count];

                    for (int ii = 0; ii < m_subscriptions.Count; ii++)
                    {
                        SubscriptionDiagnosticsData diagnostics = m_subscriptions[ii];
                        
                        if (UpdateSubscriptionDiagnostics(diagnostics, subscriptionArray, ii))
                        {
                            sessionsChanged = true;
                        }
                    }

                    // check of the subscription node needs to be updated.
                    SubscriptionDiagnosticsArrayState subscriptionsNode = (SubscriptionDiagnosticsArrayState)FindPredefinedNode(
                        VariableIds.Server_ServerDiagnostics_SubscriptionDiagnosticsArray,
                        typeof(SubscriptionDiagnosticsArrayState));
                                                   
                    if (subscriptionsNode != null && (subscriptionsNode.Value == null || StatusCode.IsBad(subscriptionsNode.StatusCode) || subscriptionsChanged)) 
                    {
                        subscriptionsNode.Value = subscriptionArray;
                        subscriptionsNode.ClearChangeMasks(SystemContext, false);
                    }

                    for (int ii = 0; ii < m_sessions.Count; ii++)
                    {
                        SessionDiagnosticsData diagnostics = m_sessions[ii];
                        List<SubscriptionDiagnosticsDataType> subscriptionDiagnosticsArray = new List<SubscriptionDiagnosticsDataType>();

                        NodeId sessionId = diagnostics.Summary.NodeId;

                        for (int jj = 0; jj < m_subscriptions.Count; jj++)
                        {
                            SubscriptionDiagnosticsData subscriptionDiagnostics = m_subscriptions[jj];

                            if (subscriptionDiagnostics.Value.Value == null)
                            {
                                continue;
                            }

                            if (subscriptionDiagnostics.Value.Value.SessionId != sessionId)
                            {
                                continue;
                            }

                            subscriptionDiagnosticsArray.Add(subscriptionDiagnostics.Value.Value);
                        }

                        // update session subscription array.
                        subscriptionsNode = (SubscriptionDiagnosticsArrayState)diagnostics.Summary.CreateChild(
                            SystemContext,
                            BrowseNames.SubscriptionDiagnosticsArray);
                                    
                        if (subscriptionsNode != null && (subscriptionsNode.Value == null || StatusCode.IsBad(subscriptionsNode.StatusCode) || subscriptionsChanged))
                        {
                            subscriptionsNode.Value = subscriptionDiagnosticsArray.ToArray();
                            subscriptionsNode.ClearChangeMasks(SystemContext, false);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Utils.Trace(e, "Unexpected error during diagnostics scan.");
            }
        }