|
|
|
@ -1,7 +1,5 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using System.Runtime.Remoting;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using NLog;
|
|
|
|
|
using NzbDrone.Common;
|
|
|
|
@ -12,40 +10,23 @@ namespace NzbDrone.Providers
|
|
|
|
|
{
|
|
|
|
|
private static readonly Logger logger = LogManager.GetLogger("Host.MonitoringProvider");
|
|
|
|
|
|
|
|
|
|
private readonly IHostController _hostController;
|
|
|
|
|
private readonly ProcessProvider _processProvider;
|
|
|
|
|
private readonly HttpProvider _httpProvider;
|
|
|
|
|
private readonly ConfigFileProvider _configFileProvider;
|
|
|
|
|
|
|
|
|
|
private int _pingFailCounter;
|
|
|
|
|
private Timer _pingTimer;
|
|
|
|
|
private Timer _processPriorityCheckTimer;
|
|
|
|
|
|
|
|
|
|
public MonitoringProvider(ProcessProvider processProvider, IHostController hostController,
|
|
|
|
|
HttpProvider httpProvider, ConfigFileProvider configFileProvider)
|
|
|
|
|
public MonitoringProvider(ProcessProvider processProvider)
|
|
|
|
|
{
|
|
|
|
|
_processProvider = processProvider;
|
|
|
|
|
_hostController = hostController;
|
|
|
|
|
_httpProvider = httpProvider;
|
|
|
|
|
_configFileProvider = configFileProvider;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public MonitoringProvider()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Start()
|
|
|
|
|
{
|
|
|
|
|
AppDomain.CurrentDomain.UnhandledException += ((s, e) => AppDomainException(e.ExceptionObject as Exception));
|
|
|
|
|
|
|
|
|
|
AppDomain.CurrentDomain.ProcessExit += ProgramExited;
|
|
|
|
|
AppDomain.CurrentDomain.DomainUnload += ProgramExited;
|
|
|
|
|
|
|
|
|
|
_processPriorityCheckTimer = new Timer(EnsurePriority);
|
|
|
|
|
_processPriorityCheckTimer.Change(TimeSpan.FromSeconds(15), TimeSpan.FromMinutes(30));
|
|
|
|
|
|
|
|
|
|
_pingTimer = new Timer(PingServer);
|
|
|
|
|
_pingTimer.Change(TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public virtual void EnsurePriority(object sender)
|
|
|
|
@ -71,50 +52,9 @@ namespace NzbDrone.Providers
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public virtual void PingServer(object sender)
|
|
|
|
|
{
|
|
|
|
|
if (!_hostController.ServerStarted) return;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
ICredentials identity = CredentialCache.DefaultCredentials;
|
|
|
|
|
_httpProvider.DownloadString(_hostController.AppUrl, identity); //This should preload the home page, making the first load faster.
|
|
|
|
|
string response = _httpProvider.DownloadString(_hostController.AppUrl + "/health", identity);
|
|
|
|
|
|
|
|
|
|
if (!response.Contains("OK"))
|
|
|
|
|
{
|
|
|
|
|
throw new ServerException("Health services responded with an invalid response.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_pingFailCounter > 0)
|
|
|
|
|
{
|
|
|
|
|
logger.Info("Application pool has been successfully recovered.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_pingFailCounter = 0;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_pingFailCounter++;
|
|
|
|
|
logger.Error("Application pool is not responding. Count: {0} - {1}", _pingFailCounter, ex.Message);
|
|
|
|
|
if (_pingFailCounter >= 10)
|
|
|
|
|
{
|
|
|
|
|
_pingFailCounter = 0;
|
|
|
|
|
_hostController.RestartServer();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ProgramExited(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
_hostController.StopServer();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void AppDomainException(Exception excepion)
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("EPIC FAIL: {0}", excepion);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logger.FatalException("EPIC FAIL: " + excepion.Message, excepion);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|