CN101710341B - 一种透明、通用的文件缓存系统 - Google Patents

一种透明、通用的文件缓存系统 Download PDF

Info

Publication number
CN101710341B
CN101710341B CN2009102436781A CN200910243678A CN101710341B CN 101710341 B CN101710341 B CN 101710341B CN 2009102436781 A CN2009102436781 A CN 2009102436781A CN 200910243678 A CN200910243678 A CN 200910243678A CN 101710341 B CN101710341 B CN 101710341B
Authority
CN
China
Prior art keywords
module
message
function
caching
file
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN2009102436781A
Other languages
English (en)
Other versions
CN101710341A (zh
Inventor
肖利民
徐威
张伟
余彬彬
李秀桥
肖育前
阮利
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
XFusion Digital Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN2009102436781A priority Critical patent/CN101710341B/zh
Publication of CN101710341A publication Critical patent/CN101710341A/zh
Application granted granted Critical
Publication of CN101710341B publication Critical patent/CN101710341B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及一种文件缓存系统,特别是涉及一种透明、通用的文件缓存系统。系统由核心模块、配置管理模块、消息队列管理模块、通信模块和缓存操作模块,共五个模块组成。整个系统采用单进程多线程的模型,其中核心模块、配置管理模块位于线程0中运行,通信模块位于线程1中运行,缓存操作模块位于线程2中运行,消息队列管理模块为全局共享。系统由核心模块负责读取配置信息并初始化其它功能模块。通过消息队列管理模块,其它功能模块能够实现对消息队列的互斥访问和存取。系统通过通信模块与客户进行通信,接收缓存消息,并交由缓存操作模块处理,然后将处理结果返回给客户。本发明通过应用链接修改技术,能够高效地实现文件缓存操作。其次,应用链接修改技术,系统对应用提供高透明性。再次,模块化的设计与良好的用户接口,使系统具有良好的通用性。

Description

一种透明、通用的文件缓存系统
技术领域
本发明涉及一种文件缓存系统,特别是涉及一种透明、通用的文件缓存系统。本发明属于计算机技术领域。 
背景技术
目前,随着计算机技术与互联网的飞速发展,用户对应用的需求已不仅仅限于功能方面,对应用的性能需求逐渐成为了影响用户体验的主要因素。 
对于企业网站来说,如何为来自全球的用户提供快速稳定和高质量的网站体验,以提升用户满意度和提高收入对企业而言是一个具有战略性意义的重要课题。美国Gomez网络公司曾做过一个2000个用户的调查,结果显示,当一个网站响应速度很慢时,50%的用户会放弃访问而转向竞争对手的网站。而随着电子商务逐渐普及,如何为用户提供高速的购买流程也将直接影响到用户体验。有研究表明,当用户的购买流程失败了三次以上时,94%的用户会选择永远放弃这个网站。而更严重的是,近五成的用户会将这种不好的体验告诉5个以上朋友或同事。根据OMD的最新调查,网页负载时间与bounce rate存在的密切关系。随着负载时间延长,bounce rate会不断增加。因此,提高页面的下载速度将有助于降低bounce rate。 
近年来,以提升网站系统性能为目标,大量的技术与相关研究被提出与应用。其中,文件缓存技术,作为一种改善网站系统的性能的技术方案,今年来得到了广泛的应用。它通过对高访问频率的文件进行缓存,提高热点文件的主存Cache命中率,提升访问速度,减小访问延迟。 
目前,文件缓存技术被广泛使用于Web服务器应用中。典型的代表有:基于Apache的mod_proxy反向代理系统、Web代理与缓存服务器系统Squid、HTTP与反向代理服务器系统Nginx、HTTP服务加速系统Varnish、分布式缓存系统Memcached和分布式的对象存储缓存系统NCache等。通过在Web服务器集群前端部署缓存服务器,将文件缓存到缓存服务器的磁盘中,并进行集中的组织管理,提升热点文件的主存Cache命中率,从而提高文件的访问速度。 
综观这些Web服务器系统对文件缓存技术的实现与应用,普遍存在以下几个问题:1)依靠专门的硬件构建缓存服务器,成本较高;2)缓存的文件依旧存储在缓存服务器的磁盘中,磁盘访问性能依旧较低;3)缓存服务器的主存Cache命中率仍旧无法保证;4)各系统均采用各自的缓存实现方案且与应用系统本身相关联,不具有通用性,无法被别的应用重用。
另外,对文件缓存的需求并不仅仅停留在Web应用上,大量的桌面应用同样可以利用文件缓存技术提升性能。而前面所提到的诸多系统,虽然均实现并应用了某种文件缓存技术,但各系统的实现存在较大差别,且均与系统本身紧耦合,不具有通用性。 
发明内容
1.目的 
本发明的目的在于提供一种透明、通用的文件缓存系统。该系统有两个主要的特征:1)高效性,能够高效地进行缓存操作,同时为应用提供高效的服务;2)透明性,缓存系统对应用具有高透明性,从而,应用不需经过修改就能够应用本缓存系统,提升性能;3)通用性,模块化设计与良好的用户接口,使系统能够应用于各类缓存应用场景中,且易于与其他系统集成。 
2.技术方案 
本发明一种透明、通用的文件缓存系统,它包括核心模块、配置管理模块、消息队列管理模块、通信模块和缓存操作模块,共五个模块组成,参见图1. 
核心模块是系统首先启动的模块,它的主要功能包括:1)和配置管理模块交互,载入用户配置;2)为其他模块创建运行所需的子线程;3)初始化消息队列管理模块、缓存操作模块、通信模块;4)启动、停止消息队列管理模块、缓存操作模块、通信模块;5)接收并处理来自命令行的命令。 
配置管理模块的主要功能包括:1)读取并解析系统配置文件;2)将解析出的配置信息放入存储配置信息的相应数据结构中,方便后续的访问与操作;3)为核心模块提供访问配置信息数据结构的访问器方法,防止对配置信息的修改。 
消息队列管理模块的主要功能包括:1)组织管理“待处理”缓存消息队列,为系统接收到的缓存操作消息提供缓冲机制,对用户提供较高的可用性;2)组织管理“已处理”缓存消息队列,使缓存消息的处理情况能够由缓存操作模块反馈给通信模块,从而将处理情况反馈给客户;3)为位于不同线程中的其它模块提供互斥访问消息队列的接口。 
缓存操作模块是整个缓存系统最重要的功能模块,其主要功能包括:1)接收、解析缓存操作消息;2)根据缓存操作消息,采用链接修改技术,在内存文件系统中执行文件的缓存建立、缓存删除、缓存状态查询功能。 
通信模块是整个缓存系统与用户进行交互的界面,其主要功能包括:1)与用户建立通信连接;2)接收用户提交的缓存操作消息;3)将缓存操作消息通过消息队列管理模块加入消息队列中;4)将缓存操作的结果及消息队列的状态返回给用户。 
整个系统采用单进程多线程的模型,参见图2。其中核心模块、配置管理模块位于线程0中运行,通信模块位于线程1中运行,缓存操作模块位于线程2中运行,消息队列管理模块为全局共享。 
系统首先启动核心模块,由核心模块启动配置管理模块,读取并解析配置文件信息。接着,核心模块获取配置信息,并用这些配置信息调用消息队列管理模块、通信模块、缓存操作模块的模块初始化函数,启动这些模块。 
系统由消息队列管理模块负责维护“待处理”和“已处理”两个消息队列。通过内部的互斥访问锁及对外提供的访问接口,为其它模块提供消息队列的互斥访问和存取机制。 
通信模块负责与客户间的通信。模块启动后,将等待来自客户的连接请求。一旦连接建立,通信模块就创建子线程,并启动消息接收循环,准备接收来自用户的消息。当消息到来,通信模块通过调用消息队列管理模块的访问函数,将接收到的消息加入到“待处理”消息队列中。然后,通信模块从“已处理”消息队列中取出缓存消息,将其发送回客户端。 
缓存操作模块负责根据缓存操作消息,执行缓存操作。模块启动后,将创建子线程,并启动缓存消息操作循环。每次循环将依次完成从“待处理”消息队列中取出一个消息,解析消息,调用相应的缓存操作子程序完成缓存操作任务,最后将处理后的消息加入到“已处理”消息队列中。 
3.优点及功效 
本发明一种透明、通用的文件缓存系统,其优点及功效是:1)该系统利用内存文件系统组织存放缓存文件,直接保证服务器的主存Cache命中率,避免了访问磁盘带来的性能开销,显著地提高应用的缓存访问性能;2)本系统是一个独立的文件缓存系统,所有希望使用文件缓存技术的应用都作为其用户,缓存系统通过定义良好的协议与接口与应用交互,缓存系统具有较好的通用性;3)系统使用了基于链接修改的缓存技术,一方面保证了文件缓存过程的高效性,降低其带来的性能开销;另一方面巧妙地实现了对应用系统的透明性。 
附图说明
●图1:系统结构示意图 
●图2:系统运行结构示意图 
●图3:核心模块初始化流程 
●图4:核心模块清理流程 
●图5:配置文件示例 
●图6:消息队列管理模块初始化流程 
●图7:缓存操作模块初始化流程 
●图8:缓存操作模块清理流程 
●图9:缓存消息操作循环 
●图10:缓存添加流程 
●图11:缓存删除流程 
●图12:通信模块初始化流程 
●图13:通信模块清理流程 
●图14:通信模块消息循环流程 
●图15:缓存反馈消息发送流程 
图中符号说明如下: 
11核心模块;21配置管理模块;31消息队列管理模块; 
41通信模块;51缓存操作模块; 
1111~1119:核心模块初始化流程的步骤序号; 
5181~5184:核心模块清理流程的步骤序号; 
31101~31104:消息队列管理模块初始化流程的步骤序号; 
4141~4145:缓存操作模块初始化流程的步骤序号; 
4151~4154:缓存操作模块清理流程的步骤序号; 
4181~41812:缓存消息操作循环的步骤序号; 
41191~411920:缓存添加流程的步骤序号; 
41201~412033:缓存删除流程的步骤序号; 
5171~5179:通信模块初始化流程的步骤序号; 
5181~5184:通信模块清理流程的步骤序号; 
5191~51912:通信模块消息循环流程的步骤序号; 
51111~51116:缓存反馈消息发送流程的步骤序号。 
具体实施方式
参见图1、图2.本发明一种透明、通用的文件缓存系统,为一个单进程多线程的系统,它由核心模块11、配置管理模块21、消息队列管理模块31、通信模块41和缓存操作 模块51,共五个模块组成;其中: 
核心模块11、配置管理模块21位于线程0中运行,通信模块41位于线程1中运行,缓存操作模块51位于线程2中运行,消息队列管理模块31为全局共享。 
本发明所述的缓存系统运行于Linux操作系统,并且需要有内存文件系统Tmpfs提供文件缓存的底层支持。 
参见图1~图15本发明的一个具体实施例如下: 
1.核心模块11
本模块由四部分组成 
1)模块初始化函数111; 
2)模块清理函数112; 
3)命令处理函数113; 
各部分具体实现如下: 
1)模块初始化函数111
模块初始化函数111用于本模块启动时完成一系列初始化工作,参见图3其具体步骤如下: 
-步骤1111:调用配置管理模块21的初始化函数213启动该模块; 
-步骤1112:调用配置管理模块21的配置信息读取函数215,获取消息队列最大长度; 
-步骤1113:调用配置管理模块21的配置信息读取函数216,获取通信模块的监听端口号; 
-步骤1114:调用配置管理模块21的配置信息读取函数217,获取需缓存根路径; 
-步骤1115:调用配置管理模块21的配置信息读取函数218,获取缓存根路径; 
-步骤1116:调用消息队列管理模块31的初始化函数3110启动该模块; 
-步骤1117:调用通信模块51的初始化函数517启动该模块; 
-步骤1118:调用缓存操作模块41的初始化函数414启动该模块; 
-步骤1119:调用命令处理函数113,以接收、处理来自命令行的管理命令。 
2)模块清理函数112
模块清理函数112在命令处理函数113接收退出命令后执行,它用于本模块退出时完成一系列清理工作,参见图4。其具体步骤如下: 
-步骤1121:调用通信模块51的清理函数518停止该模块; 
-步骤1122:调用缓存操作模块41的清理函数415停止该模块; 
-步骤1123:调用消息队列管理模块31的清理函数3111停止该模块; 
-步骤1124:调用配置管理模块21的清理函数214停止该模块。 
3)命令处理函数113
命令处理函数113接收和处理来自命令行的管理命令。它在一个无限循环中等待来自命令行的输入,并对每个输入进行解析。如果检测到停止缓存系统命令,则结束循环,然后调用模块清理函数112。 
2.配置管理模块21
该模块由以下7个部分组成: 
1)配置信息结构211; 
2)配置信息结构指针212; 
3)模块初始化函数213; 
4)模块清理函数214; 
5)配置信息读取函数215216217218; 
6)配置载入函数219; 
7)系统配置文件2110。 
各部分具体实现如下: 
1)配置信息结构211
配置信息结构211包含如下4个字段: 
-消息队列最大长度,无符号短整型 
-监听端口号,无符号短整型 
-缓存根路径,字符型指针 
-需缓存根路,字符型指针 
其中,消息队列最大长度字段表示消息队列的最大长度;监听端口号字段表示通信模块监听的端口号;缓存根路径字段表示允许缓存的路径的根;需缓存根路径字段表示缓存文件存放的路径的根。 
2)配置信息结构指针212
配置信息结构指针212为配置信息结构211类型的指针,用于存取系统配置文件 2110获取的配置信息。 
3)模块初始化函数213
模块初始化函数213在模块启动时被调用,完成配置信息结构指针212的空间分配,然后调用配置载入函数219载入配置信息。 
4)模块清理函数214
模块清理函数214回收为配置信息结构指针212分配的空间。 
5)配置信息读取函数215216217218
配置信息读取函数共4个,分别是: 
-获取消息队列最大长度函数215
消息队列最大长度函数215返回消息队列最大长度,类型为无符号短整型。 
-获取监听的端口号216
监听端口号216返回监听端口号,类型为无符号短整型。 
-获取需缓存根路径217
需缓存根路径217返回需缓存根路径,类型为字符型指针。 
-获取缓存根路径218
缓存根路径218返回缓存根路径,类型为字符型指针。 
上述配置信息读取函数215216217218是配置管理模块21对外提供的接口,通过这四个函数,核心模块11能够方便地获取系统的配置信息,同时预防了配置文件2110的意外修改。 
6)配置载入函数219
配置载入函数219在初始化函数213中被调用,它读取并解析系统的配置文件 2110,然后将配置信息存储到由配置信息结构指针212指向的空间中,并返回给调用者。 
7)系统配置文件2110
系统配置文件2110是一个位于同一目录下的名为aclm.config的文本文件。其格式参见图5。 
3.消息队列管理模块31
该模块由以下11个部分组成: 
1)缓存操作消息结构311
2)消息队列项结构312; 
3)消息队列最大长度变量313; 
4)当前“待处理”消息队列长度变量314; 
5)“待处理”消息队列队头指针315; 
6)“待处理”消息队列互斥访问锁316; 
7)当前“已处理”消息队列长度变量317; 
8)“已处理”消息队列队头指针318; 
9)“已处理”消息队列互斥访问锁319; 
10)模块初始化函数3110; 
11)模块清理函数3111; 
12)消息队列操作函数31123113311431153116。 
本发明中,消息队列采用链表进行实现。各部分具体实现如下: 
1)缓存操作消息结构311
缓存操作消息结构311定义包含如下3个字段,及一个隐含字段: 
-缓存操作消息类型字段,无符号字符型 
-缓存操作消息状态字段,无符号字符型 
-缓存消息长度字段,无符号短整型 
-带操作的文件名字符串字段,隐含字段 
缓存操作消息类型字段表示缓存操作消息的类型,包括”缓存添加操作”和”缓存删除操作”。 
缓存操作消息状态字段用于表示本缓存操作消息的状态。用户向缓存系统发送缓存操作消息时,将该域设置为“待处理”状态。当缓存系统处理了该缓存操作消息后,将会设置该域。用户能够通过检查接收到的反馈消息中该域的值,判断缓存的工作情况。根据缓存操作的不同结果,该状态字段一共可以取下面这些状态值: 
-缓存添加终止,文件不可以缓存 
-缓存添加完成 
-缓存添加完成,文件已缓存 
-缓存添加终止,目标文件丢失 
-缓存添加终止,找不到文件 
-缓存删除完成 
-缓存删除完成,备份文件丢失 
-缓存删除完成,缓存文件丢失 
-缓存删除完成,链接文件丢失 
-缓存删除完成,链接文件、备份文件丢失 
-缓存删除完成,链接文件、缓存文件丢失 
-缓存删除终止,文件不可以缓存 
-缓存删除终止,链接文件丢失 
-缓存删除终止,常规链接文件 
-缓存删除失败,备份文件、缓存文件丢失 
-缓存删除失败,所有文件丢失 
-未知消息类型 
缓存消息长度字段用于提取该缓存消息的消息体。由于消息体的长度无法在编译时确定,因此消息体并没有采用显式的域表示,其紧跟在域缓存消息长度字段之后。因此,需要通过指针加偏移量的方式访问消息体。消息体中包含带操作的文件的完整路径名称。 
2)消息队列项结构312
消息队列项结构312定义了一个链表节点,其定义包含如下2个字段: 
-缓存操作消息字段,缓存操作消息结构311类型指针 
-链表下一结点指针字段,消息队列项结构312类型指针 
缓存操作消息字段为缓存操作消息结构311指针,将在缓存操作模块41中详细介绍。 
3)消息队列最大长度变量313
消息队列最大长度变量313为静态无符号短整型,在模块初始化函数3110中完成初始化,存储了从配置文件2110中得到的消息队列最大长度。它用于限制“待处理”队列与“已处理”队列的最大长度。 
4)当前“待处理”消息队列长度变量314
当前“待处理”消息队列长度变量314为静态无符号短整型,表示当前“待处理”消息队列的长度。 
5)“待处理”消息队列队头指针315
“待处理”消息队列队头指针315为静态消息队列项结构312类型的指针,指向“待处理”消息队列的队头,用于对“待处理”消息队列项的访问。 
6)“待处理”消息队列互斥访问锁316
“待处理”消息队列互斥访问锁316为静态pthread_mutex_t类型,它为“待处理” 消息队列提供互斥访问机制。消息队列操作函数31123113311431153116首先需要获取互斥锁316,如果成功,则执行队列操作,如果失败,则等待锁。 
7)当前“已处理”消息队列长度变量317
当前“已处理”消息队列长度变量317为静态无符号短整型,表示当前“已处理”队列的长度。 
8)“已处理”消息队列队头指针318
“已处理”消息队列队头指针318为静态消息队列项结构312类型的指针,指向“已处理”消息队列的队头,用于对“已处理”消息队列项的访问。 
9)“已处理”消息队列互斥访问锁319
“已处理”消息队列互斥访问锁319为静态pthread_mutex_t类型,它“已处理”消息队列提供互斥访问机制。消息队列操作函数31123113311431153116首先需要获取互斥锁319,如果成功,则执行队列操作,如果失败,则等待锁。 
10)模块初始化函数3110
模块初始化函数3110用于本模块启动时完成一系列初始化工作,该函数接收一无符号短整型参数,该参数说明消息队列最大长度,参见图6,其具体步骤如下: 
-步骤31101:根据参数,设置消息队列的最大长度变量313; 
-步骤31102:初始化“待处理”消息队列队头指针315; 
-步骤31103:初始化“已处理”消息队列队头指针318; 
-步骤31104:初始化“待处理”消息队列互斥访问锁316; 
-步骤31105:初始化“已处理”消息队列互斥访问锁319。 
11)模块清理函数3111
模块清理函数3111在模块退出时执行,负责清空“待处理”和“已处理”两个消息队列。 
12)消息队列操作函数31123113311431153116
消息队列操作函数共5个,分别是: 
-消息入队函数3112
消息入队函数3112将一个缓存操作消息加入到消息队列中,该函数接收两个参数,分别是待操作队列的标识和待入队的缓存操作消息结构311指针。 
-消息出队函数3113
消息出队函数3113从消息队列中取出一个缓存操作消息,该函数接收待操作 队列的标识参数,并返回取出的缓存操作消息结构311指针。 
-判断队列是否空函数3114
判断队列是否空函数3114判断指定的消息队列是否为空,该函数接收待操作队列的标识参数,如果队列空,返回1,否则返回0。 
-获取当前队列状态函数3115
获取当前队列状态函数3115用于获取指定的消息队列的状态,该函数接收待操作队列的标识参数,并返回当前队列长度,以及允许的最大长度。 
-清空队列函数3116
清空队列函数3116清空指定的消息队列,该函数接收待操作队列的标识参数。 
上述消息队列操作函数31123113311431153116是消息队列管理模块31向其它模块提供的接口,它能够提供对“待处理”和“已处理”两个消息队列的互斥访问。 
待操作队列的标识用于指定函数所要作用的消息队列,其可能为“待处理队列”和“已完成队列”。 
4.缓存操作模块41
该模块由以下20个部分组成: 
1)需缓存根路径变量411; 
2)缓存根路径变量412; 
3)消息循环状态变量413; 
4)模块初始化函数414; 
5)模块清理函数415; 
6)挂载内存文件系统函数416; 
7)卸载内存文件系统函数417; 
8)缓存消息操作循环函数418; 
9)检查文件是否可缓存函数419; 
10)提取相对路径函数4110; 
11)生成缓存路径函数4111; 
12)检查文件是否存在函数4112; 
13)检查文件是否为链接文件函数4113; 
14)获取链接文件的目标文件名函数4114; 
15)重命名文件函数4115; 
16)创建链接文件函数4116; 
17)删除文件函数4117; 
18)拷贝文件函数4118; 
19)添加缓存4119; 
20)删除缓存4120; 
各部分具体实现如下: 
1)需缓存根路径变量411
需缓存根路径变量411为静态字符型指针,它在模块初始化函数414中被初始化。它保存了可缓存的根路径,所有位于根路径下的所有文件可以被缓存,其余文件不可被缓存。提取相对路径函数4110需要使用该变量提取带缓存文件相对于需缓存根路径的相对路径。 
2)缓存根路径变量412
缓存根路径变量412为静态字符型指针,它在模块初始化函数414中被初始化。它保存了缓存的根路径,是内存文件系统的挂载点。生成缓存路径函数4111需要使用该变量及相对路径,生成缓存文件完整路径。 
3)消息循环状态变量413
消息循环状态变量413为静态整型,用于控制缓存消息操作循环函数418的执行状态,其可能取值为“消息循环启用”和“消息循环禁用”。 
4)模块初始化函数414
模块初始化函数414用于本模块启动时完成一系列初始化工作,其接收两个字符型指针参数,分别表示需缓存根路径与缓存根路径。参见图7,其具体步骤如下: 
-步骤4141:用参数初始化需缓存根路径变量411和缓存根路径变量412; 
-步骤4142:调用函数416挂载内存文件系统到缓存根路径变量412表示的路径下; 
-步骤4143:设置消息循环状态变量413为“缓存操作消息循环启用”; 
-步骤4144:创建子线程2; 
-步骤4145:在子线程2中开始执行缓存消息操作循环函数418。 
5)模块清理函数415
模块清理函数415在模块退出时完成一系列清理工作,参见图8,其具体步骤如下: 
-步骤4151:设置消息循环状态变量413为“缓存操作消息循环禁用”; 
-步骤4152:等待子线程2结束; 
-步骤4153:调用函数417卸载缓存根路径变量412表示的路径下的内存文件系统; 
-步骤4154:释放需缓存根路径变量411和缓存根路径变量412的内存空间。 
6)挂载内存文件系统函数416
内存文件系统是使用本发明必须使用的关键技术,它是缓存文件的存储位置。本发明可以使用多种常见的内存文件系统。本实施示例使用Tmpfs。 
挂载内存文件系统函数416接收一个字符型指针参数,表示缓存根路径。该函数在模块初始化函数414中被调用,用于挂载内存文件系统Tmpfs到缓存根路径参数表示的路径下。函数416中,使用操作系统的system()系统调用执行内存文件系统挂载命令,例如:mount tmpfs/cache/-t tmpfs-o size=128m。 
当使用其它内存文件系统时,需要将system()系统调用运行的命令做相应的替换。 
7)卸载内存文件系统函数417
卸载内存文件系统函数417接收一个字符型指针参数,表示缓存根路径。该函数在模块清理函数415中被调用,用于卸载已经挂载到缓存根路径参数表示的路径下的内存文件系统。 
8)缓存消息操作循环函数418
缓存消息操作循环函数418在子线程2中开始启动,负责执行缓存消息中指定的缓存操作,参见图9,其具体步骤如下: 
-步骤4181:开始无限循环; 
-步骤4182:检查消息循环状态变量413,如果为“缓存操作消息循环禁用”,则转向步骤41812,否则继续步骤4183; 
-步骤4183:调用消息队列管理模块31的消息出队函数3113从“待处理”消息队列中取出一个缓存操作消息; 
-步骤4184:如果成功获取缓存消息,则转向步骤4186;否则继续步骤4185; 
-步骤4185:等待10毫秒,然后转向步骤4183; 
-步骤4186:判断取出的缓存操作消息类型: 
■如果类型为”缓存删除操作”,则是缓存文件删除消息,转向步骤4187; 
■如果类型为”缓存添加操作”,则是缓存文件添加消息,转向步骤4188; 
■其他情况,转向步骤41810; 
-步骤4187:调用缓存删除函数4120,转向步骤4189; 
-步骤4188:调用缓存添加函数4119,转向步骤4189; 
-步骤4189:将函数返回值存入该缓存消息的状态域中,转向步骤41811; 
-步骤41810:设置该缓存消息的状态域为“未知消息类型”; 
-步骤41811:调用消息队列管理模块31的消息入队函数3112将该缓存消息加入“已处理”消息队列中,转向步骤4182; 
-步骤41812:结束循环。 
9)检查文件是否可缓存函数419
检查文件是否可缓存函数419接收一个字符型指针参数,表示待检查的文件名。函数通过将参数和需缓存根路径变量411表示的字符串进行比较,从而检查参数表示的文件是否位于系统的可缓存路径下。 
如果是,则返回1,表示可以缓存该文件;否则,返回0,表示不可以缓存该文件。 
10)提取相对路径函数4110
提取相对路径函数4110接收一个字符型指针参数,表示文件的完整路径名。函数通过在参数表示的完整路径名中截取除去需缓存根路径变量411表示的字符串的一个子串,作为待缓存对象的相对路径名,并返回该路径名字符串的指针。 
例如,参数为”/var/www/html/index.html”,需缓存根路径变量411为”/var/www/html/”,则函数4110将返回”index.html”。 
11)生成缓存路径函数4111
生成缓存路径函数4111接收一个字符型指针参数,表示文件的相对路径名。函数通过将参数表示的相对路径名与缓存根路径变量412表示的字符串进行拼接,生成完整的缓存文件路径名,并返回该路径名字符串的指针。 
例如,参数为”index.html”,缓存根路径变量412为”/cache/”,则函数4111将返回”/cache/index.html”。 
12)检查文件是否存在函数4112
检查文件是否存在函数4112接收一个字符型指针参数,表示待检查的文件名。函数通过系统调用access(const char *pathname,int mode)检查参数表示的文件是否存在。 
如果是,返回1;否则返回0。 
13)检查文件是否为链接文件函数4113
检查文件是否为链接文件函数4113接收一个字符型指针参数,表示待检查的文件名。函数通过系统调用lstat(const char *restrict pathname,struct stat*restrict buf)及系统宏S_ISLNK(),检查参数表示的文件是否存在。 
如果是,返回1;否则返回0。 
14)获取链接文件的目标文件名函数4114
获取链接文件的目标文件名函数4114接收一个字符型指针参数,表示待操作的链接文件名。函数通过系统调用readlink(const char *restrict pathname,char*restrict buf,size_t bufsize)获取链接文件参数指向的真实文件的完整路径名。 
如果成功,返回指向获取的路径名字符指针;否则,返回NULL。 
15)重命名文件函数4115
重命名文件函数4115接收两个字符型指针参数,分别表示旧文件名与新文件名。函数通过系统调用rename(const char *oldname,const char *newname)将旧文件名参数表示的文件重命名为新文件名参数表示的文件名。 
如果操作成功,返回1;否则返回0。 
16)创建链接文件函数4116
创建链接文件函数4116接收两个字符型指针参数,分别表示待创建的链接文件名与链接文件将指向的目标文件名。函数通过系统调用symlink(const char*actualpath,const char *sympath),创建由链接文件名参数指定的符号链接文件,该链接文件指向由目标文件名参数指定的文件。 
如果操作成功,返回1;否则返回0。 
17)删除文件函数4117
删除文件函数4117接收一个字符型指针参数,表示待删除的文件名。函数通过系统调用remove(const char *pathname)删除参数表示的文件。 
如果操作成功,返回1;否则返回0。 
18)拷贝文件函数4118
拷贝文件函数4118接收两个字符型指针参数,分别表示待拷贝的源文件名与目标文件名。函数通过系统调用system(const char *comstring)调用命令行cp命令,将参数表示的源文件拷贝生成参数表示的目标文件。 
如果操作成功,返回1;否则返回0。 
19)添加缓存函数4119
添加缓存函数4119接收一个字符型指针参数,表示待添加的缓存文件。参见图11,具体流程如下。为了步骤的叙述简便,用src_name表示待添加缓存的文件名,用cache_name表示存储在缓存中的缓存文件完整路径名,用ret表示用于保存需要返回的状态的变量。 
-步骤41191:调用函数419,检查待缓存文件是否位于需缓存根路径下,如果是,继续步骤41192;否则转到步骤41193; 
-步骤41192:设置状态变量ret为“缓存添加终止,文件不可以缓存”,然后转到步骤411920; 
-步骤41193:调用函数4110,提取待缓存文件的相对路径名,存到变量name中; 
-步骤41194:调用函数4111,生成缓存文件完整路径名,存到变量cache_name中; 
-步骤41195:调用函数4112,检查是否存在文件src_name,如果是,继续步骤41196;否则,转向步骤411919; 
-步骤41196:调用函数4113,检查文件src_name是否为链接文件,如果不是,继续步骤41197;否则,转向步骤411911; 
-步骤41197:调用函数4118,拷贝文件src_name到文件cache_name; 
-步骤41198:调用函数4115,将文件src_name重命名为src_name.aclm; 
-步骤41199:调用函数4116,创建链接文件src_name,指向文件cache_name; 
-步骤411910:设置状态变量ret为“缓存添加完成”,然后转到步骤411920; 
-步骤411911:调用函数4114,检查src_name是否指向cache_name,如果是,继续步骤411912;否则,转向步骤41198; 
-步骤411912:调用函数4112,检查是否存在文件cache_name,如果是,继续步骤 411913;否则,转向步骤411914; 
-步骤411913:设置状态变量ret为“缓存添加完成,文件已缓存”,然后转到步骤 411920; 
-步骤411914:调用函数4112,检查是否存在文件src_name.aclm,如果是,继续步骤411915;否则,转向步骤411917; 
-步骤411915:调用函数4118,拷贝文件src_name.aclm到文件cache_name; 
-步骤411916:设置状态变量ret为“缓存添加完成”,然后转到步骤411920; 
-步骤411917:调用函数4117,删除失效的链接文件src_name; 
-步骤411918:设置状态变量ret为“缓存添加终止,目标文件丢失”,然后转到步骤411920; 
-步骤411919:设置状态变量ret为“缓存添加终止,找不到文件”,然后转到步骤 411920
-步骤411920:本函数结束,返回状态变量ret。 
20)删除缓存函数4120
删除缓存函数4120接收一个字符型指针参数,表示待删除的缓存文件。参见图11,具体流程如下。为了步骤的叙述简便,用src_name表示待删除缓存的文件名,用cache_name表示存储在缓存中的缓存文件完整路径名,用ret表示用于保存需要返回的状态的变量。 
-步骤41201:调用函数419,检查文件src_name是否位于需缓存根路径下,如果是,继续步骤41202;否则转到步骤412015; 
-步骤41202:调用函数4110,提取待缓存文件的相对路径名,存到变量name中; 
-步骤41203:调用函数4111,生成缓存文件完整路径名cache_name; 
-步骤41204:调用函数4112,检查是否存在文件src_name,如果是,继续步骤41205;否则,转向步骤412023; 
-步骤41205:调用函数4113,检查文件src_name是否为链接文件,如果是,继续步骤41206;否则,转向步骤412016; 
-步骤41206:调用函数4114,检查文件src_name是否指向文件cache_name,如果是,继续步骤41207;否则,转向步骤412017; 
-步骤41207:调用函数4112,检查是否存在文件cache_name,如果是,继续步骤 41208;否则,转向步骤412018; 
-步骤41208:调用函数4117,删除文件src_name; 
-步骤41209:调用函数4118,拷贝文件cache_name到文件src_name; 
-步骤412010:调用函数4117,删除文件cache_name; 
-步骤412011:调用函数4112,检查是否存在文件src_name.aclm,如果是,继续步骤412012;否则,转向步骤412014; 
-步骤412012:调用函数4117,删除文件src_name.aclm; 
-步骤412013:设置状态变量ret为“缓存删除完成”,然后转到步骤412034; 
-步骤412014:设置状态变量ret为“缓存删除完成,备份文件丢失”,然后转到步骤412034; 
-步骤412015:设置状态变量ret为“缓存删除终止,文件不可以缓存”,然后转到步骤412034; 
-步骤412016:设置状态变量ret为“缓存删除终止,链接文件丢失”,然后转到步骤412034; 
-步骤412017:设置状态变量ret为“缓存删除终止,常规链接文件”,然后转到步骤412034; 
-步骤412018:调用函数4112,检查是否存在文件src_name.aclm,如果是,继续步骤412019;否则,转向步骤412023; 
-步骤412019:调用函数4117,删除文件src_name; 
-步骤412020:调用函数4118,拷贝文件src_name.aclm到文件src_name; 
-步骤412021:调用函数4117,删除文件src_name.aclm; 
-步骤412022:设置状态变量ret为“缓存删除完成,缓存文件丢失”,然后转到步骤412034; 
-步骤412023:设置状态变量ret为“缓存删除失败,备份文件、缓存文件丢失”,然后转到步骤412034; 
-步骤412024:调用函数4112,检查是否存在文件cache_name,如果是,继续步骤 412025;否则,转向步骤412030; 
-步骤412025:调用函数4118,拷贝文件cache_name到文件src_name; 
-步骤412026:调用函数4112,检查是否存在文件src_name.aclm,如果是,继续步骤412027;否则,转向步骤412029; 
-步骤412027:调用函数4117,删除文件src_name.aclm; 
-步骤412028:设置状态变量ret为“缓存删除完成,链接文件丢失”,然后转到步骤412034; 
-步骤412029:设置状态变量ret为“缓存删除完成,链接文件、备份文件丢失”,然后转到步骤412034; 
-步骤412030:调用函数4112,检查是否存在文件src_name.aclm,如果是,继续步骤412031;否则,转向步骤412033; 
-步骤412031:调用函数4118,拷贝文件src_name.aclm到文件src_name; 
-步骤412032:设置状态变量ret为“缓存删除完成,链接文件、缓存文件丢失”,然后转到步骤412034; 
-步骤412033:设置状态变量ret为“缓存删除失败,所有文件丢失”,然后转到步骤412034; 
-步骤412034:结束缓存从删除流程,返回状态变量ret。 
5.通信模块51
该模块由以下8个部分组成: 
1)消息队列状态通告结构511; 
2)监听端口号变量512; 
3)客户端地址结构变量513; 
4)消息循环状态变量514; 
5)监听套接字变量515; 
6)客户套接字变量516; 
7)模块初始化函数517; 
8)模块清理函数518; 
9)消息循环函数519; 
10)队列状态通告发送函数5110; 
11)缓存反馈消息发送函数5111。 
各部分具体实现如下: 
1)消息队列状态通告结构511
消息队列状态通告结构511定义包含如下两个字段: 
-消息队列待处理消息数量字段,无符号短整形 
-消息队列剩余大小字段,无符号短整型 
结构511定义了消息队列的状态通告结构。其中,消息队列待处理消息数量字段表示当前消息队列中待处理的消息数量,消息队列剩余大小字段表示当前消息队列中还可以容纳的消息数量。 
通信模块51将在“待处理”消息队列长度314分别达到消息队列最大长度313的80%,85%,90%,95%时,向用户发送消息队列状态通告511。当“待处理”消息队列长度314达到消息队列最大长度313时,通信模块51将丢弃该消息,并向用户发送队列已满的消息队列状态通告511。 
2)监听端口号变量512
监听端口号变量512为静态无符号短整型变量,在模块初始化函数517中完成初始化,用于保存通信模块51监听用户连接的端口号。 
3)客户端地址结构变量513
客户端地址结构变量513为静态sockaddr_in类型变量,在模块初始化函数517中被赋值,用于保存当前连接到系统的用户的地址信息。该地址信息在缓存反馈消息发送函数5111中需要使用。 
4)消息循环状态变量514
消息循环状态变量514为静态整型变量,用于控制消息循环函数519的执行状态,其可能取值为“消息循环启用”和“消息循环禁用”。 
5)监听套接字变量515
监听套接字变量515为静态socket类型变量,在模块初始化函数517中初始化,用于监听来自用户的连接。 
6)客户套接字变量516
客户套接字变量516为静态socket类型变量,在模块初始化函数517中初始化,在和用户建立连接后进行数据收发。 
7)模块初始化函数517
模块初始化函数517用于本模块启动时完成一系列初始化工作。函数接收一个无符号短整型参数,用于指定监听的端口号。参见图12,其具体步骤如下: 
-步骤5171:根据参数,设置监听端口号变量512; 
-步骤5172:设置消息循环状态变量514为“消息循环启动”; 
-步骤5173:调用socket创建监听套接字515; 
-步骤5174:调用bind将套接字515与监听端口号变量512指定的端口绑定; 
-步骤5175:调用listen启动监听套接字515监听; 
-步骤5176:调用accept等待客户端连接; 
-步骤5177:将accept返回的socket实例保存到客户套接字516中; 
-步骤5178:创建子线程1; 
-步骤5179:在子线程1中执行消息循环函数519开始消息循环。 
8)模块清理函数518
模块清理函数518在模块退出时完成一系列清理工作。参见图13,其具体步骤如 下: 
-步骤5181:设置消息循环状态变量514为“消息循环启用”; 
-步骤5182:等待子线程1结束; 
-步骤5183:关闭客户套接字516; 
-步骤5184:关闭监听套接字515。 
9)消息循环函数519
消息循环函数519在子线程1中开始启动,负责通信模块的消息接收、发送,参见图14,其具体步骤如下: 
-步骤5191:调用消息队列管理模块31的返回当前队列状态函数3115,获取当前队列的长度及最大运行的队列长度,并保存在临时变量current和max中; 
-步骤5192:开始无限循环; 
-步骤5193:检查消息循环状态变量514,如果为“消息循环禁用”,则转向步骤 51912,否则继续步骤5194; 
-步骤5194:调用recv从客户套接字516中接收数据; 
-步骤5195:根据current和max计算队列的使用情况,并做如下判断: 
■如果队列使用达到100%,转向步骤5196; 
■如果队列使用达到80%,85%,90%,95%,转向步骤5198; 
■其他情况,继续步骤5199; 
-步骤5196:丢弃本次接收到的消息; 
-步骤5197:构造队列状态通告消息511,调用队列状态通告发送函数5110向用户发送该通告消息,然后转向步骤51910; 
-步骤5198:构造队列状态通告消息511,调用队列状态通告发送函数5110向用户发送该通告消息; 
-步骤5199:调用消息队列管理模块31的消息入队函数3112将接收到的消息加入“待处理”消息队列中; 
-步骤51910:重新调用消息队列管理模块31的返回当前队列状态函数3115,获取当前队列的长度及最大运行的队列长度,并更新临时变量current和max; 
-步骤51911:调用缓存反馈消息发送函数5111发送反馈消息,然后转向步骤5193; 
-步骤51912:结束循环。 
10)队列状态通告发送函数5110
队列状态通告发送函数5110接收一个消息队列状态通告结构511类型的参数,调用send函数,将参数指向的队列状态通告511发送给连接到系统的用户。 
11)缓存反馈消息发送函数5111
缓存反馈消息发送函数5111负责向用户发送缓存反馈消息,参见图15,具体步骤如下: 
-步骤51111:调用消息队列管理模块31的返回当前队列状态函数3115; 
-步骤51112:将返回的队列状态中的当前队列长度的一半,作为需要出队的消息数量N; 
-步骤51113:调用消息队列管理模块31的消息出队函数3113,从“已处理”消息队列中取出一个缓存消息; 
-步骤51114:调用缓存反馈消息发送函数5111,将取出缓存消息依次发送给客户; 
-步骤51115:将N减1; 
-步骤51116:如果N大于0,则转向步骤51113;否则结束本函数。 

