mirror of https://github.com/lidarr/Lidarr
Fixed: Slower daemon startup loop if Lidarr runs into non-recoverable errors
This commit is contained in:
parent
38a6dbbc42
commit
99ab61fac6
|
@ -3,6 +3,7 @@ using System.Security.AccessControl;
|
|||
using System.Security.Principal;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.Exceptions;
|
||||
using NzbDrone.Common.Instrumentation;
|
||||
|
||||
namespace NzbDrone.Common.EnvironmentInfo
|
||||
|
@ -36,6 +37,11 @@ namespace NzbDrone.Common.EnvironmentInfo
|
|||
{
|
||||
SetPermissions();
|
||||
}
|
||||
|
||||
if (!_diskProvider.FolderWritable(_appFolderInfo.AppDataFolder))
|
||||
{
|
||||
throw new LidarrStartupException("AppFolder {0} is not writable", _appFolderInfo.AppDataFolder);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetPermissions()
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace NzbDrone.Common.Exceptions
|
||||
{
|
||||
public class LidarrStartupException : NzbDroneException
|
||||
{
|
||||
public LidarrStartupException(string message, params object[] args)
|
||||
: base("Lidarr failed to start: " + string.Format(message, args))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public LidarrStartupException(string message)
|
||||
: base("Lidarr failed to start: " + message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public LidarrStartupException()
|
||||
: base("Lidarr failed to start")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public LidarrStartupException(Exception innerException, string message, params object[] args)
|
||||
: base("Lidarr failed to start: " + string.Format(message, args), innerException)
|
||||
{
|
||||
}
|
||||
|
||||
public LidarrStartupException(Exception innerException, string message)
|
||||
: base("Lidarr failed to start: " + message, innerException)
|
||||
{
|
||||
}
|
||||
|
||||
public LidarrStartupException(Exception innerException)
|
||||
: base("Lidarr failed to start: " + innerException.Message)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -96,6 +96,7 @@
|
|||
<Compile Include="EnvironmentInfo\IPlatformInfo.cs" />
|
||||
<Compile Include="EnvironmentInfo\OsVersionModel.cs" />
|
||||
<Compile Include="EnvironmentInfo\RuntimeMode.cs" />
|
||||
<Compile Include="Exceptions\LidarrStartupException.cs" />
|
||||
<Compile Include="Extensions\DictionaryExtensions.cs" />
|
||||
<Compile Include="Disk\OsPath.cs" />
|
||||
<Compile Include="Disk\DiskProviderBase.cs" />
|
||||
|
|
|
@ -2,6 +2,7 @@ using System;
|
|||
using System.IO;
|
||||
using NLog;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Exceptions;
|
||||
|
||||
namespace NzbDrone.Common.Processes
|
||||
{
|
||||
|
@ -38,7 +39,7 @@ namespace NzbDrone.Common.Processes
|
|||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, "Unable to write PID file {0}", filename);
|
||||
throw;
|
||||
throw new LidarrStartupException(ex, "Unable to write PID file {0}", filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.Net.Sockets;
|
||||
using NLog;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Exceptions;
|
||||
using NzbDrone.Common.Instrumentation;
|
||||
using NzbDrone.Host;
|
||||
|
||||
|
@ -11,6 +12,14 @@ namespace NzbDrone.Console
|
|||
{
|
||||
private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(ConsoleApp));
|
||||
|
||||
private enum ExitCodes : int
|
||||
{
|
||||
Normal = 0,
|
||||
UnknownFailure = 1,
|
||||
RecoverableFailure = 2,
|
||||
NonRecoverableFailure = 3
|
||||
}
|
||||
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
try
|
||||
|
@ -19,30 +28,61 @@ namespace NzbDrone.Console
|
|||
NzbDroneLogger.Register(startupArgs, false, true);
|
||||
Bootstrap.Start(startupArgs, new ConsoleAlerts());
|
||||
}
|
||||
catch (SocketException exception)
|
||||
catch (LidarrStartupException ex)
|
||||
{
|
||||
System.Console.WriteLine("");
|
||||
System.Console.WriteLine("");
|
||||
Logger.Fatal(exception.Message + ". This can happen if another instance of Lidarr is already running another application is using the same port (default: 8686) or the user has insufficient permissions");
|
||||
System.Console.WriteLine("Press enter to exit...");
|
||||
System.Console.ReadLine();
|
||||
Environment.Exit(1);
|
||||
Logger.Fatal(ex, "EPIC FAIL!");
|
||||
Exit(ExitCodes.NonRecoverableFailure);
|
||||
}
|
||||
catch (Exception e)
|
||||
catch (SocketException ex)
|
||||
{
|
||||
System.Console.WriteLine("");
|
||||
System.Console.WriteLine("");
|
||||
Logger.Fatal(e, "EPIC FAIL!");
|
||||
System.Console.WriteLine("Press enter to exit...");
|
||||
System.Console.ReadLine();
|
||||
Environment.Exit(1);
|
||||
Logger.Fatal(ex.Message + ". This can happen if another instance of Sonarr is already running another application is using the same port (default: 8989) or the user has insufficient permissions");
|
||||
Exit(ExitCodes.RecoverableFailure);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Console.WriteLine("");
|
||||
System.Console.WriteLine("");
|
||||
Logger.Fatal(ex, "EPIC FAIL!");
|
||||
Exit(ExitCodes.UnknownFailure);
|
||||
}
|
||||
|
||||
Logger.Info("Exiting main.");
|
||||
|
||||
//Need this to terminate on mono (thanks nlog)
|
||||
LogManager.Configuration = null;
|
||||
Environment.Exit(0);
|
||||
Exit(ExitCodes.Normal);
|
||||
}
|
||||
|
||||
private static void Exit(ExitCodes exitCode)
|
||||
{
|
||||
LogManager.Flush();
|
||||
|
||||
if (exitCode != ExitCodes.Normal)
|
||||
{
|
||||
System.Console.WriteLine("Press enter to exit...");
|
||||
|
||||
System.Threading.Thread.Sleep(1000);
|
||||
|
||||
if (exitCode == ExitCodes.NonRecoverableFailure)
|
||||
{
|
||||
System.Console.WriteLine("Non-recoverable failure, waiting for user intervention...");
|
||||
for (int i = 0; i< 3600; i++)
|
||||
{
|
||||
System.Threading.Thread.Sleep(1000);
|
||||
|
||||
if (System.Console.KeyAvailable) break;
|
||||
}
|
||||
}
|
||||
|
||||
// Please note that ReadLine silently succeeds if there is no console, KeyAvailable does not.
|
||||
System.Console.ReadLine();
|
||||
}
|
||||
|
||||
//Need this to terminate on mono (thanks nlog)
|
||||
LogManager.Configuration = null;
|
||||
Environment.Exit((int)exitCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,9 +4,11 @@ using System.Threading;
|
|||
using NLog;
|
||||
using NzbDrone.Common.Composition;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Exceptions;
|
||||
using NzbDrone.Common.Instrumentation;
|
||||
using NzbDrone.Common.Processes;
|
||||
using NzbDrone.Common.Security;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Instrumentation;
|
||||
|
||||
|
@ -49,9 +51,13 @@ namespace NzbDrone.Host
|
|||
SpinToExit(appMode);
|
||||
}
|
||||
}
|
||||
catch (TerminateApplicationException e)
|
||||
catch (InvalidConfigFileException ex)
|
||||
{
|
||||
Logger.Info(e.Message);
|
||||
throw new LidarrStartupException(ex);
|
||||
}
|
||||
catch (TerminateApplicationException ex)
|
||||
{
|
||||
Logger.Info(ex.Message);
|
||||
LogManager.Configuration = null;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue