CN115657960A - 一种磁盘阵列初始化方法、装置、设备及可读存储介质 - Google Patents

一种磁盘阵列初始化方法、装置、设备及可读存储介质 Download PDF

Info

Publication number
CN115657960A
CN115657960A CN202211409857.XA CN202211409857A CN115657960A CN 115657960 A CN115657960 A CN 115657960A CN 202211409857 A CN202211409857 A CN 202211409857A CN 115657960 A CN115657960 A CN 115657960A
Authority
CN
China
Prior art keywords
sliding window
initialization
stripe
strip
window
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.)
Granted
Application number
CN202211409857.XA
Other languages
English (en)
Other versions
CN115657960B (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.)
Suzhou Inspur Intelligent Technology Co Ltd
Original Assignee
Suzhou Inspur Intelligent Technology 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 Suzhou Inspur Intelligent Technology Co Ltd filed Critical Suzhou Inspur Intelligent Technology Co Ltd
Priority to CN202211409857.XA priority Critical patent/CN115657960B/zh
Publication of CN115657960A publication Critical patent/CN115657960A/zh
Application granted granted Critical
Publication of CN115657960B publication Critical patent/CN115657960B/zh
Priority to PCT/CN2023/093312 priority patent/WO2024098698A1/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Human Computer Interaction (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Signal Processing For Digital Recording And Reproducing (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请公开了一种磁盘阵列初始化方法、装置、设备及可读存储介质,该方法包括:接收RAID阵列的初始化请求后,从条带首地址开始处设置滑动窗口;对当前滑动窗口对应的条带执行初始化任务;初始化完当前滑动窗口对应的条带后,移动滑动窗口;完成窗口移动后,返回执行对当前滑动窗口对应的条带执行初始化任务的步骤,直到初始化完RAID阵列的所有条带。在本申请中,在对RAID阵列的条带进行初始化时,基于滑动窗口进行处理,可以提升初始化速度,缩短整体的初始化时长。此外,由于每次仅处理一个滑动窗口对应的条带初始化任务,因而在紧急IO任务情况下,可以大大减低条带不一致风险概率。

Description

一种磁盘阵列初始化方法、装置、设备及可读存储介质
技术领域
本申请涉及存储技术领域,特别是涉及一种磁盘阵列初始化方法、装置、设备及可读存储介质。
背景技术
RAID(Redundant Array of Independent Disks)即独立磁盘组成的具有冗余性的阵列,由很多块独立的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。基于RAID,可实现将数据切割成许多区段,分别存放在各个硬盘上。
RAID阵列在创建好后,需要以条带为单元进行初始化。在初始化过程中,对条带的管理采用位图这种元数据组织方式进行。其中,位图数据结构中每个bit位代表一个条带,条带可以被设置和清除,但不能被赋值。这种元数据组织方式在大型大容量RAID阵列中,存在不足:位图元数据组织方式会占用大量资源空间,会导致大容量RAID阵列的初始化任务需要很长时间,导致用户体验下降,并且在前台紧急IO任务情况下,存在条带不一致风险。
综上所述,如何有效地解决RAID初始化等问题,是目前本领域技术人员急需解决的技术问题。
发明内容
本申请的目的是提供一种磁盘阵列初始化方法、装置、设备及可读存储介质,能够减少初始化内存占用,可以提高RAID初始化效率。
为解决上述技术问题,本申请提供如下技术方案:
一种磁盘阵列初始化方法,包括:
接收RAID阵列的初始化请求后,从条带首地址开始处设置滑动窗口;
对当前所述滑动窗口对应的条带执行初始化任务;
初始化完所述当前所述滑动窗口对应的条带后,移动所述滑动窗口;
完成窗口移动后,返回执行所述对当前所述滑动窗口对应的条带执行初始化任务的步骤,直到初始化完所述RAID阵列的所有条带。
优选地,从条带首地址开始处设置滑动窗口,包括:
申请三个无符号数据构建所述滑动窗口;所述三个无符号数据分别记录水位指针、窗口偏移量和条带标记;
将所述水位指针指向所述条带首地址开始处;
初始化所述窗口偏移量;
对所述条带标记进行赋值。
优选地,所述对所述条带标记进行赋值,包括:
从所述RAID阵列中的条带位图文件中,从首个条带开始,读取所述滑动窗口的窗口大小对应的多个条带分别对应的条带比特位标记;
利用各个所述条带比特位标记对所述条带标记进行赋值。
优选地,所述申请三个无符号数据构建所述滑动窗口,包括:
从电池备电单元保护的防掉电丢失数据的内存中申请所述无符号数据。
优选地,对当前所述滑动窗口对应的条带执行初始化任务,包括:
从所述条带标记中读取所述水位指针对应的目标条带标记;其中,所述目标条带标记为目标条带的标记;
若所述目标条带标记对应已初始化,则更新所述水位指针,直到确定初始化完所述当前所述滑动窗口对应的条带;
若所述目标条带标记对应未初始化,则对所述目标条带执行初始化任务,并在执行完所述初始化任务后,更新所述水位指针,直到确定初始化完所述当前所述滑动窗口对应的条带。
优选地,所述确定初始化完所述当前所述滑动窗口对应的条带,包括:
判断所述水位指针对应的水位偏移量是否等于所述滑动窗口的大小;
如果是,则确定初始化完所述当前所述滑动窗口对应的条带;
如果否,则确定未初始化完所述当前所述滑动窗口对应的条带。
优选地,所述确定初始化完所述当前所述滑动窗口对应的条带,包括:
判断所述条带标记中的各个标记是否均对应已初始化;
如果是,则确定初始化完所述当前所述滑动窗口对应的条带;
如果否,则确定未初始化完所述当前所述滑动窗口对应的条带。
优选地,移动所述滑动窗口,包括:
利用所述窗口偏移量,判断是否初始化完所述RAID阵列的所有条带;
如果否,则移动所述滑动窗口。
优选地,所述利用所述窗口偏移量,判断是否初始化完所述RAID阵列的所有条带,包括:
判断所述窗口偏移量是否等于窗口总数;
如果是,则确定已初始化完所述RAID阵列的所有条带;
如果否,则确定未完成初始化所述RAID阵列的所有条带。
优选地,所述窗口总数的获取过程,包括:
获取所述RAID阵列对应的条带总数;
获取所述滑动窗口的窗口大小;
利用所述条带总数与所述窗口大小,计算所述窗口总数。
优选地,移动所述滑动窗口,包括:
判断所述RAID阵列中的条带位图文件中各个所述条带是否已对应已初始化标记;
如果否,则移动所述滑动窗口。
优选地,移动所述滑动窗口,包括:
对所述滑动窗口进行一个窗口大小的移动;
将所述水位指针指向所述滑动窗口中对应的第一个条带的地址;
对所述窗口偏移量进行加一处理;
对所述条带标记进行赋值。
一种磁盘阵列初始化装置,包括:
滑动窗口初始化模块,用于接收RAID阵列的初始化请求后,从条带首地址开始处设置滑动窗口;
条带初始化模块,用于对当前所述滑动窗口对应的条带执行初始化任务;初始化完所述当前所述滑动窗口对应的条带后,移动所述滑动窗口;完成窗口移动后,返回执行所述对当前所述滑动窗口对应的条带执行初始化任务的步骤,直到初始化完所述RAID阵列的所有条带。
一种电子设备,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时实现上述磁盘阵列初始化方法的步骤。
一种可读存储介质,所述可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述磁盘阵列初始化方法的步骤。
应用本申请实施例所提供的方法,接收RAID阵列的初始化请求后,从条带首地址开始处设置滑动窗口;对当前滑动窗口对应的条带执行初始化任务;初始化完当前滑动窗口对应的条带后,移动滑动窗口;完成窗口移动后,返回执行对当前滑动窗口对应的条带执行初始化任务的步骤,直到初始化完RAID阵列的所有条带。
在本申请中,当接收到RAID的初始化请求之后,首先设置滑动窗口,然后,针对还掉窗口对应的条带执行初始化任务,在初始化完当前滑动窗口对应的条带之后,移动滑动窗口,并继续对当前滑动窗口对应的条带执行初始化任务,直到初始化完RAID阵列的所有条带。也就是说,在对RAID阵列的条带进行初始化时,始终仅对滑动窗口内的条带进行初始化,如此,仅占用一个滑动窗口对应的内存资源,而不会因位图占用大量内存资源;由于内存资源占用少,且在处理完一个滑动窗口对应的条带初始化任务后即可移动滑动窗口,处理下一个滑动窗口对应的条带初始化任务,因而可以提升初始化速度,缩短整体的初始化时长。此外,由于每次仅处理一个滑动窗口对应的条带初始化任务,因而在紧急IO任务情况下,可以大大减低条带不一致风险概率。
相应地,本申请实施例还提供了与上述磁盘阵列初始化方法相对应的磁盘阵列初始化装置、设备和可读存储介质,具有上述技术效果,在此不再赘述。
附图说明
为了更清楚地说明本申请实施例或相关技术中的技术方案,下面将对实施例或相关技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例中一种磁盘阵列初始化方法的实施流程图;
图2为RAID6的示意图;
图3为本申请实施例中一种磁盘阵列初始化装置的结构示意图;
图4为本申请实施例中一种电子设备的结构示意图;
图5为本申请实施例中一种电子设备的具体结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面结合附图和具体实施方式对本申请作进一步的详细说明。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
请参考图1,图1为本申请实施例中一种磁盘阵列初始化方法的流程图,该方法包括以下步骤:
S101、接收RAID阵列的初始化请求后,从RAID阵列的条带首地址开始处设置滑动窗口。
在用户发出格式化RAID阵列或创建RAID阵列的情况下,可接收上层应用发送的RAID初始化请求。
在本申请实施例中,为了减少占用内存,利用动态滑窗对RAID阵列进行初始化。在接收到初始化请求之后,可对应设置滑动窗口。具体的,可从RAID阵列的条带首地址开始处或从集群中双节点保存的APU条带首地址开始处设置该滑动窗口。该滑动窗口的窗口大小可根据实际需求进行设置和调整,例如,窗口大小可设置为32(当然,在实际应用中,该数值还可以增大或减小),即每滑动一次滑动窗口前处理32个条带的初始化任务。
其中,APU(atomic parity update)是RAID模块对写请求产生的校验数据做的一个保护措施,目的是保证在产生系统异常(如掉电、控制器故障等)之后,恢复分条的一致性。其内容含RAID条带地址、数据、校验。
集群,即存储系统中为了保证系统的高可用性,会使用两个节点组成一个IOGROUP,两个节点分别连接双端口硬盘的一个端口,IOGROUP中的两个节点互为对端节点,一个或多个IOGROUP组成集群,集群中节点可相互通信。
在本申请中的一种具体实施方式中,从条带首地址开始处设置滑动窗口,包括:
步骤一、申请三个无符号数据构建滑动窗口;三个无符号数据分别记录水位指针、窗口偏移量和条带标记;
步骤二、将水位指针指向条带首地址开始处;
步骤三、初始化窗口偏移量;
步骤四、对条带标记进行赋值。
为便于描述,下面对上述四个步骤结合起来进行说明。
首先,在内存中申请三个无符号数据,然后基于这三个无符号数据来构建滑动窗口。这三个无符号数据分别记录水位指针、窗口偏移量和条带标记。
为了避免掉电导致初始化需重新进行,还可以在申请三个无符号数据构建滑动窗口时,从电池备电单元保护的防掉电丢失数据的内存中申请无符号数据。电池备电单元(BBU,Battery Backup Unit)在存储系统中来保护系统掉电后数据的安全,当系统掉电后,会持续供电,保证系统中各种重要的数据被安全的保存,该过程称为备电。
其中,水位指针,即指当前需对滑动窗口对应的哪个条带进行处理,窗口偏移量即滑动窗口移动次数或窗口次序,条带标记即对应滑动窗口对应的各个条带对应的是否需要进行初始化的标记,例如可以用0表示需初始化相应地,用1表示已初始化;或用1表示需初始化相应地,用0表示已初始化。在本实施例中,对无符号数据分别用哪个数据表示哪个内容,不做限定。例如,可以用第一个无符号数据表示水位指针,第二个无符号数据来表示窗口偏移量,第三个无符号数据表示条带标记;也可调整为其他对应情况。
在本实例中,在申请了三个无符号数据之后,便可对这三个无符号数据进行赋值。具体的,可将水位指针指向条带首地址开始处,即水位指针指向滑动窗口对应的第一个条带;将窗口偏移量初始化为0或1;获取当前滑动窗口对应的条带的初始化状态,并基于该初始化状态对条带标记进行赋值。
举例说明:可通过三个无符号的4字节数据跟踪RAID阵列中所有条带的初始化进度。从概念上讲,客户端清除RAID阵列的所有条带,直到达到该阵列的条带末尾。实际上,使用一个无符号的4字节数据给出滑动窗口的窗口偏移量,另一个无符号4字节数据的32个bit位记录执行初始化任务的条带初始化状态,最后一个无符号4字节数据是水位指针(Watermark)。
在本申请中的一种具体实施方式中,对条带标记进行赋值,包括:
步骤1、从RAID阵列中的条带位图文件中,从首个条带开始,读取滑动窗口的窗口大小对应的多个条带分别对应的条带比特位标记;
步骤2、利用各个条带比特位标记对条带标记进行赋值。
为便于描述,下面将上述2个步骤结合起来进行说明。
在RAID阵列中,可一直维护一个条带位图文件在其尾部,用于标识各个条带的情况,其中包括条带初始化状态。因而,在本申请实施例中,可以从条带位图文件中,从首个条带开始,读取滑动窗口的窗口大小对应的多个条带分别对应的条带比特位标记。得到条带比特位标记之后,便可利用各个条带比特位标记对条带标记进行赋值。也就是说,在本实施例中,条带标记仅对应窗口大小的条带对应的位图信息,而无需在内存中存储整个位图文件,可以大大减少占用内存。
举例说明:如图2所示,图2为RAID6的示意图,RAID6为由4-16块盘组成的阵列。Stride(条带)是由分块(strip)组成。如图2所示:该RAID6阵列由6块成员盘构成,每一行为一个条带,假如每个成员盘为170G容量则阵列有1TB容量。分块strip大小为256KB,则条带大小为1536KB,因此阵列中有1TB/1536KB的条带数即699051个条带,根据一个条带对应一位则需要699051位,换算为(699051/8)个87382个字节,由此得出需要87382个字节的内存空间来存放位图元数据,87382个字节占用大量内存资源空间,导致初始化过程变慢,影响用户业务,致使用户体验下降。而在本申请中,窗口大小可根据需要进行设置,如设置为32位,在创建滑动窗口或移动滑动窗口之后,仅需在内存中保存滑动窗口对应的窗口大小对应的条带的位图信息,如32个条带对应的位图信息,即32字节4字节的数据。可以大大缩减内存资源占用。
S102、对当前滑动窗口对应的条带执行初始化任务。
设置好了滑动窗口之后,便可对当前滑动窗口对应的条带执行初始化任务。例如,当前滑动窗口的窗口大小为32,且为首个滑动窗口,则直接对滑动窗口对应的条带0至条带31,即共计32个条带执行初始化任务,若当前滑动窗口滑动了一次,则直接对当前滑动窗口对应的条带32至条带63,即32个条带执行初始化任务。
初始化一个条带,即初始化该条带对应的全部分块。分块:又称为strip/chunk;将一个分区分成多个大小相等的、地址相邻的块(Block),这些块称为分块。分块通常被认为是条带的元素。虚拟磁盘以它为单位将虚拟磁盘的地址映射到成员磁盘的地址。条带:又称为stride,是阵列的不同分区上的位置相关的strip的集合,是组织不同分区上分块的单位。
例如,对于图2中的条带stride0,对其进行初始化,即需要对磁盘0中的2,磁盘2中的3,磁盘3中的5,磁盘4中的P,磁盘5中的Q都需要进行初始化。其中,磁盘中的数据2,3,4和5对应条带化的数据,P代表校验数据,Q是第二份校验数据。
在本申请中的一种具体实施方式中,对当前滑动窗口对应的条带执行初始化任务,包括:
步骤一、从条带标记中读取水位指针对应的目标条带标记;其中,目标条带标记为目标条带的标记;
步骤二、若目标条带标记对应已初始化,则更新水位指针,直到确定初始化完当前滑动窗口对应的条带;
步骤三、若目标条带标记对应未初始化,则对目标条带执行初始化任务,并在执行完初始化任务后,更新水位指针,直到确定初始化完当前滑动窗口对应的条带。
为便于描述,下面将上述三个步骤结合起来进行说明。
考虑到已使用过RAID阵列后,用户重新格式化,则可能存在部分条带已初始化,部分条带未初始化的情况,对于已初始化的条带便可无需初始化,因而,在对滑动窗口对应的条带进行初始化时,可以首先从条带标记中读取出水位指针对应的目标条带标记;其中,目标条带标记为目标条带的标记。若该目标条带标记对应已初始化,则更新该水位指针,如加一;若该目标条带标记对应未初始化,则在对目标条带执行了初始化任务之后,在更新该水位指针。更新水位指针,直到确定初始化完当前滑动窗口对应的条带。
举例说明:若用1表示条带已初始化,0表示条带未初始化,在读取到当前水位指针对应的目标条带对应的条带标记为1,则无需对目标条带进行初始化,在目标条带并非当前滑动窗口的最后一个条带的情况下,直接对水位指针进行加一;在读取到当前水位指针对应的目标条带对应的条带标记为0,则独有对目标条带进行初始化,在完成初始化之后,再判断目标条带并非当前滑动窗口的最后一个条带的情况下,对水位指针进行加一,即移动到下一个条带进行判断处理。
也就是说,在当前滑动窗口对应的全部条带未初始化完之前,在初始化完当前条带或确认当前条带已初始化之后,都需要更新水位指针。即,水位指针,即标识当前正在处理的条带。
在本申请中可以采用以下方式中的至少一种方式,来确认当前滑动窗口对应的条带是否已全部初始化。需要注意的是,当采用两种方式时,可以在两种方式的结论都是确认已全部初始化的情况下,再确认当前滑动窗口对应的条带是否已全部初始化。
方式一:确定初始化完当前滑动窗口对应的条带,包括:
步骤1、判断水位指针对应的水位偏移量是否等于滑动窗口的大小;
步骤2、如果是,则确定初始化完当前滑动窗口对应的条带;
步骤3、如果否,则确定未初始化完当前滑动窗口对应的条带。
为便于描述,下面将上述3个步骤结合起来进行说明。
具体的,在一个滑动窗口内,每次移动水位指针时,对水位指针的水位偏移量进行加1,当水位指针的水位偏移量与窗口大小一致时,可确定已初始化完当前滑动窗口对应的条带,否则,即未完成。例如,窗口大小为32,水位指针初始水位偏移量为1,当移动了31次之后,水位偏移量为32,此时表明32个条带均被初始化完毕,确定当前滑动窗口对应的全部条带已初始化完毕。
方式二,确定初始化完当前滑动窗口对应的条带,包括:
步骤1、判断条带标记中的各个标记是否均对应已初始化;
步骤2、如果是,则确定初始化完当前滑动窗口对应的条带;
步骤3、如果否,则确定未初始化完当前滑动窗口对应的条带。
为便于描述,下面将上述3个步骤结合起来进行说明。
具体的,由于条带标记中的各个标记即标记了滑动窗口对应的条带的初始化状态,且每确认一个条带已初始化后,则对应该条带的标记进行修改,因而通过条带标记,可明确当前滑动窗口对应的全部条带是否已全部初始化。即通过验证条带标记中的各个标记是否均对应已初始化,则可确定当前滑动窗口对应的条带是否初始化完毕。具体的,当条带标记中的全部标记都对应已初始化,则可确定初始化完当前滑动窗口对应的条带,否则,即未初始化完当前滑动窗口对应的条带。
S103、初始化完当前滑动窗口对应的条带后,移动滑动窗口。
完成窗口移动后,返回执行对当前滑动窗口对应的条带执行初始化任务的步骤,直到初始化完RAID阵列的所有条带。
在当前滑动窗口对应的全部条带初始化完之后,便可移动该滑动窗口。
在完成了窗口移动之后,便可返回步骤S102继续执行对当前滑动窗口对应的条带执行初始化任务的步骤,直到初始化完RAID阵列的所有条带。当然,多当前滑动窗口即为最后一个滑动窗口,则可无需移动滑动窗口,而是直接确认已初始化完RAID阵列的所有条带。
其中,在移动滑动窗口之前,需要确认当前是否已初始化完RAID阵列的所有条带。确认是否已初始化完RAID阵列的所有条带,可以采用以下任意一种方式进行:
方式一,移动滑动窗口,包括:
步骤一、利用窗口偏移量,判断是否初始化完RAID阵列的所有条带;
步骤二、如果否,则移动滑动窗口。
为便于描述,下面将上述两个步骤结合起来进行说明。
具体的,窗口偏移量即对应了滑动窗口的移动次数或窗口次序。对于首个滑动窗口而言,其移动次数为0,窗口次序为1,每一次移动,移动次数和窗口次序都对应加1。由于一个RAID阵列的条带数量是固定有限的,因而需要移动滑动窗口的次数,对应的窗口次序也是有限且固定的,因而基于窗口偏移量,可以确定是否以初始化完RAID阵列的所有条带。
其中,利用窗口偏移量,判断是否初始化完RAID阵列的所有条带,包括:
步骤1、判断窗口偏移量是否等于窗口总数;
步骤2、如果是,则确定已初始化完RAID阵列的所有条带;
步骤3、如果否,则确定未完成初始化RAID阵列的所有条带。
为便于描述,下面将上述3个步骤结合起来进行说明。
也就是说,当窗口偏移量具体对应窗口次序且窗口偏移量是否等于窗口总数时,则表明当前的滑动窗口已对应了最后一个滑动窗口,即已处理完最后一个条带,因而可确定已初始化完RAID阵列的所有条带。
当然,当窗口偏移量具体对应窗口次序且窗口偏移量是否等于窗口总数减1时,也表明当前的滑动窗口已对应了最后一个滑动窗口,即已处理完最后一个条带,因而可确定已初始化完RAID阵列的所有条带。
其中,窗口总数的获取过程,包括:
步骤①、获取RAID阵列对应的条带总数;
步骤②、获取滑动窗口的窗口大小;
步骤③、利用条带总数与窗口大小,计算窗口总数。
其中,条带总数在创建了RAID阵列后,其数量即固定,可直接从存储介质中读取出该数值,也可以基于RAID阵列的结构、存储空间大小,直接计算出条带总数。具体计算方式可以参照上文描述。窗口大小在创建时,也设置了其数值,因而可直接获取该数值。得到条带总数与窗口大小后,可直接将条带总数与窗口大小做比,该比值即为窗口总数。
方式二,移动滑动窗口,包括:
步骤一、判断RAID阵列中的条带位图文件中各个条带是否已对应已初始化标记;
步骤二、如果否,则移动滑动窗口。
考虑到RAID阵列中,条带位图文件会不断的更新,即初始化过程中也可进行更新,因而直接判断RAID阵列中的条带位图文件中各个条带是否已对应已初始化标记,若是,则可明确已全部初始化RAID阵列中的全部条带,否则,即可明确未全部初始化RAID阵列中的全部条带。
在本申请中的一种具体实施方式中,移动滑动窗口,包括:
步骤一、对滑动窗口进行一个窗口大小的移动;
步骤二、将水位指针指向滑动窗口中对应的第一个条带的地址;
步骤三、对窗口偏移量进行加一处理;
步骤四、对条带标记进行赋值。
为便于描述,下面将上述四个步骤结合起来进行说明。
若滑动窗口的窗口大小为64,则移动一次滑动窗口,则移动64个条带,使得移动后的滑动窗口,对应上次处理的最后一个条带后连续的64个条带。
将水位指针,重新指向滑动窗口中对应的第一个条带的地址;对窗口的偏移量也进行加1处理。并对条带标记进行赋值,赋值方式即读取到新滑动窗口对应的多个条带的初始化状态标记,基于该标记对条带标记进行赋值,使得条带标记可表示当前对应的多个条带的初始化状态情况。
应用本申请实施例所提供的方法,应用本申请实施例所提供的方法,接收RAID阵列的初始化请求后,从条带首地址开始处设置滑动窗口;对当前滑动窗口对应的条带执行初始化任务;初始化完当前滑动窗口对应的条带后,移动滑动窗口;完成窗口移动后,返回执行对当前滑动窗口对应的条带执行初始化任务的步骤,直到初始化完RAID阵列的所有条带。
在本申请中,当接收到RAID的初始化请求之后,首先设置滑动窗口,然后,针对还掉窗口对应的条带执行初始化任务,在初始化完当前滑动窗口对应的条带之后,移动滑动窗口,并继续对当前滑动窗口对应的条带执行初始化任务,直到初始化完RAID阵列的所有条带。也就是说,在对RAID阵列的条带进行初始化时,始终仅对滑动窗口内的条带进行初始化,如此,仅占用一个滑动窗口对应的内存资源,而不会因位图占用大量内存资源;由于内存资源占用少,且在处理完一个滑动窗口对应的条带初始化任务后即可移动滑动窗口,处理下一个滑动窗口对应的条带初始化任务,因而可以提升初始化速度,缩短整体的初始化时长。此外,由于每次仅处理一个滑动窗口对应的条带初始化任务,因而在紧急IO任务情况下,可以大大减低条带不一致风险概率。
为便于本领域技术人员更好地理解本申请实施例所提供的磁盘阵列初始化方法,具体如何解决元数据组织方式在控制初始化任务时占用内存资源太大,进而解决RAID阵列性能降低的问题。下面以具体应用场景为例,对磁盘阵列初始化方法进行详细说明。
应用本申请所提供的磁盘阵列初始化方法后,可通过三个无符号的4字节数据跟踪RAID阵列中所有条带的初始化进度。从概念上讲,客户端清除RAID阵列的所有条带,直到达到该阵列的条带末尾。实际上,使用一个无符号的4字节数据给出滑动窗口的偏移量(即窗口偏移量),另一个无符号4字节数据的32个bit位记录执行初始化任务的条带(即条带标记),最后一个无符号4字节数据是水位指针(Watermark)。
水位即上述的滑动窗口偏移量,位图是管理窗口内所有条带的位图,水位指针是指向需要执行初始化任务的条带。RK_META_ITER_WINDOW是宏定义的窗口大小,默认为32。如下所示:
|<-Bitmap,PK_META_WINDOW->|
……00000000|101111010001110001100110111111111|111111……
^Watermark
从RAID条带首地址开始或从集群中双节点保存的APU条带地址开始,一次初始化RK_META_ITER_WINDOW宏定义窗口内的所有条带,当该窗口的所有条带都初始化完毕后,移动该窗口,然后对移动后窗口内的所有条带执行初始化,以此循环,直至RAID阵列初始化任务执行完毕。
具体执行步骤如下:
第一步:从BBU(电池备电单元)保护的harden内存中申请三个无符号4字节数据,并将RAID阵列条带地址与保存在BBU保护的harden内存中。
第二步:从RAID阵列条带首地址开始处设置第一个窗口,例如定义执行初始化任务的第一个窗口为RK_META_ITER_WINDOW宏定义窗口。定义RK_META_ITER_WINDOW为32。
第三步:输入RAID阵列条带地址,并根据RAID阵列容量求解RAID阵列的条带数。
第四步:设置Watermark水位指针指向窗口第一位,并判断Watermark水位指针指向的bit位是否为1,为1则跳过该bit位然后将水位指针移动到下一个bit位,为0则执行该bit位标识的条带的初始化任务,数据写零。
第五步:Watermark水位指针每移动一位,都需判断水位偏移量,即判断水位偏移量是否等于滑动窗口RK_META_ITER_WINDOW值窗口大小,等于则对窗口进行一个32位的移动,同时将Watermark水位指针移动到窗口头部。
第六步:根据第三步求得的条带数和窗口移动的次数以及Watermark水位指针的偏移,判断初始化任务是否完毕。
综上,本申请占用的内存资源情况是三个无符号4字节数据,大大减小了内存占用情况,加速初始化速率。
相应于上面的方法实施例,本申请实施例还提供了一种磁盘阵列初始化装置,下文描述的磁盘阵列初始化装置与上文描述的磁盘阵列初始化方法可相互对应参照。
参见图3所示,该装置包括以下模块:
滑动窗口初始化模块100,用于接收RAID阵列的初始化请求后,从条带首地址开始处设置滑动窗口;
条带初始化模块200,用于对当前滑动窗口对应的条带执行初始化任务;初始化完当前滑动窗口对应的条带后,移动滑动窗口;完成窗口移动后,返回执行对当前滑动窗口对应的条带执行初始化任务的步骤,直到初始化完RAID阵列的所有条带。
应用本申请实施例所提供的装置,应用本申请实施例所提供的方法,接收RAID阵列的初始化请求后,从条带首地址开始处设置滑动窗口;对当前滑动窗口对应的条带执行初始化任务;初始化完当前滑动窗口对应的条带后,移动滑动窗口;完成窗口移动后,返回执行对当前滑动窗口对应的条带执行初始化任务的步骤,直到初始化完RAID阵列的所有条带。
在本申请中,当接收到RAID的初始化请求之后,首先设置滑动窗口,然后,针对还掉窗口对应的条带执行初始化任务,在初始化完当前滑动窗口对应的条带之后,移动滑动窗口,并继续对当前滑动窗口对应的条带执行初始化任务,直到初始化完RAID阵列的所有条带。也就是说,在对RAID阵列的条带进行初始化时,始终仅对滑动窗口内的条带进行初始化,如此,仅占用一个滑动窗口对应的内存资源,而不会因位图占用大量内存资源;由于内存资源占用少,且在处理完一个滑动窗口对应的条带初始化任务后即可移动滑动窗口,处理下一个滑动窗口对应的条带初始化任务,因而可以提升初始化速度,缩短整体的初始化时长。此外,由于每次仅处理一个滑动窗口对应的条带初始化任务,因而在紧急IO任务情况下,可以大大减低条带不一致风险概率。
在本申请的一种具体实施方式中,滑动窗口初始化模块100,具体用于申请三个无符号数据构建滑动窗口;三个无符号数据分别记录水位指针、窗口偏移量和条带标记;
将水位指针指向条带首地址开始处;
初始化窗口偏移量;
对条带标记进行赋值。
在本申请的一种具体实施方式中,滑动窗口初始化模块100,具体用于从RAID阵列中的条带位图文件中,从首个条带开始,读取滑动窗口的窗口大小对应的多个条带分别对应的条带比特位标记;
利用各个条带比特位标记对条带标记进行赋值。
在本申请的一种具体实施方式中,滑动窗口初始化模块100,具体用于从电池备电单元保护的防掉电丢失数据的内存中申请无符号数据。
在本申请的一种具体实施方式中,条带初始化模块200,具体用于从条带标记中读取水位指针对应的目标条带标记;其中,目标条带标记为目标条带的标记;
若目标条带标记对应已初始化,则更新水位指针,直到确定初始化完当前滑动窗口对应的条带;
若目标条带标记对应未初始化,则对目标条带执行初始化任务,并在执行完初始化任务后,更新水位指针,直到确定初始化完当前滑动窗口对应的条带。
在本申请的一种具体实施方式中,条带初始化模块200,具体用于判断水位指针对应的水位偏移量是否等于滑动窗口的大小;
如果是,则确定初始化完当前滑动窗口对应的条带;
如果否,则确定未初始化完当前滑动窗口对应的条带。
在本申请的一种具体实施方式中,条带初始化模块200,具体用于判断条带标记中的各个标记是否均对应已初始化;
如果是,则确定初始化完当前滑动窗口对应的条带;
如果否,则确定未初始化完当前滑动窗口对应的条带。
在本申请的一种具体实施方式中,条带初始化模块200,具体用于利用窗口偏移量,判断是否初始化完RAID阵列的所有条带;
如果否,则移动滑动窗口。
在本申请的一种具体实施方式中,条带初始化模块200,具体用于判断窗口偏移量是否等于窗口总数;
如果是,则确定已初始化完RAID阵列的所有条带;
如果否,则确定未完成初始化RAID阵列的所有条带。
在本申请的一种具体实施方式中,条带初始化模块200,具体用于获取RAID阵列对应的条带总数;
获取滑动窗口的窗口大小;
利用条带总数与窗口大小,计算窗口总数。
在本申请的一种具体实施方式中,条带初始化模块200,具体用于判断RAID阵列中的条带位图文件中各个条带是否已对应已初始化标记;
如果否,则移动滑动窗口。
在本申请的一种具体实施方式中,条带初始化模块200,具体用于对滑动窗口进行一个窗口大小的移动;
将水位指针指向滑动窗口中对应的第一个条带的地址;
对窗口偏移量进行加一处理;
对条带标记进行赋值。
相应于上面的方法实施例,本申请实施例还提供了一种电子设备,下文描述的一种电子设备与上文描述的一种磁盘阵列初始化方法可相互对应参照。
参见图4所示,该电子设备包括:
存储器332,用于存储计算机程序;
处理器322,用于执行计算机程序时实现上述方法实施例的磁盘阵列初始化方法的步骤。
具体的,请参考图5,图5为本实施例提供的一种电子设备的具体结构示意图,该电子设备可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(central processing units,CPU)322(例如,一个或一个以上处理器)和存储器332,存储器332存储有一个或一个以上的计算机应用程序342或数据344。其中,存储器332可以是短暂存储或持久存储。存储在存储器332的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对数据处理设备中的一系列指令操作。更进一步地,中央处理器322可以设置为与存储器332通信,在电子设备301上执行存储器332中的一系列指令操作。
电子设备301还可以包括一个或一个以上电源326,一个或一个以上有线或无线网络接口350,一个或一个以上输入输出接口358,和/或,一个或一个以上操作系统341。
上文所描述的磁盘阵列初始化方法中的步骤可以由电子设备的结构实现。
相应于上面的方法实施例,本申请实施例还提供了一种可读存储介质,下文描述的一种可读存储介质与上文描述的一种磁盘阵列初始化方法可相互对应参照。
一种可读存储介质,可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述方法实施例的磁盘阵列初始化方法的步骤。
该可读存储介质具体可以为U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可存储程序代码的可读存储介质。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
本领域技术人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件的方式来执行,取决于技术方案的特定应用和设计约束条件。本领域技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应该认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系属于仅仅用来将一个实体或者操作与另一个实体或者操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语包括、包含或者其他任何变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。
本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本申请的限制。

Claims (15)

1.一种磁盘阵列初始化方法,其特征在于,包括:
接收RAID阵列的初始化请求后,从条带首地址开始处设置滑动窗口;
对当前所述滑动窗口对应的条带执行初始化任务;
初始化完所述当前所述滑动窗口对应的条带后,移动所述滑动窗口;
完成窗口移动后,返回执行所述对当前所述滑动窗口对应的条带执行初始化任务的步骤,直到初始化完所述RAID阵列的所有条带。
2.根据权利要求1所述的磁盘阵列初始化方法,其特征在于,从条带首地址开始处设置滑动窗口,包括:
申请三个无符号数据构建所述滑动窗口;所述三个无符号数据分别记录水位指针、窗口偏移量和条带标记;
将所述水位指针指向所述条带首地址开始处;
初始化所述窗口偏移量;
对所述条带标记进行赋值。
3.根据权利要求2所述的磁盘阵列初始化方法,其特征在于,所述对所述条带标记进行赋值,包括:
从所述RAID阵列中的条带位图文件中,从首个条带开始,读取所述滑动窗口的窗口大小对应的多个条带分别对应的条带比特位标记;
利用各个所述条带比特位标记对所述条带标记进行赋值。
4.根据权利要求2所述的磁盘阵列初始化方法,其特征在于,所述申请三个无符号数据构建所述滑动窗口,包括:
从电池备电单元保护的防掉电丢失数据的内存中申请所述无符号数据。
5.根据权利要求2所述的磁盘阵列初始化方法,其特征在于,对当前所述滑动窗口对应的条带执行初始化任务,包括:
从所述条带标记中读取所述水位指针对应的目标条带标记;其中,所述目标条带标记为目标条带的标记;
若所述目标条带标记对应已初始化,则更新所述水位指针,直到确定初始化完所述当前所述滑动窗口对应的条带;
若所述目标条带标记对应未初始化,则对所述目标条带执行初始化任务,并在执行完所述初始化任务后,更新所述水位指针,直到确定初始化完所述当前所述滑动窗口对应的条带。
6.根据权利要求5所述的磁盘阵列初始化方法,其特征在于,所述确定初始化完所述当前所述滑动窗口对应的条带,包括:
判断所述水位指针对应的水位偏移量是否等于所述滑动窗口的大小;
如果是,则确定初始化完所述当前所述滑动窗口对应的条带;
如果否,则确定未初始化完所述当前所述滑动窗口对应的条带。
7.根据权利要求6所述的磁盘阵列初始化方法,其特征在于,所述确定初始化完所述当前所述滑动窗口对应的条带,包括:
判断所述条带标记中的各个标记是否均对应已初始化;
如果是,则确定初始化完所述当前所述滑动窗口对应的条带;
如果否,则确定未初始化完所述当前所述滑动窗口对应的条带。
8.根据权利要求2所述的磁盘阵列初始化方法,其特征在于,移动所述滑动窗口,包括:
利用所述窗口偏移量,判断是否初始化完所述RAID阵列的所有条带;
如果否,则移动所述滑动窗口。
9.根据权利要求8所述的磁盘阵列初始化方法,其特征在于,所述利用所述窗口偏移量,判断是否初始化完所述RAID阵列的所有条带,包括:
判断所述窗口偏移量是否等于窗口总数;
如果是,则确定已初始化完所述RAID阵列的所有条带;
如果否,则确定未完成初始化所述RAID阵列的所有条带。
10.根据权利要求9所述的磁盘阵列初始化方法,其特征在于,所述窗口总数的获取过程,包括:
获取所述RAID阵列对应的条带总数;
获取所述滑动窗口的窗口大小;
利用所述条带总数与所述窗口大小,计算所述窗口总数。
11.根据权利要求2所述的磁盘阵列初始化方法,其特征在于,移动所述滑动窗口,包括:
判断所述RAID阵列中的条带位图文件中各个所述条带是否已对应已初始化标记;
如果否,则移动所述滑动窗口。
12.根据权利要求2所述的磁盘阵列初始化方法,其特征在于,移动所述滑动窗口,包括:
对所述滑动窗口进行一个窗口大小的移动;
将所述水位指针指向所述滑动窗口中对应的第一个条带的地址;
对所述窗口偏移量进行加一处理;
对所述条带标记进行赋值。
13.一种磁盘阵列初始化装置,其特征在于,包括:
滑动窗口初始化模块,用于接收RAID阵列的初始化请求后,从条带首地址开始处设置滑动窗口;
条带初始化模块,用于对当前所述滑动窗口对应的条带执行初始化任务;初始化完所述当前所述滑动窗口对应的条带后,移动所述滑动窗口;完成窗口移动后,返回执行所述对当前所述滑动窗口对应的条带执行初始化任务的步骤,直到初始化完所述RAID阵列的所有条带。
14.一种电子设备,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时实现如权利要求1至12任一项所述磁盘阵列初始化方法的步骤。
15.一种可读存储介质,其特征在于,所述可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至12任一项所述磁盘阵列初始化方法的步骤。
CN202211409857.XA 2022-11-11 2022-11-11 一种磁盘阵列初始化方法、装置、设备及可读存储介质 Active CN115657960B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202211409857.XA CN115657960B (zh) 2022-11-11 2022-11-11 一种磁盘阵列初始化方法、装置、设备及可读存储介质
PCT/CN2023/093312 WO2024098698A1 (zh) 2022-11-11 2023-05-10 一种磁盘阵列初始化方法、装置、设备及可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211409857.XA CN115657960B (zh) 2022-11-11 2022-11-11 一种磁盘阵列初始化方法、装置、设备及可读存储介质

Publications (2)

Publication Number Publication Date
CN115657960A true CN115657960A (zh) 2023-01-31
CN115657960B CN115657960B (zh) 2023-03-14

Family

ID=85021881

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211409857.XA Active CN115657960B (zh) 2022-11-11 2022-11-11 一种磁盘阵列初始化方法、装置、设备及可读存储介质

Country Status (2)

Country Link
CN (1) CN115657960B (zh)
WO (1) WO2024098698A1 (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117931484A (zh) * 2024-03-22 2024-04-26 中国人民解放军国防科技大学 基于滑动窗口的消息消费方法、装置、设备及存储介质
WO2024098698A1 (zh) * 2022-11-11 2024-05-16 苏州元脑智能科技有限公司 一种磁盘阵列初始化方法、装置、设备及可读存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100268876A1 (en) * 2009-04-20 2010-10-21 Microsoft Corporation Sliding-window multi-class striping
CN113849124A (zh) * 2021-08-27 2021-12-28 苏州浪潮智能科技有限公司 一种磁盘阵列扩容方法及装置
CN115098046A (zh) * 2022-08-26 2022-09-23 苏州浪潮智能科技有限公司 磁盘阵列初始化方法、系统、电子设备及存储介质

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115657960B (zh) * 2022-11-11 2023-03-14 苏州浪潮智能科技有限公司 一种磁盘阵列初始化方法、装置、设备及可读存储介质

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100268876A1 (en) * 2009-04-20 2010-10-21 Microsoft Corporation Sliding-window multi-class striping
CN113849124A (zh) * 2021-08-27 2021-12-28 苏州浪潮智能科技有限公司 一种磁盘阵列扩容方法及装置
CN115098046A (zh) * 2022-08-26 2022-09-23 苏州浪潮智能科技有限公司 磁盘阵列初始化方法、系统、电子设备及存储介质

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024098698A1 (zh) * 2022-11-11 2024-05-16 苏州元脑智能科技有限公司 一种磁盘阵列初始化方法、装置、设备及可读存储介质
CN117931484A (zh) * 2024-03-22 2024-04-26 中国人民解放军国防科技大学 基于滑动窗口的消息消费方法、装置、设备及存储介质

Also Published As

Publication number Publication date
CN115657960B (zh) 2023-03-14
WO2024098698A1 (zh) 2024-05-16

Similar Documents

Publication Publication Date Title
CN115657960B (zh) 一种磁盘阵列初始化方法、装置、设备及可读存储介质
US11163472B2 (en) Method and system for managing storage system
CN104932953B (zh) 一种数据分发方法、数据存储方法、相关装置以及系统
CN110737541B (zh) 分布式存储系统中分发数据的方法和系统
CN110413201B (zh) 用于管理存储系统的方法、设备和计算机程序产品
US8677063B2 (en) Parity declustered storage device array with partition groups
CN107484427B (zh) 用于处理存储设备中分条的方法和存储设备
CN103534688B (zh) 数据恢复方法、存储设备和存储系统
CN109582213B (zh) 数据重构方法及装置、数据存储系统
CN107515726B (zh) 用于管理存储设备的方法和系统
CN111858130A (zh) 用于拆分盘集的方法、设备和计算机程序产品
US20190243553A1 (en) Storage system, computer-readable recording medium, and control method for system
CN111638995B (zh) 元数据备份方法、装置及设备、存储介质
CN112748867B (zh) 用于存储管理的方法、电子设备以及计算机程序产品
CN110147203B (zh) 一种文件管理方法、装置、电子设备及存储介质
CN110597655A (zh) 一种迁移与基于纠删码的重构相耦合的快速预知修复方法和实现
CN109189326B (zh) 分布式集群的管理方法和装置
CN117193672B (zh) 存储设备的数据处理方法及装置、存储介质及电子设备
CN116339644B (zh) 一种独立磁盘冗余阵列创建方法、装置、设备及介质
CN116795295B (zh) 磁盘阵列中的数据处理方法及装置、存储介质、电子设备
CN113391945A (zh) 用于存储管理的方法、电子设备以及计算机程序产品
US20230350611A1 (en) Flexible raid scheme allowing fast rebuild
CN111857560A (zh) 用于管理数据的方法、设备和计算机程序产品
CN113590032A (zh) 固态硬盘名称空间的创建方法、装置、设备及可读存储介质
CN103502953B (zh) 提高分布式对象存储系统的并发性能的方法和装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant