in Configurator/Core/Server/MySqlServerInstance.cs [1804:1928]
private ServerStartStatus StartInstanceAsProcessWithExtendedStatus(string additionalOptions = null, bool connectionsWaitReportStatus = false)
{
var startStatus = new ServerStartStatus(false);
if (IsRunning)
{
startStatus.Started = true;
return startStatus;
}
if (string.IsNullOrEmpty(ServerExecutableFilePath)
|| string.IsNullOrEmpty(ServerConfigFilePath))
{
startStatus.Started = false;
return startStatus;
}
ReportStatus(string.Format(Resources.ServerConfigProcessStartingText, NameWithVersion));
var isAdditionalOptionEmpty = string.IsNullOrEmpty(additionalOptions);
var isSelfContainedUpgrade = !isAdditionalOptionEmpty
&& additionalOptions.IndexOf("--upgrade", StringComparison.InvariantCultureIgnoreCase) >= 0;
var isInitializingDatabase = !isAdditionalOptionEmpty
&& additionalOptions.IndexOf("--initialize", StringComparison.InvariantCultureIgnoreCase) >= 0;
var redirectOutputToConsole = !isSelfContainedUpgrade
&& ReportStatusDelegate != null;
var coreOptionsBuilder = new StringBuilder();
if (File.Exists(ServerConfigFilePath))
{
coreOptionsBuilder.Append("--defaults-file=\"");
coreOptionsBuilder.Append(ServerConfigFilePath);
coreOptionsBuilder.Append("\"");
}
else
{
coreOptionsBuilder.Append("--port=");
coreOptionsBuilder.Append(Port);
if (!string.IsNullOrEmpty(_controller.DataDirectory))
{
coreOptionsBuilder.Append(" --datadir=\"");
coreOptionsBuilder.Append(Path.Combine(_controller.DataDirectory, "data"));
coreOptionsBuilder.Append("\"");
}
}
// Initialize the async task that will parse the error log in case of a self-contained upgrade or in case of parsing the error log file to determine if the server is accepting connections
Task<ServerUpgradeStatus> parsingLogForUpgradeTask = null;
Task<bool> parsingLogForAcceptingConnectionsTask = null;
ServerErrorLog mySqlErrorLog = null;
var parseErrorLog = isSelfContainedUpgrade
|| ParseErrorLogForAcceptingConnections
&& WaitUntilAcceptingConnections;
if (parseErrorLog)
{
_controller.UseStatusesList = redirectOutputToConsole;
mySqlErrorLog = new ServerErrorLog(_controller.ErrorLogFilePath, redirectOutputToConsole ? _controller.StatusesList : null)
{
ReportStatusDelegate = ReportStatus,
ReportWaitingDelegate = _controller.ReportWaiting
};
if (isSelfContainedUpgrade)
{
parsingLogForUpgradeTask = Task.Factory.StartNew(() => mySqlErrorLog.ParseServerUpgradeMessages(_controller.ServerVersion), _controller.CancellationToken);
}
else
{
parsingLogForAcceptingConnectionsTask = Task.Factory.StartNew(() => mySqlErrorLog.ParseServerAcceptingConnectionMessage(_controller.ServerVersion, !redirectOutputToConsole), _controller.CancellationToken);
}
}
var consoleOption = redirectOutputToConsole
? " --console"
: string.Empty;
if (!string.IsNullOrEmpty(additionalOptions))
{
additionalOptions = " " + additionalOptions;
}
var processResult = Base.Classes.Utilities.RunProcess(
ServerExecutableFilePath,
$"{coreOptionsBuilder}{consoleOption}{additionalOptions}",
null,
ReportStatus,
ReportStatus,
isInitializingDatabase);
startStatus.Started = processResult != null
&& (isInitializingDatabase
? processResult.ExitCode == 0
: processResult.RunProcess != null
&& !processResult.RunProcess.HasExited);
ReportStatus(string.Format(startStatus.Started ? Resources.ServerConfigProcessStartedSuccessfullyText : Resources.ServerConfigProcessStartFailedText, NameWithVersion));
if (startStatus.Started
&& parseErrorLog)
{
if (isSelfContainedUpgrade)
{
parsingLogForUpgradeTask.Wait(_controller.CancellationToken);
startStatus.UpgradeStatus = parsingLogForUpgradeTask.IsCompleted
? parsingLogForUpgradeTask.Result
: new ServerUpgradeStatus();
startStatus.AcceptingConnections = startStatus.UpgradeStatus.AcceptingConnections;
}
else
{
parsingLogForAcceptingConnectionsTask.Wait(_controller.CancellationToken);
startStatus.AcceptingConnections = parsingLogForAcceptingConnectionsTask.IsCompleted
&& parsingLogForAcceptingConnectionsTask.Result;
}
}
else if (parseErrorLog)
{
ReportServerStartErrors(mySqlErrorLog.LogLines);
}
if (WaitUntilAcceptingConnections
&& startStatus.Started
&& (!parseErrorLog
|| !startStatus.AcceptingConnections))
{
startStatus.AcceptingConnections = WaitUntilConnectionSuccessful(connectionsWaitReportStatus);
}
_controller.UseStatusesList = false;
parsingLogForUpgradeTask?.Dispose();
parsingLogForAcceptingConnectionsTask?.Dispose();
return startStatus;
}