Exemplo n.º 1
0
        private static void StartSessionRunner()
        {
            int logCounter = 0;

            sleepIntervalForHeartbeatCheck = (sleepIntervalForHeartbeatCheck < _DaaS.FrequencyToCheckForNewSessionsAt.TotalSeconds) ? _DaaS.FrequencyToCheckForNewSessionsAt.TotalSeconds : sleepIntervalForHeartbeatCheck;
            _lastInstanceCountCheck        = DateTime.UtcNow;
            while (true)
            {
                Logger.LogDiagnostic("Checking for active sessions...");
                var activeSessions = _DaaS.GetAllActiveSessions().ToList();
                if (activeSessions.Count == 0)
                {
                    Logger.LogDiagnostic("No active sessions");

                    var cancelledInstances = _DaaS.GetCancelledInstances();
                    if (cancelledInstances != null && cancelledInstances.Count > 0)
                    {
                        Logger.LogDiagnostic($"Found {cancelledInstances.Count} cancelled instances with instance names = { string.Join(",", cancelledInstances.Select(x => x.Name)) }");
                        var anyInstanceToCancel = cancelledInstances.FirstOrDefault();
                        if (anyInstanceToCancel != null)
                        {
                            _DaaS.CancelActiveSessionOnThisInstance(anyInstanceToCancel.SessionId);
                        }

                        RemoveOldCancelledFiles(cancelledInstances);
                        KillChildProcessesIfAnyForCancelledInstances(cancelledInstances);
                    }
                }
                else
                {
                    // ensure that we don't end up submitting too many sessions
                    // This can happen if AutoHealing has generated too many files
                    int activeSessionCount = activeSessions.Count;
                    if (activeSessionCount > 5)
                    {
                        foreach (var session in activeSessions.Skip(5))
                        {
                            Logger.LogSessionVerboseEvent($"Deleting Session [{ session.SessionId }] because there are more than { activeSessionCount } sessions active", session.SessionId.ToString());
                            try
                            {
                                var task = Task.Run(async() => { await _DaaS.Delete(session, true); });
                                task.Wait();
                            }
                            catch (Exception ex)
                            {
                                Logger.LogSessionErrorEvent("Failed while deleting Session", ex, session.SessionId.ToString());
                            }
                        }
                    }
                }

                foreach (var session in activeSessions)
                {
                    Logger.LogInfo("  Session " + session.SessionId + " - Status: " + session.Status);
                    Logger.LogInfo("      " + session.FullPermanentStoragePath);
                }
                try
                {
                    _DaaS.RunActiveSessions();
                    if (DateTime.UtcNow.Subtract(_lastHeartbeatSent).TotalSeconds > sleepIntervalForHeartbeatCheck)
                    {
                        _lastHeartbeatSent = DateTime.UtcNow;
                        SendHeartBeat();
                    }
                }
                catch (Exception e)
                {
                    Logger.LogErrorEvent("Encountered unhandled exception while running sessions", e);
                }

                if (DateTime.UtcNow.Subtract(_lastInstanceCountCheck).TotalMinutes > InstanceCountCheckFrequency)
                {
                    _lastInstanceCountCheck = DateTime.UtcNow;
                    try
                    {
                        logCounter++;
                        int instanceCount = HeartBeatController.GetNumberOfLiveInstances();
                        sleepIntervalForHeartbeatCheck = GetSleepIntervalBetweenHeartbeats(instanceCount);

                        // Treat sleepInterval as minutes for InstanceCountCheckFrequency
                        // to avoid making this call every 30 minutes
                        InstanceCountCheckFrequency = Convert.ToInt32(sleepIntervalForHeartbeatCheck);
                        if (logCounter == 5)
                        {
                            logCounter = 0;
                            Logger.LogVerboseEvent($"Live Instance Count = {instanceCount} and sleepInterval between heartbeats = {sleepIntervalForHeartbeatCheck}");
                        }
                    }
                    catch (Exception)
                    {
                    }
                }

                Logger.LogDiagnostic("Finished iteration");
                Thread.Sleep(_DaaS.FrequencyToCheckForNewSessionsAt);
            }
        }