在调查ConflictError
(see this previous question)时,我发现了很多persistent.mapping.PersistentMapping
次冲突。
查看特定的一个,结果证明是plone.scale
的PersistentMapping。
原来只有一个图像的随机对象上有 562 个键,难怪为什么会出现冲突错误......
包含此plone.scale
注释的对象的某些上下文:
- 灵巧内容类型
- 其中一个行为有一个图像字段(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方法似乎意味着在持久映射上只有一对一的关系来自元组和哈希键。
进一步研究这些元素后发现,实际上,如果从所有元素中查看width
和height
属性,则只有4种不同的组合(来自元组本身的组合)。
每当修改时间更大时(参见上面提到的比例方法)生成新的比例,plone.namedfield.scaling.ImageScaling.modified使用上下文作为修改的源,这意味着在对象的每次更新时都会出现新的比例会产生吗?
因此,前两个问题出现了:
我的假设只有4个刻度才真正使用而其他558是旧的无用是真的吗?
对前一个提供了肯定,那么它们不应该被清理掉吗?