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