Claims (3)

1.一种透明、通用的文件缓存系统,它包括核心模块、配置管理模块、消息队列管理模块、通信模块和缓存操作模块,共五个模块:
核心模块是系统首先启动的模块,它的功能包括:1)和配置管理模块交互,载入用户配置;2)为其他模块创建运行所需的子线程;3)初始化消息队列管理模块、缓存操作模块、通信模块;4)启动、停止消息队列管理模块、缓存操作模块、通信模块;5)接收并处理来自命令行的命令;
配置管理模块的功能包括:1)读取并解析系统配置文件;2)将解析出的配置信息放入存储配置信息的相应数据结构中,方便后续的访问与操作;3)为核心模块提供访问配置信息数据结构的访问器方法,防止对配置信息的修改;
消息队列管理模块的功能包括:1)组织管理“待处理”缓存消息队列,为系统接收到的缓存操作消息提供缓冲机制,对用户提供较高的可用性;2)组织管理“已处理”缓存消息队列,使缓存消息的处理情况能够由缓存操作模块反馈给通信模块,从而将处理情况反馈给客户;3)为位于不同线程中的其它模块提供互斥访问消息队列的接口;
缓存操作模块是整个缓存系统最重要的功能模块,其功能包括:1)接收、解析缓存操作消息;2)根据缓存操作消息,采用链接修改技术,在内存文件系统中执行文件的缓存建立、缓存删除、缓存状态查询功能;
通信模块是整个缓存系统与用户进行交互的界面,其功能包括:1)与用户建立通信连接;2)接收用户提交的缓存操作消息;3)将缓存操作消息通过消息队列管理模块加入消息队列中;4)将缓存操作的结果及消息队列的状态返回给用户。
2.根据权利要求1所述的一种透明、通用的文件缓存系统,特征在于:整个系统采用单进程多线程的模型,其中核心模块、配置管理模块位于线程0中运行,通信模块位于线程1中运行,缓存操作模块位于线程2中运行,消息队列管理模块为全局共享。
3.根据权利要求1所述的一种透明、通用的文件缓存系统,特征在于:系统首先启动核心模块,由核心模块启动配置管理模块,读取并解析配置文件信息;接着,核心模块获取配置信息,并用这些配置信息调用消息队列管理模块、通信模块、缓存操作模块的模块初始化函数,启动这些模块;
系统由消息队列管理模块负责维护“待处理”和“已处理”两个消息队列,通过内部的互斥访问锁及对外提供的访问接口,为其它模块提供消息队列的互斥访问和存取机制;
通信模块负责与客户间的通信,模块启动后,将等待来自客户的连接请求,一旦连接建立,通信模块就创建子线程,并启动消息接收循环,准备接收来自用户的消息;当消息到来,通信模块通过调用消息队列管理模块的访问函数,将接收到的消息加入到“待处理”消息队列中,然后,通信模块从“已处理”消息队列中取出缓存消息,将其发送回客户端;
缓存操作模块负责根据缓存操作消息,执行缓存操作;模块启动后,将创建子线程,并启动缓存消息操作循环;每次循环将依次完成从“待处理”消息队列中取出一个消息,解析消息,调用相应的缓存操作子程序完成缓存操作任务,最后将处理后的消息加入到“已处理”消息队列中。
CN2009102436781A 2009-12-22 2009-12-22 一种透明、通用的文件缓存系统 Active CN101710341B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2009102436781A CN101710341B (zh) 2009-12-22 2009-12-22 一种透明、通用的文件缓存系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2009102436781A CN101710341B (zh) 2009-12-22 2009-12-22 一种透明、通用的文件缓存系统

