Sitecore Azure не может начать

У нас проблема с развертыванием приложения sitecore в среде Azure. После обновления Cloud Service он не может запуститься, предоставив информацию:Unhandled Exception: Microsoft.ApplicationServer.Caching.DataCacheException, В WaIISHost В журналах процесса я нахожу такую ​​ошибку:

    0 : [00003180:00000006, 2014/09/09 06:35:16.89, ERROR] Unhandled exception: IsTerminating 'True',  Message 'System.TimeoutException: We waited for 'Boolean <CreateSymbolicLink>b__1()' that didn't finish within 00:00:30. 
   at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
   at System.Environment.get_StackTrace()
   at Sitecore.Azure.Sys.Retryer.Do.Until(Func`1 predicate, TimeSpan timeout)
   at RoleRootConfigurator.CreateSymbolicLink(String relativePathToAppRoot, DirectoryInfo localResourceDir)
   at WebRole.RoleRootConfigurator.ConfigureSymbolicLinksForApproot(DirectoryInfo localResourceDir)
   at WebRole.OnStart()
   at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum)
   at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.<InitializeRole>b__0()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
   at Sitecore.Azure.Sys.Retryer.Do.Until(Func`1 predicate, TimeSpan timeout)
   at WebRole.RoleRootConfigurator.CreateSymbolicLink(String relativePathToAppRoot, DirectoryInfo localResourceDir)
   at WebRole.RoleRootConfigurator.ConfigureSymbolicLinksForApproot(DirectoryInfo localResourceDir)
   at WebRole.OnStart()
   at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum)
   at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.<InitializeRole>b__0()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()'

Мы создали наше пользовательское WebRole на основе кода, подготовленного разработчиками Sitecore. Здесь представлен код, отвечающий за создание символических ссылок:

public void ConfigureSymbolicLinksForApproot(DirectoryInfo localResourceDir)
{
    if (RoleEnvironment.IsEmulated)
        return;
    Trace.TraceInformation(" -- Configure app root starting...");
    this.CreateSymbolicLink("temp", localResourceDir);
    this.CreateSymbolicLink("App_Data/debug", localResourceDir);
    this.CreateSymbolicLink("App_Data/diagnostics", localResourceDir);
    this.CreateSymbolicLink("App_Data/indexes", localResourceDir);
    this.CreateSymbolicLink("App_Data/logs", localResourceDir);
    this.CreateSymbolicLink("App_Data/packages", localResourceDir);
    this.CreateSymbolicLink("App_Data/viewstate", localResourceDir);
    this.CreateSymbolicLink("App_Data/MediaCache", localResourceDir);
    this.CreateSymbolicLink("App_Data/Submit_Queue", localResourceDir);
}

private void CreateSymbolicLink(string relativePathToAppRoot, DirectoryInfo localResourceDir)
{
    DirectoryInfo appRootDir = new DirectoryInfo(Path.Combine(this.AppRoot.FullName, relativePathToAppRoot));
    Do.ThisOnce((Action)(() => RmDir.RemoveDir(appRootDir))).Until((Func<bool>)(() => !Directory.Exists(appRootDir.FullName)));
    DirectoryInfo tempLocalResourceDir = new DirectoryInfo(Path.Combine(localResourceDir.FullName, relativePathToAppRoot));
    Do.ThisOnce(new Action(tempLocalResourceDir.CreateIfNotExists)).Until((Func<bool>)(() => Directory.Exists(tempLocalResourceDir.FullName)));
    Do.ThisOnce((Action)(() => MkLink.CreateLink(appRootDir, tempLocalResourceDir))).WithTracePing("Waiting for '{0}' to be created as symbolic link in app root", (object)appRootDir.FullName).Until((Func<bool>)(() => Directory.Exists(appRootDir.FullName)));
}

Я также нашел такую ​​информацию в Event Viewer:

Faulting application name: CacheService.exe, version: 1.0.5137.0, time stamp: 0x52304f01
Faulting module name: KERNELBASE.dll, version: 6.2.9200.16864, time stamp: 0x531d34d8
Exception code: 0xe0434352
Fault offset: 0x0000000000047b8c
Faulting process id: 0x1e80
Faulting application start time: 0x01cfcc0ca7dac7a3
Faulting application path: F:\plugins\Caching\CacheService.exe
Faulting module path: D:\Windows\system32\KERNELBASE.dll
Report Id: ee6a3966-37ff-11e4-93f6-00155d67d4ca
Faulting package full name: 
Faulting package-relative application ID: 

а также

Application: CacheService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: Microsoft.ApplicationServer.Caching.DataCacheException
Stack:
   at Microsoft.ApplicationServer.Caching.AzureCommon.AzureUtility.ProcessException(System.Exception)
   at Microsoft.ApplicationServer.Caching.Colocatedservice.CacheService.<OnStart>b__0(System.Object)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()

Исходя из этого, я пытался обновить библиотеки Windows AzureCache, используя nuget, предоставленный Sitecore, или помещенный в папку Azure SDK 2.2, но ничего не изменилось. Любая помощь будет благодарна.

1 ответ

Решение

Jacbar.

Исходя из первоначального исключения, процесс развертывания завершился неудачно при создании символических ссылок Windows для следующих каталогов:

  • \ Temp
  • \App_Data\ отлаживать
  • \App_Data\ диагностика
  • \App_Data\ индексы
  • \App_Data\ журналы
  • \App_Data\ пакеты
  • \App_Data\ ViewState
  • \App_Data\ MediaCache

Sitecore Azure использует этот прием, чтобы избежать переполнения последнего диска (обычно диска F:/) на виртуальной машине, размер которой ограничен 1,5 ГБ (раньше был 1 ГБ). Этот диск используется для хранения веб-приложения ASP.NET, которое вы развертываете в PaaS.

Как показывает мне .NET Reflector, метод Sitecore.Azure.Sys.Retryer.Do.Until(предикат Func) использует жестко заданное время ожидания, равное 30 секундам. Похоже, что в вашем случае недостаточно 30 секунд, чтобы удалить старый каталог в папке F:\ Approot (он же Веб-сайт), создать новый каталог в ресурсах локального хранилища Azure и связать его с помощью символических ссылок.

Я бы порекомендовал открыть заявку в службу поддержки Sitecore, чтобы выяснить, как лучше всего использовать 30-секундное значение.

С наилучшими пожеланиями, Олег

Другие вопросы по тегам