fastdfs-获取文件信息源码分析(文件类型判断)

本文详细分析了FastDFS中文件信息的获取,特别是文件类型的判断,包括appender文件、slave文件和正常文件。通过对源码的解读,揭示了如何通过文件大小和文件名来判断不同类型的文件,并介绍了主从文件的概念及其在FastDFS中的应用场景。

上传文件

进入/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
  1. 它是如何判断文件类型的?
    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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值