Publications (2)

Publication Number Publication Date
CN101710341A CN101710341A (zh) 2010-05-19
CN101710341B true CN101710341B (zh) 2012-08-08

Family

ID=42403131

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2009102436781A Active CN101710341B (zh) 2009-12-22 2009-12-22 一种透明、通用的文件缓存系统

Country Status (1)

Country Link
CN (1) CN101710341B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103399856B (zh) * 2013-07-01 2017-09-15 北京科东电力控制系统有限责任公司 面向scada系统的爆发式数据缓存处理系统及其方法
CN106936623A (zh) * 2015-12-31 2017-07-07 五八同城信息技术有限公司 分布式缓存系统及缓存集群的管理方法
CN108733494A (zh) * 2018-04-28 2018-11-02 南京理工大学 一种实时显示并自动保存高速多通道采集卡数据的方法
CN113468127A (zh) * 2020-03-30 2021-10-01 同方威视科技江苏有限公司 数据缓存方法、装置、介质及电子设备

Also Published As

Publication number Publication date
CN101710341A (zh) 2010-05-19

Similar Documents

Publication Publication Date Title
US8645973B2 (en) Mobile applications
RU2507567C2 (ru) Многопользовательское сетевое сотрудничество
US9009104B2 (en) Checkpoint-free in log mining for distributed information sharing
US20120096043A1 (en) Data graph cloud system and method
US11068536B2 (en) Method and apparatus for managing a document index
CN110765187A (zh) 一种数据源路由管理方法和装置
CN101710341B (zh) 一种透明、通用的文件缓存系统
US8407713B2 (en) Infrastructure of data summarization including light programs and helper steps
RU2452017C2 (ru) Обработка форматированных сообщений с использованием карты сообщения
CN111831461A (zh) 一种处理业务流程的方法和装置
Nabi Pro Spark Streaming: The Zen of Real-Time Analytics Using Apache Spark
CN110968340A (zh) 一种实现多版本依赖隔离的方法和装置
CN110764796A (zh) 更新缓存的方法和装置
US20120143866A1 (en) Client Performance Optimization by Delay-Loading Application Files with Cache
US8463744B2 (en) Method and system for synchronizing data
Gittens et al. Alchemist: An Apache Spark⇔ MPI interface
Konishetty et al. Implementation and evaluation of scalable data structure over hbase
CN107643892B (zh) 接口处理方法、装置、存储介质和处理器
US20100332604A1 (en) Message selector-chaining
KR101694301B1 (ko) 스토리지 시스템의 파일 처리 방법 및 그 방법에 따른 데이터 서버
CN113779122B (zh) 导出数据的方法和装置
Zagarese et al. Enabling advanced loading strategies for data intensive web services
JP2014041501A (ja) バッチ処理対象データの高速読込み方法及びバッチ管理システム
Perihelion Software Ltd The Helios operating system
CN113077201A (zh) 一种解析业务参数的方法、装置和系统

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
ASS Succession or assignment of patent right

