1

ブロブストアにアップロードされたファイルを複数の人が共有できるファイル ストレージ システムを実装していますが、全員がファイルを削除すると、ブロブストアから削除されます。

google.appengine.ext.ndb.blobstore参照カウント エンティティを使用してこれを行っています。これは、カウントが 0 に設定されると削除されます。いくつかのポイントで BlobInfo の束を取得する必要があるため、で定義されている BlobInfo ndb モデルも使用しています。それを非同期で行います。

参照カウント エンティティが削除されると、その _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 に答える