public static void WriteThreadsInfoAndWaitForEsc(RavenServer server, int maxTopThreads, int updateIntervalInMs, double cpuUsageThreshold) { Console.WriteLine("Showing threads info, press any key to close..."); var i = 0L; var threadsUsage = new ThreadsUsage(); Thread.Sleep(100); var cursorLeft = Console.CursorLeft; var cursorTop = Console.CursorTop; var waitIntervals = updateIntervalInMs / 100; var maxNameLength = 0; while (Console.KeyAvailable == false) { Console.SetCursorPosition(cursorLeft, cursorTop); var threadsInfo = threadsUsage.Calculate(); Console.Write($"{(i++ % 2 == 0 ? "*" : "+")} "); Console.WriteLine($"CPU usage: {threadsInfo.CpuUsage:0.00}% (total threads: {threadsInfo.List.Count:#,#0}, active cores: {threadsInfo.ActiveCores}) "); var printedLines = 1; var count = 0; var isFirst = true; foreach (var threadInfo in threadsInfo.List .Where(x => x.CpuUsage >= cpuUsageThreshold)) { if (isFirst) { printedLines++; Console.WriteLine(" thread id | cpu usage | priority | thread name "); isFirst = false; } if (++count > maxTopThreads) { break; } var nameLength = threadInfo.Name.Length; maxNameLength = Math.Max(maxNameLength, nameLength); var numberOfEmptySpaces = maxNameLength - nameLength + 1; var emptySpaces = numberOfEmptySpaces > 0 ? new string(' ', numberOfEmptySpaces) : string.Empty; Console.Write($" {threadInfo.Id,-7} "); Console.Write($" | {$"{threadInfo.CpuUsage:0.00}%",-8}"); Console.Write($" | {threadInfo.Priority,-12} "); Console.Write($" | {threadInfo.Name}{emptySpaces}"); Console.WriteLine(); printedLines++; } for (var j = 0; j < waitIntervals && Console.KeyAvailable == false; j++) { Thread.Sleep(100); } if (PlatformDetails.RunningOnPosix) { var newTop = Console.BufferHeight - cursorTop - printedLines - 1; if (newTop < 0) { cursorTop = Math.Max(0, cursorTop + newTop); } } } Console.ReadKey(true); Console.WriteLine(); Console.WriteLine("Threads info halted."); }
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, configuration.Logs.Path.FullPath); 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..."); 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 ? 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) { 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); }
public static int Main(string[] args) { NativeMemory.GetCurrentUnmanagedThreadId = () => (ulong)Pal.rvn_get_current_thread_id(); 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.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."); } 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.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/4.2"; } else if (e is SocketException && PlatformDetails.RunningOnPosix) { const string extension = ".dll"; var ravenPath = typeof(RavenServer).Assembly.Location; if (ravenPath.EndsWith(extension, StringComparison.OrdinalIgnoreCase)) { ravenPath = ravenPath.Substring(0, ravenPath.Length - extension.Length); } 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)); } ShutdownCompleteMre.Set(); } } while (rerun); return(0); }