public static unsafe int Main(string[] args) { NativeMemory.GetCurrentUnmanagedThreadId = () => (ulong)Pal.rvn_get_current_thread_id(); Lucene.Net.Util.UnmanagedStringArray.Segment.AllocateMemory = NativeMemory.AllocateMemory; Lucene.Net.Util.UnmanagedStringArray.Segment.FreeMemory = NativeMemory.Free; UseOnlyInvariantCultureInRavenDB(); SetCurrentDirectoryToServerPath(); string[] configurationArgs; try { configurationArgs = CommandLineSwitches.Process(args); } catch (CommandParsingException commandParsingException) { Console.WriteLine(commandParsingException.Message); CommandLineSwitches.ShowHelp(); return(1); } if (CommandLineSwitches.ShouldShowHelp) { CommandLineSwitches.ShowHelp(); return(0); } if (CommandLineSwitches.PrintVersionAndExit) { Console.WriteLine(ServerVersion.FullVersion); return(0); } new WelcomeMessage(Console.Out).Print(); var targetSettingsFile = new PathSetting(string.IsNullOrEmpty(CommandLineSwitches.CustomConfigPath) ? "settings.json" : CommandLineSwitches.CustomConfigPath); var destinationSettingsFile = new PathSetting("settings.default.json"); if (File.Exists(targetSettingsFile.FullPath) == false && File.Exists(destinationSettingsFile.FullPath)) //just in case { File.Copy(destinationSettingsFile.FullPath, targetSettingsFile.FullPath); } var configuration = RavenConfiguration.CreateForServer(null, CommandLineSwitches.CustomConfigPath); if (configurationArgs != null) { configuration.AddCommandLine(configurationArgs); } configuration.Initialize(); EncryptionBuffersPool.Instance.Disabled = configuration.Storage.DisableEncryptionBuffersPooling; LoggingSource.UseUtcTime = configuration.Logs.UseUtcTime; LoggingSource.Instance.MaxFileSizeInBytes = configuration.Logs.MaxFileSize.GetValue(SizeUnit.Bytes); LoggingSource.Instance.SetupLogMode( configuration.Logs.Mode, configuration.Logs.Path.FullPath, configuration.Logs.RetentionTime?.AsTimeSpan, configuration.Logs.RetentionSize?.GetValue(SizeUnit.Bytes), configuration.Logs.Compress ); if (Logger.IsInfoEnabled) { Logger.Info($"Logging to {configuration.Logs.Path} set to {configuration.Logs.Mode} level."); } InitializeThreadPoolThreads(configuration); MultiSourceNuGetFetcher.Instance.Initialize(configuration.Indexing.NuGetPackagesPath, configuration.Indexing.NuGetPackageSourceUrl); LatestVersionCheck.Instance.Initialize(configuration.Updates); if (Logger.IsOperationsEnabled) { Logger.Operations(RavenCli.GetInfoText()); } if (WindowsServiceRunner.ShouldRunAsWindowsService()) { try { WindowsServiceRunner.Run(CommandLineSwitches.ServiceName, configuration, configurationArgs); } catch (Exception e) { if (Logger.IsInfoEnabled) { Logger.Info("Error running Windows Service", e); } return(1); } return(0); } RestartServer = () => { RestartServerMre.Set(); ShutdownServerMre.Set(); }; var rerun = false; RavenConfiguration configBeforeRestart = configuration; do { if (rerun) { Console.WriteLine("\nRestarting Server..."); configuration = RavenConfiguration.CreateForServer(null, CommandLineSwitches.CustomConfigPath); if (configurationArgs != null) { var argsAfterRestart = PostSetupCliArgumentsUpdater.Process( configurationArgs, configBeforeRestart, configuration); configuration.AddCommandLine(argsAfterRestart); configBeforeRestart = configuration; } configuration.Initialize(); } try { using (var server = new RavenServer(configuration)) { try { try { server.OpenPipes(); } catch (Exception e) { if (Logger.IsInfoEnabled) { Logger.Info("Unable to OpenPipe. Admin Channel will not be available to the user", e); } Console.WriteLine("Warning: Admin Channel is not available:" + e); } server.BeforeSchemaUpgrade = x => BeforeSchemaUpgrade(x, server.ServerStore); server.Initialize(); if (CommandLineSwitches.PrintServerId) { Console.WriteLine($"Server ID is {server.ServerStore.GetServerId()}."); } new RuntimeSettings(Console.Out).Print(); if (rerun == false && CommandLineSwitches.LaunchBrowser) { BrowserHelper.OpenStudioInBrowser(server.ServerStore.GetNodeHttpServerUrl()); } new ClusterMessage(Console.Out, server.ServerStore).Print(); var prevColor = Console.ForegroundColor; Console.Write("Server available on: "); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"{server.ServerStore.GetNodeHttpServerUrl()}"); Console.ForegroundColor = prevColor; var tcpServerStatus = server.GetTcpServerStatus(); if (tcpServerStatus.Listeners.Count > 0) { prevColor = Console.ForegroundColor; Console.Write("Tcp listening on "); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"{string.Join(", ", tcpServerStatus.Listeners.Select(l => l.LocalEndpoint))}"); Console.ForegroundColor = prevColor; } Console.WriteLine("Server started, listening to requests..."); prevColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine("TIP: type 'help' to list the available commands."); Console.ForegroundColor = prevColor; if (configuration.Storage.IgnoreInvalidJournalErrors == true) { var message = $"Server is running in dangerous mode because {RavenConfiguration.GetKey(x => x.Storage.IgnoreInvalidJournalErrors)} was set. " + "It means that storages of databases, indexes and system one will be loaded regardless missing or corrupted journal files which " + "are mandatory to properly load the storage. " + "This switch is meant to be use only for recovery purposes. Please make sure that you won't use it on regular basis. "; if (Logger.IsOperationsEnabled) { Logger.Operations(message); } prevColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(message); Console.ForegroundColor = prevColor; } IsRunningNonInteractive = false; rerun = CommandLineSwitches.NonInteractive || configuration.Core.SetupMode == SetupMode.Initial ? RunAsNonInteractive() : RunInteractive(server); Console.WriteLine("Starting shut down..."); if (Logger.IsInfoEnabled) { Logger.Info("Server is shutting down"); } } catch (Exception e) { string message = null; if (e.InnerException is AddressInUseException) { message = $"{Environment.NewLine}Port might be already in use.{Environment.NewLine}Try running with an unused port.{Environment.NewLine}" + $"You can change the port using one of the following options:{Environment.NewLine}" + $"1) Change the ServerUrl property in setting.json file.{Environment.NewLine}" + $"2) Run the server from the command line with --ServerUrl option.{Environment.NewLine}" + $"3) Add RAVEN_ServerUrl to the Environment Variables.{Environment.NewLine}" + "For more information go to https://ravendb.net/l/EJS81M/5.1"; } else if (e is SocketException && PlatformDetails.RunningOnPosix) { message = $"{Environment.NewLine}In Linux low-level port (below 1024) will need a special permission, " + $"if this is your case please run{Environment.NewLine}" + $"sudo setcap CAP_NET_BIND_SERVICE=+eip {Path.Combine(AppContext.BaseDirectory, "Raven.Server")}"; } else if (e.InnerException is LicenseExpiredException) { message = e.InnerException.Message; } if (Logger.IsOperationsEnabled) { Logger.Operations("Failed to initialize the server", e); Logger.Operations(message); } Console.WriteLine(message); Console.WriteLine(); Console.WriteLine(e); return(-1); } } Console.WriteLine("Shutdown completed"); } catch (Exception e) { Console.WriteLine("Error during shutdown"); Console.WriteLine(e); return(-2); } finally { if (Logger.IsOperationsEnabled) { Logger.OperationsWithWait("Server has shut down").Wait(TimeSpan.FromSeconds(15)); } ShutdownCompleteMre.Set(); } } while (rerun); return(0); }
public static int Main(string[] args) { SetCurrentDirectoryToServerPath(); string[] configurationArgs; try { configurationArgs = CommandLineSwitches.Process(args); } catch (CommandParsingException commandParsingException) { Console.WriteLine(commandParsingException.Message); CommandLineSwitches.ShowHelp(); return(1); } if (CommandLineSwitches.ShouldShowHelp) { CommandLineSwitches.ShowHelp(); return(0); } if (CommandLineSwitches.PrintVersionAndExit) { Console.WriteLine(ServerVersion.FullVersion); return(0); } new WelcomeMessage(Console.Out).Print(); var targetSettingsFile = new PathSetting(string.IsNullOrEmpty(CommandLineSwitches.CustomConfigPath) ? "settings.json" : CommandLineSwitches.CustomConfigPath); var destinationSettingsFile = new PathSetting("settings.default.json"); if (File.Exists(targetSettingsFile.FullPath) == false && File.Exists(destinationSettingsFile.FullPath)) //just in case { File.Copy(destinationSettingsFile.FullPath, targetSettingsFile.FullPath); } var configuration = new RavenConfiguration(null, ResourceType.Server, CommandLineSwitches.CustomConfigPath); if (configurationArgs != null) { configuration.AddCommandLine(configurationArgs); } configuration.Initialize(); LoggingSource.Instance.SetupLogMode(configuration.Logs.Mode, configuration.Logs.Path.FullPath); if (Logger.IsInfoEnabled) { Logger.Info($"Logging to {configuration.Logs.Path} set to {configuration.Logs.Mode} level."); } if (Logger.IsOperationsEnabled) { Logger.Operations(RavenCli.GetInfoText()); } if (WindowsServiceRunner.ShouldRunAsWindowsService()) { try { WindowsServiceRunner.Run(CommandLineSwitches.ServiceName, configuration, configurationArgs); } catch (Exception e) { if (Logger.IsInfoEnabled) { Logger.Info("Error running Windows Service", e); } return(1); } return(0); } RestartServer = () => { ResetServerMre.Set(); ShutdownServerMre.Set(); }; var rerun = false; RavenConfiguration configBeforeRestart = configuration; do { if (rerun) { Console.WriteLine("\nRestarting Server..."); rerun = false; configuration = new RavenConfiguration(null, ResourceType.Server, CommandLineSwitches.CustomConfigPath); if (configurationArgs != null) { var argsAfterRestart = PostSetupCliArgumentsUpdater.Process( configurationArgs, configBeforeRestart, configuration); configuration.AddCommandLine(argsAfterRestart); configBeforeRestart = configuration; } configuration.Initialize(); } try { using (var server = new RavenServer(configuration)) { try { try { server.OpenPipes(); } catch (Exception e) { if (Logger.IsInfoEnabled) { Logger.Info("Unable to OpenPipe. Admin Channel will not be available to the user", e); } Console.WriteLine("Warning: Admin Channel is not available:" + e); } server.Initialize(); if (CommandLineSwitches.PrintServerId) { Console.WriteLine($"Server ID is {server.ServerStore.GetServerId()}."); } new RuntimeSettings(Console.Out).Print(); if (CommandLineSwitches.LaunchBrowser) { BrowserHelper.OpenStudioInBrowser(server.ServerStore.GetNodeHttpServerUrl()); } new ClusterMessage(Console.Out, server.ServerStore).Print(); var prevColor = Console.ForegroundColor; Console.Write("Server available on: "); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"{server.ServerStore.GetNodeHttpServerUrl()}"); Console.ForegroundColor = prevColor; var tcpServerStatus = server.GetTcpServerStatus(); prevColor = Console.ForegroundColor; Console.Write("Tcp listening on "); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"{string.Join(", ", tcpServerStatus.Listeners.Select(l => l.LocalEndpoint))}"); Console.ForegroundColor = prevColor; Console.WriteLine("Server started, listening to requests..."); prevColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine("TIP: type 'help' to list the available commands."); Console.ForegroundColor = prevColor; IsRunningNonInteractive = false; rerun = CommandLineSwitches.NonInteractive || configuration.Core.SetupMode == SetupMode.Initial ? RunAsNonInteractive() : RunInteractive(server); Console.WriteLine("Starting shut down..."); if (Logger.IsInfoEnabled) { Logger.Info("Server is shutting down"); } } catch (Exception e) { if (Logger.IsOperationsEnabled) { Logger.Operations("Failed to initialize the server", e); } Console.WriteLine(e); return(-1); } } Console.WriteLine("Shutdown completed"); } catch (Exception e) { Console.WriteLine("Error during shutdown"); Console.WriteLine(e); return(-2); } finally { if (Logger.IsOperationsEnabled) { Logger.OperationsAsync("Server has shut down").Wait(TimeSpan.FromSeconds(15)); } } } while (rerun); return(0); }
public static int Main(string[] args) { UseOnlyInvariantCultureInRavenDB(); SetCurrentDirectoryToServerPath(); string[] configurationArgs; try { configurationArgs = CommandLineSwitches.Process(args); } catch (CommandParsingException commandParsingException) { Console.WriteLine(commandParsingException.Message); CommandLineSwitches.ShowHelp(); return(1); } if (CommandLineSwitches.ShouldShowHelp) { CommandLineSwitches.ShowHelp(); return(0); } if (CommandLineSwitches.PrintVersionAndExit) { Console.WriteLine(ServerVersion.FullVersion); return(0); } new WelcomeMessage(Console.Out).Print(); var targetSettingsFile = new PathSetting(string.IsNullOrEmpty(CommandLineSwitches.CustomConfigPath) ? "settings.json" : CommandLineSwitches.CustomConfigPath); var destinationSettingsFile = new PathSetting("settings.default.json"); if (File.Exists(targetSettingsFile.FullPath) == false && File.Exists(destinationSettingsFile.FullPath)) //just in case { File.Copy(destinationSettingsFile.FullPath, targetSettingsFile.FullPath); } var configuration = RavenConfiguration.CreateForServer(null, CommandLineSwitches.CustomConfigPath); if (configurationArgs != null) { configuration.AddCommandLine(configurationArgs); } configuration.Initialize(); LoggingSource.Instance.SetupLogMode(configuration.Logs.Mode, configuration.Logs.Path.FullPath); LoggingSource.UseUtcTime = configuration.Logs.UseUtcTime; if (Logger.IsInfoEnabled) { Logger.Info($"Logging to {configuration.Logs.Path} set to {configuration.Logs.Mode} level."); } if (Logger.IsOperationsEnabled) { Logger.Operations(RavenCli.GetInfoText()); } if (WindowsServiceRunner.ShouldRunAsWindowsService()) { try { WindowsServiceRunner.Run(CommandLineSwitches.ServiceName, configuration, configurationArgs); } catch (Exception e) { if (Logger.IsInfoEnabled) { Logger.Info("Error running Windows Service", e); } return(1); } return(0); } RestartServer = () => { ResetServerMre.Set(); ShutdownServerMre.Set(); }; var rerun = false; RavenConfiguration configBeforeRestart = configuration; do { if (rerun) { Console.WriteLine("\nRestarting Server..."); rerun = false; configuration = RavenConfiguration.CreateForServer(null, CommandLineSwitches.CustomConfigPath); if (configurationArgs != null) { var argsAfterRestart = PostSetupCliArgumentsUpdater.Process( configurationArgs, configBeforeRestart, configuration); configuration.AddCommandLine(argsAfterRestart); configBeforeRestart = configuration; } configuration.Initialize(); } try { using (var server = new RavenServer(configuration)) { try { try { server.OpenPipes(); } catch (Exception e) { if (Logger.IsInfoEnabled) { Logger.Info("Unable to OpenPipe. Admin Channel will not be available to the user", e); } Console.WriteLine("Warning: Admin Channel is not available:" + e); } server.Initialize(); if (CommandLineSwitches.PrintServerId) { Console.WriteLine($"Server ID is {server.ServerStore.GetServerId()}."); } new RuntimeSettings(Console.Out).Print(); if (CommandLineSwitches.LaunchBrowser) { BrowserHelper.OpenStudioInBrowser(server.ServerStore.GetNodeHttpServerUrl()); } new ClusterMessage(Console.Out, server.ServerStore).Print(); var prevColor = Console.ForegroundColor; Console.Write("Server available on: "); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"{server.ServerStore.GetNodeHttpServerUrl()}"); Console.ForegroundColor = prevColor; var tcpServerStatus = server.GetTcpServerStatus(); prevColor = Console.ForegroundColor; Console.Write("Tcp listening on "); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"{string.Join(", ", tcpServerStatus.Listeners.Select(l => l.LocalEndpoint))}"); Console.ForegroundColor = prevColor; Console.WriteLine("Server started, listening to requests..."); prevColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine("TIP: type 'help' to list the available commands."); Console.ForegroundColor = prevColor; IsRunningNonInteractive = false; rerun = CommandLineSwitches.NonInteractive || configuration.Core.SetupMode == SetupMode.Initial ? RunAsNonInteractive() : RunInteractive(server); Console.WriteLine("Starting shut down..."); if (Logger.IsInfoEnabled) { Logger.Info("Server is shutting down"); } } catch (Exception e) { string message = null; if (e.InnerException is AddressInUseException) { message = $"{Environment.NewLine}Port might be already in use.{Environment.NewLine}Try running with an unused port.{Environment.NewLine}" + $"You can change the port using one of the following options:{Environment.NewLine}" + $"1) Change the ServerUrl property in setting.json file.{Environment.NewLine}" + $"2) Run the server from the command line with --ServerUrl option.{Environment.NewLine}" + $"3) Add RAVEN_ServerUrl to the Environment Variables.{Environment.NewLine}" + "For more information go to https://ravendb.net/l/EJS81M/4.1"; } else if (e is SocketException && PlatformDetails.RunningOnPosix) { var ravenPath = typeof(RavenServer).Assembly.Location; if (ravenPath.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) { ravenPath = ravenPath.Substring(ravenPath.Length - 4); } message = $"{Environment.NewLine}In Linux low-level port (below 1024) will need a special permission, " + $"if this is your case please run{Environment.NewLine}" + $"sudo setcap CAP_NET_BIND_SERVICE=+eip {ravenPath}"; } if (Logger.IsOperationsEnabled) { Logger.Operations("Failed to initialize the server", e); Logger.Operations(message); } Console.WriteLine(message); Console.WriteLine(); Console.WriteLine(e); return(-1); } } Console.WriteLine("Shutdown completed"); } catch (Exception e) { Console.WriteLine("Error during shutdown"); Console.WriteLine(e); return(-2); } finally { if (Logger.IsOperationsEnabled) { Logger.OperationsAsync("Server has shut down").Wait(TimeSpan.FromSeconds(15)); } } } while (rerun); return(0); }
public static int Main(string[] args) { string[] configurationArgs; try { configurationArgs = CommandLineSwitches.Process(args); } catch (CommandParsingException commandParsingException) { Console.WriteLine(commandParsingException.Message); CommandLineSwitches.ShowHelp(); return(1); } if (CommandLineSwitches.ShouldShowHelp) { CommandLineSwitches.ShowHelp(); return(0); } if (CommandLineSwitches.PrintVersionAndExit) { Console.WriteLine(ServerVersion.FullVersion); return(0); } new WelcomeMessage(Console.Out).Print(); var configuration = new RavenConfiguration(null, ResourceType.Server, CommandLineSwitches.CustomConfigPath); if (configurationArgs != null) { configuration.AddCommandLine(configurationArgs); } configuration.Initialize(); LoggingSource.Instance.SetupLogMode(configuration.Logs.Mode, Path.Combine(AppContext.BaseDirectory, configuration.Logs.Path)); if (Logger.IsInfoEnabled) { Logger.Info($"Logging to { configuration.Logs.Path } set to {configuration.Logs.Mode} level."); } if (WindowsServiceRunner.ShouldRunAsWindowsService()) { try { WindowsServiceRunner.Run(CommandLineSwitches.ServiceName, configuration); } catch (Exception e) { if (Logger.IsInfoEnabled) { Logger.Info("Error running Windows Service", e); } return(1); } return(0); } var rerun = false; do { if (rerun) { Console.WriteLine("\nRestarting Server..."); rerun = false; } try { using (var server = new RavenServer(configuration)) { try { try { server.OpenPipes(); } catch (Exception e) { if (Logger.IsInfoEnabled) { Logger.Info("Unable to OpenPipe. Admin Channel will not be available to the user", e); } Console.WriteLine("Warning: Admin Channel is not available"); } server.Initialize(); if (CommandLineSwitches.PrintServerId) { Console.WriteLine($"Server ID is {server.ServerStore.GetServerId()}."); } new RuntimeSettings(Console.Out).Print(); if (CommandLineSwitches.LaunchBrowser) { BrowserHelper.OpenStudioInBrowser(server.ServerStore.NodeHttpServerUrl); } new ClusterMessage(Console.Out, server.ServerStore).Print(); var prevColor = Console.ForegroundColor; Console.Write("Server available on: "); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"{server.ServerStore.NodeHttpServerUrl}"); Console.ForegroundColor = prevColor; var tcpServerStatus = server.GetTcpServerStatus(); prevColor = Console.ForegroundColor; Console.Write("Tcp listening on "); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"{string.Join(", ", tcpServerStatus.Listeners.Select(l => l.LocalEndpoint))}"); Console.ForegroundColor = prevColor; Console.WriteLine("Server started, listening to requests..."); IsRunningAsService = false; rerun = CommandLineSwitches.Daemon ? RunAsService() : RunInteractive(server); Console.WriteLine("Starting shut down..."); if (Logger.IsInfoEnabled) { Logger.Info("Server is shutting down"); } } catch (Exception e) { if (Logger.IsOperationsEnabled) { Logger.Operations("Failed to initialize the server", e); } Console.WriteLine(e); return(-1); } } Console.WriteLine("Shutdown completed"); } catch (Exception e) { if (e.ToString().Contains(@"'WriteReqPool'") && e.ToString().Contains("System.ObjectDisposedException")) // TODO : Remove this check in dotnet 2.0 - https://github.com/aspnet/KestrelHttpServer/issues/1231 { Console.WriteLine("Ignoring Kestrel's Exception : 'Cannot access a disposed object. Object name: 'WriteReqPool'"); Console.Out.Flush(); } else { Console.WriteLine("Error during shutdown"); Console.WriteLine(e); return(-2); } } } while (rerun); return(0); }