A instância da função AssemblyBinder está lançando a exceção System.IO.IOException
Este artigo fornece informações sobre como solucionar problemas em que a instância da função AssemblyBinder do aplicativo Compressor está presa entre o estado Ocupado e Reiniciando e lançando a exceção System.IO.IOException informando: Não há espaço suficiente no disco.
Versão original do produto: Serviço de Gerenciamento de API
Número original do KB: 4464907
Observação
Consulte o artigo sobre a série de solução de problemas do Serviço de Nuvem do Azure, este é o segundo cenário do laboratório. Certifique-se de ter seguido as instruções de configuração do laboratório para o aplicativo Compressor de acordo com isso, para recriar o problema.
Sintomas
A instância de função AssemblyBinder do aplicativo Compressor está lançando a exceção sem tratamento abaixo na folha do portal do Azure e presa entre o estado Ocupado e Reiniciando.
Unhandled Exception: There is not enough space on the disk. at System.IO.__Error.WinIOError (Int32 errorCode, String maybeFullPath) at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count) at Ionic.Zip.ZipEntry.ExtractAndCrc(Stream archiveStream, Stream targetOutput, Int16 compressionMethod, Int64 compressedFileDataSize, Int64 uncompressedSize) at Ionic.Zip.ZipEntry.ExtractToStream(Stream archiveStream, Stream output, EncryptionAlgorithm encryptionAlgorithm, Int32 expectedCrc32) at Ionic.Zip.ZipEntry.InternalExtractToBaseDir(String baseDir, String password, ZipContainer zipContainer, ZipEntrySource zipEntrySource, String fileName) at Ionic.Zip.ZipFile._InternalExtractAll(String path, Boolean overrideExtractExistingProperty) at AssemblyBinder.WorkerRole.OnStart() in D:\compressor\AssemblyBinder\WorkerRole.cs:line 56 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()'[2018-08-12T14:47:25Z] Last exit time: [2018/08/12, 14:47:25.965].
Etapas de solução de problemas
Na pilha de chamadas de erro, parece que este WorkerRole está executando alguma operação de descompactação ou extração no método OnStart(), mas está falhando devido ao armazenamento insuficiente. A próxima pergunta óbvia que virá à sua mente é onde exatamente WaWorkerHost.exe processo está extraindo o arquivo.
Para descobrir a resposta, use a ferramenta Process Monitor para fazer um rastreamento do ProcMon e ver o que você pode encontrar.
WaWorkerHost.exe processo está gravando algum arquivo em seu diretório temporário padrão, que tem um tamanho máximo de 100 MB, que pode ficar cheio em algum momento. Ao navegar até o diretório RoleTemp, você pode descobrir que a cota de espaço em disco está realmente se esgotando para esse diretório.
Você pode ter descoberto a causa do problema, mas o que você deve fazer quando ficar sem espaço no local RoleTemp ? Aqui está a resposta.
Portanto, você deve configurar um recurso de armazenamento local e apontar os diretórios TEMP e TMP para o caminho do recurso de armazenamento local, como abaixo:
A declaração de recurso local deve ter sido adicionada ao arquivo de definição de serviço para a função AssemblyBinder.
<?xml version="1.0" encoding="UTF-8"?>
<LocalResources>
<LocalStorage name="FileStorage" cleanOnRoleRecycle="true" sizeInMB="200" />
</LocalResources>
Essa modificação deve ser executada dentro do método RoleEntryPoint.OnStart .
localResource = RoleEnvironment.GetLocalResource("FileStorage");
Environment.SetEnvironmentVariable("TMP", localResource.RootPath);
Environment.SetEnvironmentVariable("TEMP", localResource.RootPath);
Entre em contato conosco para obter ajuda
Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.