clob存base64文件存不进去_cephfs:文件的扩展属性xattr
默认扩展属性
在cephfs中,文件/目录有两个默认的扩展属性:layout和parent,该扩展属性并不是InodeStoreBase中的xattrs。为了不和InodeStoreBase中的扩展属性混淆,我把这两个属性称为默认扩展属性,可以通过命令查看默认扩展属性:
元数据池:cephfs_metadata
数据池:cephfs_data
查看目录test_dir( inode号为0x100000f3677)的默认扩展属性
rados listxattr 100000f3677.00000000 -p cephfs_metadata
查看文件test_file(inode号为0x100000f3a68)的默认扩展属性
rados listxattr 100000f3a68.00000000 -p cephfs_metadata
目录的默认扩展属性存于元数据池中,文件的默认扩展属性存于数据池中。
这里得注意,即使是空文件,也会在数据池中存有该文件对象。
默认扩展属性内容
通过命令查看默认扩展属性内容,查看test_dir的默认扩展属性
rados getxattr 100000f3677.00000000 layout -p cephfs_metadata
rados getxattr 100000f3677.00000000 parent -p cephfs_metadata
结果查出来的都有乱码,直接看代码CInode::store_backtrace,去看具体存的内容
void CInode::store_backtrace(MDSInternalContextBase *fin, int op_prio)
{
...
const int64_t pool = get_backtrace_pool();
inode_backtrace_t bt;
build_backtrace(pool, bt);
bufferlist parent_bl;
using ceph::encode;
encode(bt, parent_bl);
ObjectOperation op;
op.priority = op_prio;
op.create(false);
op.setxattr("parent", parent_bl);
bufferlist layout_bl;
encode(inode.layout, layout_bl, mdcache->mds->mdsmap->get_up_features());
op.setxattr("layout", layout_bl);
...
}
parent里面的内容在CInode::build_backtrace中填充
void CInode::build_backtrace(int64_t pool, inode_backtrace_t& bt)
{
bt.ino = inode.ino;
bt.ancestors.clear();
bt.pool = pool;
CInode *in = this;
CDentry *pdn = get_parent_dn();
while (pdn) {
CInode *diri = pdn->get_dir()->get_inode();
bt.ancestors.push_back(inode_backpointer_t(diri->ino(), pdn->get_name(), in->inode.version));
in = diri;
pdn = in->get_parent_dn();
}
...
}
可见parent中存的是自己祖先目录的inode号和目录名。
比如"test_file"文件
路径/test/test1/test_file
"/"根目录的inode号:0x1,"test"的inode号为:0x10000000001,"test1"的inode号为:0x1000000002
那么inode_backtrace_t 中的ancestors存的就是[0x1000000002/test_file, 0x10000000001/test1, 0x1/test]
layout里面的内容存的就是inode.layout,即file_layout_t结构体,可以通过另外的方式去查看layout的值
getfattr -n ceph.file.layoput /test/test1/test_file
结果如图
...