Plone将Blob数据迁移到"浓密"布局IOError Errno 21

rai*_*n2o 2 python plone zodb

我正在尝试将我们的blobstorage(使用Plone 4.3.2和ZODB3 3.10.5)从"草坪"迁移到"浓密"布局.在运行脚本时,我得到以下回溯:

(11719) Blob directory `var/blobstorage-lawn/` has layout marker set. Selected `lawn` layout.
(11719) The `lawn` blob directory layout is deprecated due to scalability issues on some file systems, please consider migrating to the `bushy` layout.
Migrating blob data from `var/blobstorage-lawn/` (lawn) to `var/blobstorage` (bushy)
Traceback (most recent call last):
  File "bin/migrateblobs", line 19, in <module>
    sys.exit(ZODB.scripts.migrateblobs.main())
  File "/var/db/zope/plone43_dev/buildout-cache/eggs/ZODB3-3.10.5-py2.7-linux- x86_64.egg/ZODB/scripts/migrateblobs.py", line 77, in main
    migrate(source, dest, options.layout)
  File "/var/db/zope/plone43_dev/buildout-cache/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/scripts/migrateblobs.py", line 52, in migrate
    link_or_copy(source_file, dest_file)
  File "/var/db/zope/plone43_dev/buildout-cache/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/scripts/migrateblobs.py", line 30, in link_or_copy
    shutil.copy(f1, f2)
  File "/var/db/zope/plone43_dev/Python-2.7/lib/python2.7/shutil.py", line 119, in copy
    copyfile(src, dst)
  File "/var/db/zope/plone43_dev/Python-2.7/lib/python2.7/shutil.py", line 82, in copyfile
    with open(src, 'rb') as fsrc:
IOError: [Errno 21] Is a directory: '/var/db/zope/plone43_dev/zeocluster/var/blobstorage-lawn/0x00/0x00'
Run Code Online (Sandbox Code Playgroud)

我不明白它为什么要复制一个目录.这是产品中的错误吗?或者我的blobstorage可能腐败吗?这是一个开发环境,我一直在与blobstorage有一些其他问题,这就是为什么我试图迁移到浓密,希望它能解决一些问题.

想法或解决方案?

Mar*_*ers 5

你似乎有一个浓密的布局与你的草坪布局混合在一起.

所述草坪布局使用平坦结构; 目录以OID命名,每个目录中只有 blob文件的修订版.在浓密的布局使用一个目录的OID每字节,导致目录树.

当从草坪移动到浓密的时候,脚本会在目录中假设它们是有效的OID,并且在每个脚本上都假定它在目录中找到的所有内容都是修订文件.

但是,你已经拥有了浓密的布局结构.该脚本正在尝试将目录0x00移出顶级目录0x00.这正是你在浓密的布局中找到的那种目录,而不是草坪布局.你的结构确实已经损坏了.

可能所有错误的是标记文件; 如果您在顶层拥有的是0xhh2位十六进制编号的目录,那么您只是一个伪装成草坪浓密布局.然后,您可以尝试更改目录中的文件,以查看您的ZODB是否仍然有效.如果没有,它可能无法修复..layoutvar/blobstorage-lawnlawnbushy

如果你有一个混合的0xhh和更长的0xhhhhhhhhh十六进制目录(后者只包含文件,没有目录),那么你设法将草坪浓密的布局放入一个blob存储.如果布局被标记为草坪,那么浓密的部分很可能已过时.您可以尝试将只有2个十六进制数字的所有目录移动到一个新blobstorage目录(并添加一个.layout包含内容的新文件bushy),但我不太确信它包含任何有用的内容.