上传文件
进入/etc/fdfs目录,有cp命令拷贝client.conf.sample,删除.sample后缀作为正式文件;
cd /etc/fdfs
cp client.conf.sample client.conf
mkdir -p /home/she/fastdfs/client
vi /etc/fdfs/client.conf
修改client.conf相关配置:
base_path=/home/she/fastdfs/client
tracker_server=10.122.149.211:22122 //tracker服务器IP地址和端口号
http.tracker_server_port=80 # tracker服务器的http端口号,必须和tracker的设置对应起来
新建一个测试文档test.txt
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf test.txt
返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

注意:trunk模式返回的fileid比非truak模式的要长,因此要存储大文件id以及偏移量。
fastdfs 获取文件信息源码分析
/usr/bin/fdfs_file_info /etc/fdfs/storage.conf group1/M00/00/00/CwxzyV7Cmc2AXaU6AAAABTu5NcY812.txt
查看源码 fdfs_file_info.c
debug跟踪源码
gdbserver :1234 /usr/bin/fdfs_file_info /etc/fdfs/storage.conf group1/M00/00/00/CwxzyV7Cmc2AXaU6AAAABTu5NcY812.txt
- 它是如何判断文件类型的?
if (IS_APPENDER_FILE(pFileInfo->file_size))
{
pFileInfo->file_type = FDFS_FILE_TYPE_APPENDER;
}
else if (IS_SLAVE_FILE(filename_len, pFileInfo->file_size))
{
pFileInfo->file_type = FDFS_FILE_TYPE_SLAVE;
}
else
{
pFileInfo->file_type = FDFS_FILE_TYPE_NORMAL;
}
可以看到,fastdfs把文件分成3类: appender文件、slave文件、正常文件。
具体它是如何判断这3各种类型文件的?代码如下
fastcommon
#define INFINITE_FILE_SIZE (256 * 1024LL * 1024 * 1024 * 1024 * 1024LL)
fastdfs
#define FDFS_APPENDER_FILE_SIZE INFINITE_FILE_SIZE
#define IS_APPENDER_FILE(file_size) ((file_size & FDFS_APPENDER_FILE_SIZE)!=0)
#define IS_TRUNK_FILE(file_size) ((file_size&FDFS_TRUNK_FILE_MARK_SIZE)!=0)
#define IS_SLAVE_FILE(filename_len, file_size) \
((filename_len > FDFS_TRUNK_LOGIC_FILENAME_LENGTH) || \
(filename_len > FDFS_NORMAL_LOGIC_FILENAME_LENGTH && \
!IS_TRUNK_FILE(file_size)))
可以看到,它定义了INFINITE_FILE_SIZE 它表示
256 乘以 5 个1024 一个1024代表左移10位,总共左移50位。加了个LL,最终结果就是long long类型的,总共八字节,最大可以存储2∧64-1。
IS_APPENDER_FILE的判断:
把它重命名为FDFS_APPENDER_FILE_SIZE ,它与文件大小 file_size 进行按位运算。
定义了 appender文件的文件大小 就是个极大的数,因此它在判断是不是appender文件,就是用这个极大的数和文件file_size进行按位与(就是判断是否相等),其中 int64_t file_size。
IS_SLAVE_FILE的判断:
它是根据文件名和文件信息file_size同时判断,文件名长度大于trunk文件名长度或文件名长度大于正常文件名长度,并且根据file_size判断它不是TRUNK文件。
这里判断是不是trunk文件,和前面appender逻辑类似,它定义了FDFS_TRUNK_FILE_MARK_SIZE 一个数(512* 5个1024)判断file_size是否和它相等。
总结:作者定义宏 INFINITE_FILE_SIZE 是一个极大的数(256 * 5个1024)表示一个无穷大的文件大小。 appender文件 fileinfo记录的文件大小就是这个数。是否是appender文件就是根据 fileinfo记录的文件大小 是否是这个最大值进行判断。
源码根据文件类型,源ip地址决定是否从远端查询文件信息。如下,我们看到只有appender文件、slave文件才会 从tracker获取stotrage连接信息(tracker_get_connection_r),然后连接 storage 查询文件信息。
if (pFileInfo->file_type == FDFS_FILE_TYPE_SLAVE ||
pFileInfo->file_type == FDFS_FILE_TYPE_APPENDER ||
(*(pFileInfo->source_ip_addr) == '\0' && get_from_server))
{ //slave file or appender file
if (get_from_server)
{
ConnectionInfo *conn;
TrackerServerInfo trackerServer;
conn = tracker_get_connection_r(&trackerServer, &result);
if (result != 0)
{
return result;
}
result = storage_query_file_info(conn,
NULL, group_name, remote_filename, pFileInfo);
tracker_close_connection_ex(conn, result != 0 &&
result != ENOENT);
pFileInfo->get_from_server = true;
return result;
}
else
{
pFileInfo->get_from_server = false;
pFileInfo->file_size = -1;
return 0;
}
}
else //master file (normal file)
{
pFileInfo->get_from_server = false;
if ((pFileInfo->file_size >> 63) != 0)
{
pFileInfo->file_size &= 0xFFFFFFFF; //low 32 bits is file size
}
else if (IS_TRUNK_FILE(pFileInfo->file_size))
{
pFileInfo->file_size = FDFS_TRUNK_FILE_TRUE_SIZE( \
pFileInfo->file_size);
}
pFileInfo->crc32 = buff2int(buff+sizeof(int)*4);
}
fastdfs-文件信息/文件类型
public static final short FILE_TYPE_NORMAL = 1;
public static final short FILE_TYPE_APPENDER = 2;
public static final short FILE_TYPE_SLAVE = 4;
protected short file_type;
protected String source_ip_addr;
protected long file_size;
protected Date create_timestamp;
protected int crc32;
public static final byte STORAGE_PROTO_CMD_UPLOAD_APPENDER_FILE = 23; //create appender file
public static final byte STORAGE_PROTO_CMD_APPEND_FILE = 24; //append file
public static final byte STORAGE_PROTO_CMD_MODIFY_FILE = 34; //modify appender file
public static final byte STORAGE_PROTO_CMD_TRUNCATE_FILE = 36; //truncate appender file
public static final byte STORAGE_PROTO_CMD_REGENERATE_APPENDER_FILENAME = 38; //rename appender file to normal file
总结: fastdfs把文件分成3类: appender文件、slave文件、正常文件。
什么是主从文件?
主从文件是指文件ID有关联的文件,一个主文件可以对应多个从文件。
主文件ID = 主文件名 + 主文件扩展名
从文件ID = 主文件名 + 从文件后缀名 + 从文件扩展名
使用主从文件的一个典型例子:以图片为例,主文件为原始图片,从文件为该图片的一张或多张缩略图。
FastDFS中的主从文件只是在文件ID上有联系。FastDFS server端没有记录主从文件对应关系,因此删除主文件,FastDFS不会自动删除从文件。
删除主文件后,从文件的级联删除,需要由应用端来实现。
主文件及其从文件均存放到同一个group中。
主从文件的生成顺序:
1)先上传主文件(如原文件),得到主文件ID
2)然后上传从文件(如缩略图),指定主文件ID和从文件后缀名(当然还可以同时指定从文件扩展名),得到从文件ID。
本文详细分析了FastDFS中文件信息的获取,特别是文件类型的判断,包括appender文件、slave文件和正常文件。通过对源码的解读,揭示了如何通过文件大小和文件名来判断不同类型的文件,并介绍了主从文件的概念及其在FastDFS中的应用场景。
759

被折叠的 条评论
为什么被折叠?



