OnStart () имеет максимальный лимит времени? - PullRequest
0 голосов
/ 26 июля 2011

Я использую AzureRubyRails sln, который является WorkerRole, расширяющим класс RoleEntryPoint.Я заметил, что мое приложение достигает определенной точки (непосредственно перед копированием), и затем Azure решает перезапустить роль без объяснения причин в журнале таблиц.Возможно ли, что я превышаю свой лимит времени в OnStart?

public override bool OnStart()
{
    try
    {
        LogInfo("Worker Role OnStart Entered");

        RoleEnvironment.Changing += RoleEnvironmentChanging;

        DiagnosticMonitorConfiguration dmc = DiagnosticMonitor.GetDefaultInitialConfiguration();

        dmc.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
        dmc.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;

        DiagnosticMonitor.Start("DiagnosticsConnectionString", dmc);

        this.roleId = RoleEnvironment.CurrentRoleInstance.Id;
        string outputContainer = RoleEnvironment.GetConfigurationSettingValue("OutputContainer");
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageAccount"));
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        this.container = blobClient.GetContainerReference(outputContainer);
        this.container.CreateIfNotExist();

        BlobContainerPermissions permissions = this.container.GetPermissions();
        permissions.PublicAccess = BlobContainerPublicAccessType.Container;
        this.container.SetPermissions(permissions);

        //Get the local Storage resources 
        LocalResource disk = RoleEnvironment.GetLocalResource("App");

        //Copy files across (log files and database are writeable)

        DirectoryInfo localStorageRoot = new DirectoryInfo(disk.RootPath);

        //Get the root of this role

        this.roleRoot = System.Environment.GetEnvironmentVariable("RoleRoot");
        this.roleRoot += "\\approot";

        try
        {
            LogInfo("Starting Git extract");
            var proc = new Process
            {
                StartInfo = new ProcessStartInfo(string.Format("{0}\\Ruby\\7za.exe", this.roleRoot), "x -oGit -y Git.7z")
                {
                    UseShellExecute = false,
                    WorkingDirectory = string.Format("{0}\\Ruby", this.roleRoot)
                },
                EnableRaisingEvents = true
            };
            proc.Start();

            proc.WaitForExit();
        }
        catch (Exception fErr)
        {
            LogError(fErr.Message);
        }

        try
        {
            LogInfo("Starting Git clone");
            var proc = new Process
            {
                StartInfo = new ProcessStartInfo(string.Format("{0}\\Ruby\\git\\bin\\git.exe", this.roleRoot), string.Format("clone git://github.com/callumj/InPerthAzure.git web_app", this.roleRoot))
                {
                    UseShellExecute = false,
                    WorkingDirectory = string.Format("{0}\\Ruby", this.roleRoot)
                },
                EnableRaisingEvents = true
            };
            proc.Start();

            proc.WaitForExit();
        }
        catch (Exception fErr)
        {
            LogError(fErr.Message);
        }

        string rubyFolderName = RoleEnvironment.GetConfigurationSettingValue("RubyFolder");
        this.rubyLocation = string.Format("{0}\\{1}", localStorageRoot.FullName, rubyFolderName);

        string rubySrc = string.Format("{0}\\{1}", this.roleRoot, rubyFolderName);

        try
        {
            LogInfo("Starting Ruby extraction");
            var proc = new Process
            {
                StartInfo = new ProcessStartInfo(Path.Combine(rubySrc, @"Ruby"))
                {
                    UseShellExecute = false,
                    WorkingDirectory = rubySrc
                },
                EnableRaisingEvents = true
            };
            proc.Start();

            proc.WaitForExit();
        }
        catch (Exception fErr)
        {
            LogError(fErr.Message);
        }

        LogInfo("Beginning copy");
        CopyFolder(string.Format("{0}\\{1}", this.roleRoot, rubyFolderName), this.rubyLocation);

        string appFolderName = RoleEnvironment.GetConfigurationSettingValue("AppFolder");
        this.appLocation = string.Format("{0}\\{1}", localStorageRoot.FullName, appFolderName);
        //CopyFolder(string.Format("{0}\\{1}", this.roleRoot, appFolderName), this.appLocation);

        string memcacheFolderName = RoleEnvironment.GetConfigurationSettingValue("MemcacheFolder");
        this.memcacheLocation = string.Format("{0}\\{1}", localStorageRoot.FullName, memcacheFolderName);

        //Get the local endpoint 
        LogInfo("Acquiring endpoint");
        this.endPoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Server"].IPEndpoint;

        // Start the server

        LogInfo("Beginning bootup");

        BootApp();

        LogInfo("Worker Role OnStart Exited");
    }
    catch (Exception err)
    {
        LogError(err.Message);
    }
    return base.OnStart();
}

Я считаю, что он хорошо работает на моем локальном эмуляторе вычислений разработчика (но я предполагаю, что это не так много значит).

1 Ответ

1 голос
/ 26 июля 2011

Я подозреваю, что ваш код падает в роли, потому что отсутствуют некоторые зависимости. Чтобы устранить эту проблему, я бы попытался разделить ваш код на консольное приложение с огромной попыткой / уловом. Затем я войду в систему с помощью RDP и просто попытаюсь запустить консольное приложение. Это даст вам трассировку вашего стека и позволит вам определить, где вы терпите неудачу. Просто убедитесь, что вы запускаете его из того же каталога, что и ваш RoleEntryPoint, чтобы он имел тот же относительный путь.

Но, вообще говоря, в OnStart () нет времени ожидания, с которым вы столкнетесь. Ваша роль будет выглядеть постоянно занятой, и о ней можно будет сказать, что она «не отвечает», но все равно будет запускаться OnStart.

Мое общее правило заключается в том, что выполнение задач OnStart и Startup должно занять не более 20 минут, или вы выполняете слишком много.

Наконец, - поскольку вы делаете что-то с Git и еще чем-то - взгляните на smarxrole Стива (bing it), так как он работает со всеми стартапами и является хорошей отправной точкой для подобных вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...