1

我使用 Google App Engine blobstore 来保存大量用户数据——大小从几百字节到几百 KB 不等。blob_info 保存为数据存储实体的属性。

有时,在生产环境中,从 blobstore 读取会失败并出现 BlobNotFoundError('',)。该异常没有提供任何细节,我无法弄清楚为什么会发生故障。

根据谷歌的文档:

“如果 blob 不引用实际的 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
4

1 回答 1

0

我认为你对 GAE 延迟的破解运行了三遍但没有成功,给 blob_key 的 value None。在行

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

str(blob_key)将转换为“None”,即包含单词 None 的字符串。因此,您正在返回一个带有键的 blob_info,它只包含单词“None”。

您可以通过在循环后检查显式 None 来快速修复它。

正确的解决方法是以某种方式避免竞争条件,但我不知道为什么会发生这种情况;你的代码对我来说看起来很正常。我在 Java 上做了大致相同的工作,它似乎工作正常。请记住,blobstore 文件支持是实验性的,并且没有很好的文档记录。您能否重新编写代码以使用原始 blobstore API(即使用上传 URL)?

于 2013-04-10T05:31:10.047 回答