Owner name: HUAWEI TECHNOLOGY CO LTD

Free format text: FORMER OWNER: BEIJING AERONAUTICS AND ASTRONAUTICS UNIV.

Effective date: 20110926

C41 Transfer of patent application or patent right or utility model
COR Change of bibliographic data

Free format text: CORRECT: ADDRESS; FROM: 100191 HAIDIAN, BEIJING TO: 518129 SHENZHEN, GUANGDONG PROVINCE

TA01 Transfer of patent application right

Effective date of registration: 20110926

Address after: 518129 headquarter office building of Bantian HUAWEI base, Longgang District, Shenzhen, Guangdong, China

Applicant after: Huawei Technologies Co., Ltd.

Address before: 100191 School of computer science and engineering, Beihang University, Xueyuan Road 37, Beijing, Haidian District

Applicant before: Beihang University

C14 Grant of patent or utility model
GR01 Patent grant
TR01 Transfer of patent right

Effective date of registration: 20220114

Address after: 450046 Floor 9, building 1, Zhengshang Boya Plaza, Longzihu wisdom Island, Zhengdong New Area, Zhengzhou City, Henan Province

Patentee after: Super fusion Digital Technology Co.,Ltd.

Address before: 518129 headquarters building of Bantian HUAWEI base, Longgang District, Guangdong, Shenzhen

Patentee before: HUAWEI TECHNOLOGIES Co.,Ltd.

TR01 Transfer of patent right