Przekazywanie obiektu blob lub zawartości blokowej kończy się niepowodzeniem w usłudze Azure Blob Storage
W tym artykule omówiono sposób rozwiązywania błędów, które mogą wystąpić podczas korzystania z usługi Microsoft Azure Blob Storage wraz z aplikacjami w chmurze w celu przekazywania obiektów blob lub zawartości blokowej.
Wymagania wstępne
- Konto magazynu z jednej z następujących usług magazynu:
- Azure Storage SDK
- Eksplorator usługi Azure Storage
- Program PowerShell
Symptomy
Zostanie wyświetlony jeden z następujących komunikatów o błędach.
Kod błędu | Komunikat o błędzie |
---|---|
BlockCountExceedsLimit |
"Liczba niezatwierdzonych bloków nie może przekroczyć maksymalnego limitu 100 000 bloków". |
InvalidBlobOrBlock |
"Określony obiekt blob lub zawartość bloku jest nieprawidłowa". |
InvalidBlock lub InvalidBlockList |
"Określona lista bloków jest nieprawidłowa". |
Przyczyna 1: Długość bloku określona w wywołaniu Put Block jest nieprawidłowa
Długość bloku określona w żądaniu Put Block URI nie jest prawidłowa z co najmniej jednego z następujących powodów:
Aplikacja lub klient określił rozmiar bloku, który nie jest obsługiwany.
Rozmiar bloku jest większy niż maksymalny dozwolony rozmiar bloku. Aby znaleźć limity rozmiaru bloku dla różnych wersji interfejsu API REST usługi Blob Service, zobacz sekcję Uwagi artykułu referencyjnego "Umieść blok".
Podczas próby przekazania bloków danych przy użyciu więcej niż jednej aplikacji istniały niezatwierdzone bloki, które miały niespójne długości bloków. Taka sytuacja występuje, ponieważ różne aplikacje używają różnych długości do przekazywania danych lub wcześniejszego przekazania nie powiodło się.
Obiekt blob ma zbyt wiele niezatwierdzonych bloków, ponieważ poprzednia operacja przekazywania została anulowana. Maksymalna liczba niezatwierdzonych bloków, które mogą być skojarzone z obiektem blob, wynosi 100 000.
Usuń niezatwierdzone bloki, implementując jedno z tych rozwiązań.
Rozwiązanie 1. Oczekiwanie na odebranie niezatwierdzonych danych
Poczekaj siedem dni na wyczyszczenie listy niezatwierdzonych bloków przez odzyskiwanie pamięci.
Rozwiązanie 2. Używanie fikcyjnego obiektu blob do transferu danych
Użyj zestawu SDK usługi Azure Storage, aby przesłać dane przy użyciu fikcyjnego obiektu blob. W tym celu wykonaj następujące kroki:
Utwórz fikcyjny obiekt blob o tej samej nazwie obiektu blob i znajduje się w tym samym kontenerze. Ten obiekt blob może mieć długość zera.
Przenieś obiekt blob przy użyciu odblokowanego transferu.
Rozwiązanie 3. Zatwierdzanie niezatwierdzonej listy blokowej przy użyciu zestawu SDK usługi Azure Storage
Użyj zestawu SDK usługi Azure Storage, aby zatwierdzić listę niezatwierdzonych bloków i wyczyścić obiekt blob. W tym celu wykonaj następujące kroki:
Pobierz listę niezatwierdzonych bloków, tworząc żądanie identyfikatora URI listy bloków , w którym
blocklisttype
parametr identyfikatora URI jest ustawiony nauncommitted
wartość .Zatwierdź listę bloków przy użyciu żądania Put Block List URI.
Usuń obiekt blob.
Poniższa funkcja programu PowerShell to przykład pobierania niezatwierdzonej listy bloków, a następnie usuwania jej. Funkcja wymaga następujących parametrów.
Nazwa parametru | opis |
---|---|
-StorageAccountName |
Nazwa konta magazynu. |
-SharedAccessSignature |
Token sygnatury dostępu współdzielonego (SAS), który używa parametrów <ss=b;srt=sco;sp=rwldc> identyfikatora URI. Te parametry opisano w artykule Tworzenie identyfikatora URI sygnatury dostępu współdzielonego konta. |
-ContainerName |
Nazwa kontenera magazynu. |
-BlobName |
Nazwa obiektu 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."
)
Przyczyna 2. Operacje PUT są wykonywane jednocześnie dla obiektu blob
Występuje problem z chronometrażem lub współbieżnością. Powoduje to wykonanie wielu operacji PUT (Put Block) w mniej więcej tym samym czasie dla pojedynczego obiektu blob. Operacja Umieszczanie listy blokowej zapisuje obiekt blob, określając listę identyfikatorów blokowych, które tworzą obiekt blob. Aby można je było zapisać w ramach obiektu blob, blok musi zostać pomyślnie zapisany na serwerze w poprzedniej operacji Put Block .
Uwaga 16.
Ten błąd może wystąpić podczas współbieżnych zatwierdzeń przekazywania po rozpoczęciu przekazywania, ale przed zatwierdzeniem. W takim przypadku przekazywanie kończy się niepowodzeniem. Aplikacja może ponowić próbę przekazania po wystąpieniu błędu lub spróbować wykonać inną akcję odzyskiwania opartą na wymaganym scenariuszu.
Rozwiązanie: Korzystanie z dzierżaw
Zamiast korzystać z optymistycznej współbieżności, spróbuj zaimplementować pesymistyczną współbieżność (dzierżawy) przy użyciu zestawu SDK usługi Azure Storage lub narzędzia opartego na graficznym interfejsie użytkownika, takim jak Eksplorator usługi Azure Storage. Aby uzyskać więcej informacji na temat optymistycznej i pesymistycznej współbieżności, zobacz Zarządzanie współbieżnością w magazynie obiektów blob.
Jeśli błąd jest spowodowany problemami ze współbieżnością, może być również konieczne wyczyszczenie niezatwierdzonych bloków, postępując zgodnie z jednym z rozwiązań w przyczynie 1.
Skontaktuj się z nami, aby uzyskać pomoc
Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii na temat platformy Azure.