ConflictError
(この前の質問を参照) を調査しているときに、多くのpersistent.mapping.PersistentMapping
競合が発生しました。
特定のものを見ると、 の PersistentMapping であることが判明しましたplone.scale
。
画像が 1 つだけのランダム オブジェクトに562個のキーがあることがわかりました。競合エラーが発生するのも不思議ではありません...
この注釈を保持するオブジェクトに関するいくつかのコンテキストplone.scale
: - 器用さコンテンツ タイプ - その動作の 1 つにイメージ フィールドがあります ( plone.namedfile.field.NamedBlobImage
)
それを表示するコードは次のとおりです。
デバッグ インスタンスを開始します。./bin/instance debug
from ZODB.utils import p64
OID = 0x568428 # got from zeo client logs
mapping = app._p_jar[p64(OID)]
len(mapping) # that returns 562
神秘的な部分は、その永続的なマッピングの 4 つのキーのみがタプルであり、残りの 558 は単なるハッシュであることです。
plone.scale.storage.AnnotationStorage.scaleメソッドを簡単に見てみると、タプルからの 1 対 1 の関係のみが存在し、永続的なマッピングのキーがハッシュされることが暗示されているようです。
width
要素をさらに調査すると、実際、すべての要素のとプロパティを見ると、height
4 つの異なる組み合わせ (タプル自体の組み合わせ) しかないことがわかります。
変更時間が大きくなるたびに新しいスケールが生成され (上記の scale メソッドを参照)、plone.namedfield.scaling.ImageScaling.modifiedはコンテキストを変更のソースとして使用するため、オブジェクトが更新されるたびに新しいスケールが生成されますか?
したがって、前の例から 2 つの疑問が生じます。
4 つのスケールのみが実際に使用され、残りの 558 は古くて役に立たないという私の仮定は本当ですか?
前のものに「はい」と答えた場合、それらはクリーンアップされるべきではありませんか?