Falha no carregamento de conteúdo de blob ou bloco no Armazenamento de Blobs do Azure
Este artigo discute como resolver falhas que podem ocorrer quando você usa o Armazenamento de Blobs do Microsoft Azure junto com seus aplicativos de nuvem para carregar blob ou bloquear conteúdo.
Pré-requisitos
- Uma conta de armazenamento de um dos seguintes serviços de armazenamento:
- SDK do Armazenamento do Azure
- Gerenciador de Armazenamento do Azure
- PowerShell
Sintomas
Você recebe uma das seguintes mensagens de erro.
Código de erro | Mensagem de erro |
---|---|
BlockCountExceedsLimit |
"A contagem de blocos não confirmados não pode exceder o limite máximo de 100.000 blocos." |
InvalidBlobOrBlock |
"O conteúdo do blob ou bloco especificado é inválido." |
InvalidBlock ou InvalidBlockList |
"A lista de bloqueios especificada é inválida." |
Causa 1: o comprimento do bloco especificado na chamada Put Block não é válido
O comprimento do bloco especificado na solicitação de URI Put Block não é válido por um ou mais dos seguintes motivos:
O aplicativo ou cliente especificou um tamanho de bloco que não é suportado.
O tamanho do bloco é maior que o tamanho máximo permitido do bloco. Para localizar os limites de tamanho de bloco para diferentes versões da API REST do Serviço Blob, consulte a seção Comentários do artigo de referência "Colocar Bloco".
Quando você tentou carregar blocos de dados usando mais de um aplicativo, havia blocos não confirmados que tinham comprimentos de bloco inconsistentes. Essa situação ocorre porque aplicativos diferentes usam comprimentos diferentes para carregar dados ou porque um upload anterior falhou.
O blob tem muitos blocos não confirmados porque uma operação de carregamento anterior foi cancelada. O número máximo de blocos não confirmados que podem ser associados a um blob é 100.000.
Remova os blocos não confirmados implementando uma dessas soluções.
Solução 1: Aguarde a coleta de lixo para coletar os dados não confirmados
Aguarde sete dias para que a lista de bloqueios não confirmada seja limpa pela coleta de lixo.
Solução 2: Usar um blob fictício para fazer a transferência de dados
Use o SDK do Armazenamento do Azure para transferir os dados usando um blob fictício. Para fazer isso, siga estas etapas:
Crie um blob fictício que tenha o mesmo nome de blob e esteja no mesmo contêiner. Esse blob pode ter um comprimento de zero.
Transfira o blob usando uma transferência desbloqueada.
Solução 3: confirmar a lista de bloqueios não confirmada usando o SDK do Armazenamento do Azure
Use o SDK do Armazenamento do Azure para confirmar a lista de bloqueios não confirmada e limpar o blob. Para fazer isso, siga estas etapas:
Recupere a lista de bloqueios não confirmada fazendo uma solicitação de URI Obter lista de bloqueios na qual o
blocklisttype
parâmetro URI é definido comouncommitted
.Confirme a lista de bloqueios usando a solicitação de URI Put Block List .
Exclua o blob.
A função do PowerShell a seguir é um exemplo de como recuperar uma lista de bloqueios não confirmada e excluí-la. A função requer os seguintes parâmetros.
Nome do Parâmetro | Descrição |
---|---|
-StorageAccountName |
O nome da conta de armazenamento. |
-SharedAccessSignature |
Um token de assinatura de acesso compartilhado (SAS) que usa os parâmetros <ss=b;srt=sco;sp=rwldc> de URI. Esses parâmetros são descritos em Construir um URI SAS de conta. |
-ContainerName |
O nome do contêiner de armazenamento. |
-BlobName |
O nome da bolha. |
[CmdletBinding()] Param(
[Parameter(Mandatory=$true, Position=1)] [string] $StorageAccountName,
[Parameter(Mandatory=$True, Position=1)] [string] $SharedAccessSignature,
[Parameter(Mandatory=$True, Position=1)] [string] $ContainerName,
[Parameter(Mandatory=$True, Position=1)] [string] $BlobName
)
# Build the URI strings in the REST API for GET and DELETE.
$uriDelete = (
"https://$StorageAccountName.blob.core.windows.net/",
"$ContainerName",
"/",
"$BlobName",
"$SharedAccessSignature"
) -Join ""
$uriGet = (
"$uriDelete",
"&comp=blocklist",
"&blocklisttype=uncommitted"
) -Join ""
Write-Host "The Delete URI is $uriDelete."
Write-Host "The Get URI is $uriGet."
# Make a REST API call to get the uncommitted block list.
$listFileURI = Invoke-WebRequest -Uri $uriGet -Method Get
$FileSystemName = $listFileURI.Content
$String = $FileSystemName -replace '' , ''
$String |
Select-Xml –XPath "/BlockList/UncommittedBlocks/Block" |
Select-Object -Expand Node
$Count = $String.Count
# Delete the blob and the uncommitted block.
if ($Count.Count -gt 0) {
$listFileURI1 = Invoke-WebRequest -Uri $uriDelete -Method Delete
$FileSystemName1 = $listFileURI1.StatusCode
Write-Host "The deletion was successful. The API returned status code $FileSystemName1."
}
Write-Host "Check whether the uncommitted blocks are still present."
Try {
$listFileURI2 = Invoke-WebRequest -Uri $uriGet -Method Get
} Catch {
# $err = $_.Exception
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
}
Write-Host (
"In this error message, we can verify that the",
"uncommitted blocks and their respective blob have been deleted.",
"The name and size of the uncommitted blocks that have been deleted are shown."
)
Causa 2: as operações PUT ocorrem simultaneamente para um blob
Ocorre um problema de temporização ou simultaneidade. Isso faz com que várias operações PUT (Put Block) ocorram aproximadamente ao mesmo tempo para um único blob. A operação Put Block List grava um blob especificando a lista de IDs de bloco que compõem o blob. Para ser gravado como parte de um blob, um bloco deve ter sido gravado com êxito no servidor em uma operação Put Block anterior.
Observação
Esse erro pode ocorrer durante confirmações de upload simultâneas depois que você inicia o upload, mas antes de confirmar. Nesse caso, o upload falha. O aplicativo pode repetir o upload quando o erro ocorrer ou pode tentar outra ação de recuperação baseada no cenário necessário.
Solução: usar concessões
Em vez de usar a simultaneidade otimista, tente implementar a simultaneidade pessimista (concessões) usando o SDK do Armazenamento do Azure ou uma ferramenta baseada em GUI, como o Gerenciador de Armazenamento do Azure. Para obter mais informações sobre simultaneidade otimista e pessimista, consulte Gerenciando simultaneidade no armazenamento de blobs.
Se o erro for causado por problemas de simultaneidade, talvez você também precise limpar os blocos não confirmados seguindo uma das soluções na Causa 1.
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.