2013-02-01 10 views
6

संक्षेप में यह समस्या:एज़ूर ब्लॉब की ब्लॉक सूची खाली है, लेकिन ब्लॉब खाली नहीं है! यह कैसे हो सकता है?

एक ब्लॉक ब्लॉब एक ​​भी PUT अनुरोध के साथ बनाया जा सकता है। यह प्रतिबद्ध सामग्री के साथ एक ब्लॉब बनाएगा लेकिन ब्लॉब में कोई प्रतिबद्ध ब्लॉक नहीं होगा!

इसका मतलब है कि आप यह नहीं मान सकते कि प्रतिबद्ध ब्लॉक का समावेशन प्रतिबद्ध सामग्री के समान है।

ब्लॉक ब्लॉब्स के साथ काम करते समय आपको खाली ब्लॉक सूचियों वाले ब्लब्स पर अतिरिक्त ध्यान देना होगा, क्योंकि ऐसे ब्लॉब्स खाली हो सकते हैं या नहीं!


मूल प्रश्न: हालांकि यह गैर खाली है

हमारे भंडारण धब्बे से एक Azure खाते में, एक खाली ब्लॉक सूची है।

मैं की तरह इस (सी #) ब्लॉक सूची को पुन: प्राप्त कर रहा हूँ:

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

foreach ब्लॉक में कोड निष्पादित नहीं है। लौटाई गई सूची खाली है।

हालांकि, ब्लॉब रिपोर्ट यह एक गैर शून्य लंबाई जब मैं जाँच है कि: _cloudBlob.Properties.Length

मैं भी ब्लॉब डाउनलोड करने और देखते हैं कि यह खाली नहीं है सकते हैं।

क्या मुझे कुछ याद आ रही है? ब्लॉब नहीं होने पर ब्लॉक सूची खाली कैसे हो सकती है ?!

इससे कोई फर्क नहीं पड़ता कि मैं BlockListingFilter.Committed, BlockListingFilter.Uncommitted या BlockListingFilter.All का उपयोग करता हूं; सूची अभी भी खाली है!

अद्यतन

मैं एक सार्वजनिक कंटेनर को यह ब्लॉब की नकल की है ताकि इस मुद्दे को किसी के द्वारा reproduced किया जा सकता है।

पहले प्राप्त ब्लॉब गुण Azure से बाकी एपीआई का उपयोग कर:

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

प्रतिक्रिया:

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 

प्रतिक्रिया हेडर

यहाँ पुन: पेश करने के लिए कैसे क्या मुझे समझ में नहीं कर पा रहा है हमें बताएं कि यह एक ब्लॉक ब्लॉब है और इसकी लंबाई 66 बाइट है।

अब से ब्लॉक सूची प्राप्त:

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

रिस्पांस शरीर:

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

तो, ब्लॉब किसी भी प्रतिबद्ध ब्लॉक नहीं है, अभी भी यह 66 बाइट्स की लंबाई है!

क्या यह एक बग है या मैंने कुछ गलत समझा है?

कृपया मेरी मदद करें!

अद्यतन 2

मैंने पाया है कि अगर मैं इस तरह ब्लॉब अपलोड करें:

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

... फिर एक ही PUT अनुरोध Azure करने के लिए भेजा जाता है और ब्लॉब एक ​​खाली हो जाता है ब्लॉक सूची (बस ऊपर की तरह)।

हालांकि, मैं इस तरह ब्लॉब अपलोड करते हैं: (ब्लॉक सूची डालने के लिए ब्लॉक डालने के लिए एक और एक अन्य)

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 }); 

... तो दो अनुरोध Azure करने के लिए भेजा जाता है।

दूसरा ब्लॉब एक ​​खाली खाली सूची सूची प्राप्त करता है।

क्यों एक पुट एक ब्लॉक सूची उपज नहीं करेगा?

क्या हम इस बात पर भरोसा नहीं कर सकते कि ब्लॉब के प्रतिबद्ध ब्लॉक के संयोजन ब्लॉब की वास्तविक सामग्री के बराबर हैं ?!

यदि नहीं, तो हम कैसे निर्धारित करेंगे कि ब्लॉक सूची ठीक है और जब यह नहीं है ??

अद्यतन 3

मैं इस मैं इस मामले में जहां हम इस समस्या का सामना करना पड़ा में पर्याप्त लगता है कि के लिए एक समाधान क्रियान्वित किया है। यदि हम एक खाली ब्लॉक सूची और शून्य से अधिक की एक ब्लॉब लंबाई खोजते हैं, तो हम मान लेंगे कि सब ठीक है (हालांकि यह वास्तव में नहीं है) और आगे बढ़ें और पुट ब्लॉक और पुट ब्लॉक सूची का उपयोग करके उस डेटा को फिर से लिखें अगला अवसर

