Radosgw object 命令以及伪文件夹

介绍

在 rgw 中,对创建的对象的命名有一定的规则,长度限制。

分析

rgw_rest.cc:1070

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// “The name for a key is a sequence of Unicode characters whose UTF-8 encoding
// is at most 1024 bytes long.”
// However, we can still have control characters and other nasties in there.
// Just as long as they’re utf-8 nasties.
int RGWHandler_ObjStore::validate_object_name(const string& object)
{
int len = object.size();
if (len > 1024) {
// Name too long
return -ERR_INVALID_OBJECT_NAME;
}

if (check_utf8(object.c_str(), len)) {
// Object names must be valid UTF-8.
return -ERR_INVALID_OBJECT_NAME;
}
return 0;
}
}

object 的名字通过 rest 传过来是需要编码成 utf8,所以这里的 len指的是 utf8 的字节数,字节数不能超过 1024。

在 utf8 中每个字母数字1个字节,大多数汉字每个占3个字节。

伪文件夹

在 rgw 中是没有文件夹的概念的,但是可以通过对对象的命名通过字符/来分割,然后对对象进行分类分层就可以视作文件夹;

若是仅创建一个文件夹,其实质也是一个对象,其命名如 folder/,且该对象 Content-Length: 0;

举个例子:

1
2
3
4
folder1/
-—object1
-—folder2/
-—folder3/object2

在上面的目录结构中存在的对象有如下4个:

1
2
3
4
folder1/
folder1/object1
folder1/folder2/
folder1/folder3/object2

上级文件夹与下级文件没有实质性的关系,如文件夹 /folder1/ 与 文件夹/folder1/folder2/,两者是相互独立的对象,只是第二个文件夹名字前缀是第一个文件夹的名字。

这里牵涉到命名长度的问题了:

  • 若全使用字母数字,则最大长度为 1024-1(字符’/‘) = 1023;
  • 若全是用汉字,则最大长度为 (1024-1)/3 = 341;

所以无论多少级文件夹(对象名字中有多少个’/‘),只要保证对象名字的字节数不大于 1024 即可。