2013-02-01 33 views
6

Sự cố này tóm tắt:Danh sách chặn của Azure blob trống, nhưng blob không trống! Làm sao có thể?

Một khối màu có thể được tạo bằng một yêu cầu PUT duy nhất. Điều này sẽ tạo ra một blob với nội dung cam kết nhưng các blob sẽ không có bất kỳ khối cam kết!

Điều này có nghĩa là bạn không thể giả định rằng việc ghép các khối được cam kết giống như nội dung đã cam kết.

Khi làm việc với khối màu, bạn sẽ phải chú ý nhiều hơn đến các đốm màu có danh sách khối trống, vì các đốm màu đó có thể hoặc không thể trống!


Câu hỏi ban đầu:

Một trong những blobs lưu trữ của chúng tôi trong một tài khoản Azure có một danh sách khối trống rỗng, mặc dù nó không bị để trống.

Tôi lấy danh sách chặn như thế này (C#):

foreach (var block in _cloudBlob.DownloadBlockList(
    BlockListingFilter.Committed, 
    AccessCondition.GenerateLeaseCondition(_leaseId))) 
{ 
    // ... 
} 

Mã trong khối foreach KHÔNG thực thi. Danh sách trả về trống.

Tuy nhiên, blob báo cáo rằng nó có một-không không dài khi tôi kiểm tra: _cloudBlob.Properties.Length

Tôi cũng có thể tải về blob và thấy rằng nó không phải là sản phẩm nào.

Tôi có thiếu gì đó không? Làm thế nào danh sách chặn có thể trống khi blob không phải là ?!

Việc tôi có sử dụng BlockListingFilter.Committed, BlockListingFilter.Uncommitted hoặc BlockListingFilter.All không quan trọng; danh sách vẫn còn trống!

CẬP NHẬT

tôi đã sao chép blob này để một container nào để vấn đề này có thể được sao chép bởi bất cứ ai.

Sau đây là cách để tái tạo những gì tôi không thể hiểu:

tính đầu tiên get blob từ Azure sử dụng REST API:

HEAD http://dfdev.blob.core.windows.net/pub/test HTTP/1.1 
Host: dfdev.blob.core.windows.net 

đáp ứng:

HTTP/1.1 200 OK 
Content-Length: 66 
Content-Type: application/octet-stream 
Last-Modified: Sat, 02 Feb 2013 09:37:19 GMT 
ETag: 0x8CFCF40075A5F31 
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 
x-ms-request-id: 4b149a7e-2fcd-4ab4-8d53-12ef047cbfa1 
x-ms-version: 2009-09-19 
x-ms-lease-status: unlocked 
x-ms-blob-type: BlockBlob 
Date: Sat, 02 Feb 2013 09:40:54 GMT 

Các tiêu đề phản ứng cho chúng tôi biết rằng đây là một khối blob và nó có chiều dài là 66 byte.

Bây giờ lấy danh sách chặn từ:

http://dfdev.blob.core.windows.net/pub/test?comp=blocklist

đáp ứng cơ thể:

<?xml version="1.0" encoding="utf-8"?><BlockList><CommittedBlocks /></BlockList> 

Vì vậy, các blob không có bất kỳ khối cam kết, nó vẫn có chiều dài 66 byte!

Đây có phải là lỗi hoặc tôi đã hiểu nhầm điều gì đó không?

Hãy giúp tôi!

UPDATE 2

tôi đã tìm thấy rằng nếu tôi tải lên các blob như thế này:

container.GetBlockBlobReference("put-only") 
    .UploadFromStream(File.OpenRead("test-blob")); 

... sau đó yêu cầu PUT đơn được gửi đến Azure và các blob được một sản phẩm nào danh sách chặn (giống như ở trên).

Tuy nhiên, nếu tôi tải lên các blob như thế này:

var blob = container.GetBlockBlobReference("put-block"); 
string blockId = Convert.ToBase64String(Guid.NewGuid().ToByteArray()); 
blob.PutBlock(blockId, File.OpenRead("test-blob"), null); 
blob.PutBlockList(new string[] { blockId }); 

... sau đó hai yêu cầu được gửi đến Azure (một cho việc đưa các khối và một cho việc đưa danh sách chặn).

đốm màu thứ hai nhận danh sách chặn không trống.

Tại sao PUT đơn không tạo ra danh sách chặn?

Chúng ta không thể dựa vào đó việc ghép các khối cam kết của blob bằng với nội dung thực tế của blob ?!

Nếu không, chúng ta sẽ xác định khi nào danh sách chặn là OK và khi nào không ??

CẬP NHẬT 3

Tôi đã thực hiện một workaround cho điều này mà tôi nghĩ là đủ trong trường hợp chúng tôi gặp phải vấn đề này. Trong trường hợp chúng ta khám phá một danh sách khối rỗng và chiều dài blob lớn hơn 0, thì chúng ta sẽ giả định rằng mọi thứ đều ổn (mặc dù nó không thực sự) và tiếp tục viết lại dữ liệu đó bằng cách sử dụng Put Block và Put Block List tại cơ hội tiếp theo.

Tuy nhiên, mặc dù điều này sẽ thực hiện thủ thuật trong trường hợp của chúng tôi, vẫn còn rất khó hiểu rằng một khối màu không trống có thể có một danh sách trống các khối đã cam kết !!

Đây có phải là thiết kế theo Azure không? Bất cứ ai có thể giải thích những gì đang xảy ra?

CẬP NHẬT 4

Microsoft confirmed this issue on the MSDN forums quá. Trích dẫn từ Allen Chen:

Tôi đã xác nhận với nhóm sản phẩm. Đây là một hành vi bình thường. Tiêu đề x-ms-blob-content-length là kích thước của đốm màu cam kết. Trong trường hợp của bạn, bạn sử dụng API Put Blob để tất cả nội dung được tải lên trong một API duy nhất và được cam kết trong cùng một yêu cầu.Kết quả là trong phản hồi của API của danh sách chặn, bạn thấy tiêu đề x-ms-blob-content-length có giá trị là 66 có nghĩa là kích thước blob đã cam kết.

Chúng tôi đã biết vấn đề rằng tài liệu MSDN của API danh sách chặn khối không rõ ràng về điều này và sẽ hoạt động trên đó.

Trả lời

7

Như bạn cũng đã xác định với các thử nghiệm của mình, truy vấn danh sách các khối của khối màu được tải lên bằng cách sử dụng Put Blob sẽ trả về danh sách trống. Điều này là do thiết kế.

Tải lênFromStream API trong Thư viện khách lưu trữ thực hiện một vài kiểm tra trước khi quyết định có tải lên blob bằng cách sử dụng một thao tác Đặt Blob hay một chuỗi các hoạt động Đặt khối theo sau bởi Danh sách chặn khối. Một thuộc tính thay đổi hành vi này là SingleBlobUploadThresholdInBytes.

+0

Vì vậy, điều này có nghĩa là chúng tôi không thể tin tưởng rằng việc ghép các khối được cam kết bằng với nội dung thực tế của blob. Do đó chúng ta phải xử lý đặc biệt cho tất cả các khối màu có một danh sách khối trống, phải không? Có trường hợp đặc biệt nào khác khi việc ghép các khối cam kết không bằng với nội dung thực tế không? –

+1

Nếu các đốm màu đã được cam kết bằng cách sử dụng một danh sách chặn (Đặt danh sách chặn), bạn luôn có thể truy vấn cùng một danh sách trở lại. Nếu một danh sách chặn không được cam kết (có nghĩa là Put Blob đã được sử dụng), danh sách chặn sẽ trống. –

+1

Ok. Vâng, đó là rõ ràng. Tuy nhiên, điều đó không có nghĩa là chúng ta thực sự có ba loại đốm màu; Các đốm màu trang; Khối blobs VỚI khối; và Chặn blobs KHÔNG CÓ khối !? Ví dụ, nếu chúng ta muốn chắp thêm dữ liệu vào một blob khối thì chúng ta sẽ cần phải xử lý hai "loại" của các đốm màu khối hoàn toàn khác nhau. Điều này chắc chắn cảm thấy như một thiết kế xấu với tôi, nhưng có lẽ tôi đang thiếu một cái gì đó? Dù sao, bạn đã trả lời câu hỏi của tôi - IS này theo thiết kế. Cảm ơn bạn! –

Các vấn đề liên quan