2013-03-27 158 views
1

我使用Google App Engine blobstore來保存一組用戶數據 - 從幾百字節到幾百KB的大小。 blob_info作爲數據存儲實體上的屬性保存。Google App Engine blobstore錯誤:BlobNotFoundError

偶爾在生產中,blobstore的讀取操作將失敗,並顯示BlobNotFoundError('',)。這個例外沒有提供任何細節,我不知道爲什麼發生故障。

根據谷歌的文檔:

「如果斑點確實不是指實際的Blobstore值,則fetch_data提出了BlobNotFoundError。」 https://developers.google.com/appengine/docs/python/blobstore/functions#fetch_data

「fetch_data()函數找不到與給定的BlobInfo或BlobKey值相對應的Blobstore值。」 https://developers.google.com/appengine/docs/python/blobstore/exceptions#BlobNotFoundError

最令人費解的是,這些故障是間歇性的。

下面是我讀取/寫入blobstore的代碼。只有在blob_info(從數據存儲讀取)不是None時才嘗試讀取。

有什麼建議嗎?

def read(blob_info): 
    blob_reader = blobstore.BlobReader(blob_info.key(), buffer_size=358400) 
    try: 
     data = blob_reader.read() 
    finally: 
     blob_reader.close() 

    return data 


def write(data, mime_type): 
    file_name = files.blobstore.create(mime_type=mime_type) 

    with files.open(file_name, 'a') as f: 
     f.write(data) 

    files.finalize(file_name) 

    blob_key = files.blobstore.get_blob_key(file_name) 

    # This is a hack to handle an apparent GAE delay synchronizing the blobstore 
    for i in range(1,3): 
     if blob_key: 
      break 
     else: 
      time.sleep(0.05) 
      blob_key = files.blobstore.get_blob_key(file_name) 

    new_blob_info = blobstore.BlobInfo.get(str(blob_key)) 

    return new_blob_info 

回答

0

我認爲你的GAE延遲破解運行三次沒有成功,給出blob_key值None。在線路

new_blob_info = blobstore.BlobInfo.get(str(blob_key))

str(blob_key)將轉變爲「無」,即含有詞語無字符串。所以你用一個鍵返回一個blob_info,它只包含'None'這個詞。

您可以通過在循環後檢查顯式None來快速修復它。

適當的修復方法是以某種方式避免競爭條件,但我不知道爲什麼會發生;你的代碼對我來說很正常。我在Java上做了大致相同的工作,似乎工作正常。請記住,blobstore文件支持是實驗性的,並沒有很好的記錄。您能否重做您的代碼以使用原始blobstore API(即使用上傳網址)?