Partager via


Le chargement du contenu d’objet blob ou de bloc é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 des objets blob ou bloquer du contenu.

Configuration requise

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 blocage spécifiée n’est pas valide. »

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

La longueur de bloc qui a été spécifiée dans la requête Put Block URI 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 de bloc maximale autorisée. Pour connaître 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 blocs 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

Attendez sept jours que la liste de blocage non validée soit nettoyée par le garbage collection.

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

Utilisez le Kit de développement logiciel (SDK) Stockage Azure pour transférer les données à l’aide d’un objet blob factice. Pour cela, procédez comme suit :

  1. Créez un objet blob factice qui porte le même nom d’objet blob et 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ébloqué.

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

Utilisez le Kit de développement logiciel (SDK) Stockage Azure pour valider la liste de blocages non validée et propre l’objet blob. Pour cela, procédez comme suit :

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

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

  3. Supprimez l’objet blob.

La fonction PowerShell suivante montre comment récupérer une liste de blocs non validée, puis 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 SAS 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) à peu près en même temps pour un seul objet blob. 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 lors d’une opération put block précédente.

Remarque

Cette erreur peut se produire lors des validations de chargement simultanées après le démarrage du chargement, mais avant la validation. Dans ce cas, le chargement échoue. L’application peut réessayer le chargement lorsque l’erreur se produit, ou elle peut 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 l’accès concurrentiel pessimiste (baux) à l’aide du Kit de développement logiciel (SDK) Stockage Azure ou d’un outil basé sur l’interface graphique utilisateur, comme Explorateur Stockage Azure. Pour plus d’informations sur l’accès concurrentiel optimiste et pessimiste, consultez Gestion de la concurrence dans le stockage Blob.

Si l’erreur est due à des problèmes d’accès concurrentiel, vous devrez peut-être également propre les blocs non validés en suivant l’une des solutions de la 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.