1

我正在实现一个文件存储系统,其中多人可以共享上传到 blobstore 的文件,但是一旦他们都删除了文件,它就会从 blobstore 中删除。

我正在使用引用计数实体来执行此操作,当它的计数设置为 0 时该实体被删除。我还使用定义的 BlobInfo ndb 模型,google.appengine.ext.ndb.blobstore因为我需要在几个点获取一堆 BlobInfos 并希望能够异步执行此操作。

当引用计数实体被删除时,它的 _post_delete_hook 方法被调用,我使用 BlobKey 调用 blobstore.delete_async 并且它还在 ndb BlobInfo 实例上调用 BlobInfo._key.delete_async() 。

class FileCounter(ndb.Model):
    count = ndb.IntegerProperty(default=1)
    @classmethod
    def _post_delete_hook(cls, key, future):
        blob_key = cls.blob_key_for_key(key)
        blobinfo_extension.delete(blobstore.BlobInfo.get(blob_key))

并且 blobinfo_extension.delete 定义为:

@ndb.tasklet
def delete_async(blobinfo):
""" Delete both the blob info and the blob in the blobstore it refers to. """
    yield blobstore.delete_async(blobinfo.key()), blobinfo._key.delete_async()

def delete(blobinfo):
    delete_async(blobinfo).wait()

我正在获取计数实体,减少其计数,然后检查它是否为 0。如果为 0,则将其删除。这一切都在事务中完成。_post_delete_hook 方法是否在事务之外被调用?如您所见,它正在访问 BlobInfo 实体并删除需要跨组事务的实体。

我将尝试这个,看看它是否有效,但由于无法找到任何答案,我将它发布在这里,所以它可能会在未来对其他人有所帮助。

这是解决此问题的一个很好的解决方案,或者我应该在计数减少时“手动”清理 blobstore/blobinfo?我想也许我在滥用帖子删除钩子!

4

1 回答 1

2

也许您可以ndb.get_context().call_on_commit(<callback>)在事务提交时使用它来做一些工作?您可以将其与常规 _post_delete_hook 结合使用,后者只是为提交后清理步骤添加实体。

于 2012-11-30T18:21:44.763 回答