हालांकि, हालांकि यह हमारे मामले में चाल करेगा, फिर भी यह बहुत भ्रमित है कि एक गैर-खाली ब्लॉक ब्लॉब में प्रतिबद्ध ब्लॉक की खाली सूची हो सकती है !!

क्या यह अज़ूर में डिज़ाइन है? क्या कोई बता सकता है कि क्या हो रहा है?

अद्यतन 4

माइक्रोसॉफ्ट confirmed this issue on the MSDN forums भी। एलन चेन से उद्धरण:

मैंने उत्पाद टीम के साथ पुष्टि की है। यह एक सामान्य व्यवहार है। एक्स-एमएस-ब्लोब-कंटेंट-लम्बाई हेडर प्रतिबद्ध ब्लॉब का आकार है। आपके मामले में आप पुट ब्लॉब एपीआई का उपयोग करते हैं, इसलिए सभी सामग्री एक ही एपीआई में अपलोड की जाती है और उसी अनुरोध में प्रतिबद्ध होती है।परिणामस्वरूप गेट ब्लॉक सूची एपीआई की प्रतिक्रिया में आप देखते हैं कि एक्स-एमएस-ब्लोब-कंटेंट-लम्बाई हेडर का 66 का मान है जिसका अर्थ है प्रतिबद्ध ब्लॉब आकार।

हम इस मुद्दे से अवगत हैं कि गेट ब्लॉक सूची एपीआई का एमएसडीएन दस्तावेज़ इस पर बिल्कुल स्पष्ट नहीं है और इस पर काम करेगा।

उत्तर

7

आप भी अपने परीक्षण के साथ की पहचान के रूप में एक ब्लॉक ब्लॉब Put Blob का उपयोग कर एक खाली सूची वापस आ जाएगी अपलोड के ब्लॉक की सूची में जानना चाहते। यह डिजाइन द्वारा है।

स्टोरेज क्लाइंट लाइब्रेरी में अपलोडफ्रॉमस्ट्रीम एपीआई एक पुट ब्लॉब ऑपरेशन या पुट ब्लॉक सूची के बाद पुट ब्लॉक ऑपरेशंस का अनुक्रम या पुट ब्लॉक सूची के अनुक्रम का उपयोग करके ब्लॉब अपलोड करना है या नहीं, यह तय करने से पहले कुछ चेक करता है। एक संपत्ति जो इस व्यवहार को बदलती है SingleBlobUploadThresholdInBytes है।

+0

तो इसका मतलब है कि हम इस बात पर भरोसा नहीं कर सकते कि प्रतिबद्ध ब्लॉक के संयोजन ब्लॉब की वास्तविक सामग्री के बराबर हैं। इसलिए हमारे पास सभी ब्लॉक ब्लॉब्स के लिए विशेष हैंडलिंग होना चाहिए जिनके पास खाली ब्लॉक सूची है, है ना? क्या कोई अन्य विशेष मामला है जब प्रतिबद्ध ब्लॉक का समापन वास्तविक सामग्री के बराबर नहीं है? –

+1

यदि ब्लॉब ब्लॉक सूची (पुट ब्लॉक सूची) का उपयोग करके किया गया था, तो आप हमेशा उसी सूची को क्वेरी कर सकते हैं। यदि एक ब्लॉक सूची नहीं की गई थी (जिसका अर्थ है कि पुट ब्लॉब का उपयोग किया गया था), ब्लॉक सूची खाली होने जा रही है। –

+1

ठीक है। वैसे यह स्पष्ट है। हालांकि, इसका मतलब यह नहीं है कि हमारे पास वास्तव में तीन प्रकार के ब्लब्स हैं; पेज ब्लब्स; ब्लॉक के साथ ब्लॉक ब्लॉब्स; ब्लॉक के बिना ब्लॉक ब्लॉब्स !? यदि हम उदाहरण के लिए ब्लॉक ब्लॉब में डेटा जोड़ना चाहते हैं तो हमें ब्लॉक ब्लॉब्स के दो "प्रकार" को पूरी तरह अलग करने की आवश्यकता होगी। यह निश्चित रूप से मेरे लिए एक खराब डिजाइन की तरह लगता है, लेकिन शायद मुझे कुछ याद आ रहा है? वैसे भी, आपने मेरे प्रश्न का उत्तर दिया है - यह डिज़ाइन द्वारा है। धन्यवाद! –

संबंधित मुद्दे