Partager via


Le chargement du contenu d’objets blob ou de blocs échoue dans Stockage Blob Azure

Cet article explique comment résoudre les échecs qui peuvent se produire lorsque vous utilisez Microsoft Stockage Blob Azure avec vos applications cloud pour charger du contenu blob ou bloquer.

Prerequisites

Symptômes

Vous recevez l’un des messages d’erreur suivants.

Code d'erreur Message d’erreur
BlockCountExceedsLimit « Le nombre de blocs non validés ne peut pas dépasser la limite maximale de 100 000 blocs. »
InvalidBlobOrBlock « Le contenu d’objet blob ou de bloc spécifié n’est pas valide. »
InvalidBlock ou InvalidBlockList « La liste de blocs spécifiée n’est pas valide. »

Cause 1 : La longueur du bloc spécifiée dans l’appel Put Block n’est pas valide

La longueur de bloc spécifiée dans la demande d’URI Put Block n’est pas valide pour une ou plusieurs des raisons suivantes :

  • L’application ou le client a spécifié une taille de bloc qui n’est pas prise en charge.

  • La taille du bloc est supérieure à la taille maximale autorisée du bloc. Pour trouver les limites de taille de bloc pour différentes versions de l’API REST du service Blob, consultez la section Remarques de l’article de référence « Put Block ».

  • Lorsque vous avez essayé de charger des blocs de données à l’aide de plusieurs applications, il y avait des blocs non validés qui avaient des longueurs de bloc incohérentes. Cette situation se produit parce que différentes applications utilisent des longueurs différentes pour charger des données, ou parce qu’un chargement précédent a échoué.

  • L’objet blob a trop de blocs non validés, car une opération de chargement précédente a été annulée. Le nombre maximal de blocs non validés pouvant être associés à un objet blob est de 100 000.

Supprimez les blocs non validés en implémentant l’une de ces solutions.

Solution 1 : Attendre que le garbage collection récupère les données non validées

Patientez sept jours pour que la liste de blocs non validée soit nettoyée par garbage collection.

Solution 2 : Utiliser un objet blob factice pour effectuer le transfert de données

Utilisez le sdk Stockage Azure pour transférer les données à l’aide d’un objet blob factice. Pour ce faire, procédez comme suit :

  1. Créez un objet blob factice qui a le même nom d’objet blob et qui se trouve dans le même conteneur. Cet objet blob peut avoir une longueur de zéro.

  2. Transférez l’objet blob à l’aide d’un transfert déblocé.

Solution 3 : Valider la liste de blocs non validée à l’aide du Kit de développement logiciel (SDK) Stockage Azure

Utilisez le sdk Stockage Azure pour valider la liste de blocs non validée et nettoyer l’objet blob. Pour ce faire, procédez comme suit :

  1. Récupérez la liste de blocs non validée en effectuant une requête d’URI Get Block List dans laquelle le blocklisttype paramètre URI est défini uncommittedsur .

  2. Validez la liste de blocs à l’aide de la demande d’URI Put Block List .

  3. Supprimez l’objet blob.

La fonction PowerShell suivante est un exemple de récupération d’une liste de blocs non validée, puis de la supprimer. La fonction nécessite les paramètres suivants.

Nom du paramètre Description
-StorageAccountName Nom du compte de stockage.
-SharedAccessSignature Jeton de signature d’accès partagé (SAP) qui utilise les paramètres <ss=b;srt=sco;sp=rwldc>d’URI. Ces paramètres sont décrits dans Construire un URI SAP de compte.
-ContainerName Nom du conteneur de stockage.
-BlobName Nom de l’objet blob.
[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."
)

Cause 2 : Les opérations PUT se produisent simultanément pour un objet blob

Un problème de minutage ou d’accès concurrentiel se produit. Cela entraîne l’exécution de plusieurs opérations PUT (Put Block) en même temps pour un objet blob unique. L’opération Put Block List écrit un objet blob en spécifiant la liste des ID de bloc qui composent l’objet blob. Pour être écrit dans le cadre d’un objet blob, un bloc doit avoir été correctement écrit sur le serveur dans une opération put block précédente.

Note

Cette erreur peut se produire pendant les validations de chargement simultanées après avoir démarré le chargement, mais avant de valider. Dans ce cas, le chargement échoue. L’application peut réessayer le chargement lorsque l’erreur se produit, ou essayer une autre action de récupération basée sur le scénario requis.

Solution : Utiliser des baux

Au lieu d’utiliser l’accès concurrentiel optimiste, essayez d’implémenter une concurrence pessimiste (baux) à l’aide du SDK Stockage Azure ou d’un outil basé sur l’interface graphique graphique, tel que Explorateur Stockage Azure. Pour plus d’informations sur la concurrence optimiste et pessimiste, consultez Gestion de la concurrence dans le stockage d’objets blob.

Si l’erreur est due à des problèmes d’accès concurrentiel, vous devrez peut-être également nettoyer les blocs non validés en suivant l’une des solutions dans Cause 1.

Contactez-nous pour obtenir de l’aide

Pour toute demande ou assistance, créez une demande de support ou posez une question au support de la communauté Azure. Vous pouvez également soumettre des commentaires sur les produits à la communauté de commentaires Azure.