CN111352860B - 一种Linux Bcache中的垃圾回收方法及系统 - Google Patents

一种Linux Bcache中的垃圾回收方法及系统 Download PDF

Info

Publication number
CN111352860B
CN111352860B CN201911369383.9A CN201911369383A CN111352860B CN 111352860 B CN111352860 B CN 111352860B CN 201911369383 A CN201911369383 A CN 201911369383A CN 111352860 B CN111352860 B CN 111352860B
Authority
CN
China
Prior art keywords
tree
flow
setting
auxiliary
bcache
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
CN201911369383.9A
Other languages
English (en)
Other versions
CN111352860A (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.)
Tianjin Zhongke Shuguang Storage Technology Co ltd
Original Assignee
Tianjin Zhongke Shuguang Storage 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 Tianjin Zhongke Shuguang Storage Technology Co ltd filed Critical Tianjin Zhongke Shuguang Storage Technology Co ltd
Priority to CN201911369383.9A priority Critical patent/CN111352860B/zh
Publication of CN111352860A publication Critical patent/CN111352860A/zh
Application granted granted Critical
Publication of CN111352860B publication Critical patent/CN111352860B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/524Deadlock detection or avoidance

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种Linux Bcache中的垃圾回收方法,包括设置辅助B+tree;在写请求流程与GC流程并发时,写请求的数据元素插入所述辅助B+tree中,并在GC流程结束后,将插入的所述数据元素插入到原始B+tree中。本发明方法通过辅助B+tree,避免了写请求与GC过程并发时,请求必须等待造成的流量中断;结合“可抢占式锁”解决了Bcache GC过程中,读请求必须等待造成的流量中断;同时通过维护GC任务优先级的方式,避免GC任务一直被抢占而造成的缓存设备空间分配中断。

Description

一种Linux Bcache中的垃圾回收方法及系统
技术领域
本发明涉及计算机存储优化技术领域,具体而言,为一种Linux Bcache中的垃圾回收方法及系统。
背景技术
Linux Bcache是Linux内核中的块设备缓存,基本功能是用固态硬盘(缓存设备)给机械硬盘(后端设备)做缓存。在Bcache中,用B+tree(一种多路搜索树)维护缓存设备和后端设备上面数据的映射关系。
该B+tree涉及的操作有“查找,遍历,插入,整理”四种,向缓存设备写数据会向B+tree插入元素;从缓存设备读数据会从B+tree查找元素;将缓存设备上的数据写回到后端设备(回刷)会遍历B+tree来标记缓存设备上有“脏数据”的区间;将缓存设备上的空间回收再利用(垃圾回收)会整理B+tree的所有节点。
为保护B+tree上面数据的可靠性,防止上述四个动作并发进行(比如在插入的同时查找),Bcache采用“读写锁”的方式:对B+tree上面某节点加“读锁”,用来查找和遍历,此时请求写锁的其他任务必须等待;对B+tree上面某节点加“写锁”,用来插入和整理,此时请求读锁或者请求写锁的其他任务必须等待。同理,垃圾回收过程需要对B+tree的根节点加“写锁”。
图1为Bcache中几种主要流程对B+tree的加锁请求示意图,在读写流程中如图(1a)所示:需要持有一条路径锁,即比如要操作的数据元素在node(节点)103中,bcache需要先请求node101的锁,再请求node102的锁,最终请求node103的锁,在操作数据结束后,依次释放node103、node102、node101的锁。在整个流程中,其他请求操作node101、node102、node103的流程都将等待。
如图(1b)所示的,在GC(Bcache中垃圾回收功能,将缓存上空间回收再利用)流程中,以节点合并为例,需要请求node101、node104、node105、node106、node107的锁,然后持有这些节点的锁尝试合并node105、node106、node107;在整个b+tree的所有GC操作完成后,最终释放node101的锁;在此过程中,所有其他请求node101锁的流程都将等待;因此GC流程需要长时间持有根节点node101写锁,以及短时间持有正在处理的一条路径锁。
由此可见,读写流程和GC流程操作的是同一颗B+tree,所有操作均需要请求根节点(node101)的锁;这样则不可避免的带来了锁竞争的问题。
由于Linux bcache的核心数据结构是B+tree,并且利用“读写锁”技术实现B+tree操作的并发控制;那么将根节点加“写锁”的垃圾回收过程中,所有块设备的读写请求都将等待,即Bcache垃圾回收的过程中,会造成读写业务的流量中断问题。
Bcache中的垃圾回收过程会涉及“B+tree节点合并”、“B+tree节点整理写入磁盘”、“标记缓存设备上各区间用途用量”等操作;这些操作耗时比较大,并且所使用的缓存设备容量越大,耗时越大;因此,随着固态硬盘的普及和容量增大,垃圾回收过程中的流量中断问题会越来越成为Bcache的性能瓶颈。
有鉴于此,特提出本发明。
发明内容
针对现有技术中的缺陷,本发明提供一种Linux Bcache中的垃圾回收方法和系统,解决上述Bcache垃圾回收的过程中的流量中断问题。
为了实现上述目的,本发明的技术方案为:
一种Linux Bcache中的垃圾回收方法,包括
设置辅助B+tree;
在写请求流程与GC流程并发时,写请求的数据元素插入所述辅助B+tree中,并在GC流程结束后,将插入的所述数据元素插入到原始B+tree中。
进一步的,上述的Linux Bcache中的垃圾回收方法中,还包括
取多个原始B+tree节点设置为GC流程检查点;
在检查点设置任务优先级规则;
在读请求与GC流程并发时,根据所述检查点的优先级比对结果以及当前的读请求排队任务个数,确定GC流程继续执行或者中断。
进一步的,上述的Linux Bcache中的垃圾回收方法中,所述GC流程处理完毕后,遍历所述辅助B+tree。
进一步的,上述的Linux Bcache中的垃圾回收方法中,所述在检查点设置任务优先级规则,包括对GC任务优先级的设置和/或对排队等待的读请求任务个数设置。
本发明还提供了一种Linux Bcache中的垃圾回收系统,包括处理器和存储器,存储器中存储有程序,程序被处理器运行时,执行:
设置辅助B+tree;
在写请求流程与GC流程并发时,将写请求的数据元素插入所述辅助B+tree中,并在GC流程结束后,将插入的所述数据元素插入到原始B+tree中。
进一步的,上述的Linux Bcache中的垃圾回收系统中,还包括
取多个原始B+tree节点设置为GC流程检查点;
在检查点设置任务优先级规则;
在读请求与GC流程并发时,根据所述检查点的优先级比对结果以及当前的读请求排队任务个数,确定GC流程继续执行或者中断。
进一步的,上述的Linux Bcache中的垃圾回收系统中,所述GC流程处理完毕后,遍历所述辅助B+tree。
进一步的,上述的Linux Bcache中的垃圾回收系统中,所述在检查点设置任务优先级规则,包括对GC任务优先级的设置和/或对排队等待的读请求任务个数设置。
与传统技术相比,本发明的有益效果是:
本发明方法通过辅助B+tree,避免了写请求与GC过程并发时,请求必须等待造成的流量中断;结合“可抢占式锁”解决了Bcache GC过程中,读请求必须等待造成的流量中断;同时通过维护GC任务优先级的方式,避免GC任务一直被抢占而造成的缓存设备空间分配中断。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍。在所有附图中,类似的元件或部分一般由类似的附图标记标识。附图中,各元件或部分并不一定按照实际的比例绘制。
图1为现有技术中Bcache中的流程对B+tree的加锁请求示意图;
其中图(1a)为读写流程对B+tree的请求示意图;图(1b)为GC流程对B+tree的请求示意图;
图2为本发明方法中的一个具体实施例中写流程与GC流程并发示意图;
图3为本发明方法中的一个具体实施例中写请求流程图;
图4为本发明方法中的一个具体实施例中读流程与GC流程并发示意图;
其中图4中(4a)为对原始B+tree进行的GC流程示意图;图4中(4b)为读流程对辅助B+tree的请求示意图;图4中(4c)为对原始B+tree暂停GC流程示意图;
图5为本发明方法中的一个具体实施例中读请求流程图;
图6为本发明方法中的一个具体实施例中GC流程图。
具体实施方式
下面将结合附图对本发明技术方案的实施例进行详细的描述。以下实施例仅用于更加清楚地说明本发明的技术方案,因此只作为示例,而不能以此来限制本发明的保护范围。
需要注意的是,除非另有说明,本申请使用的技术术语或者科学术语应当为本发明所属领域技术人员所理解的通常意义。
一种Linux Bcache中的垃圾回收方法,包括对写请求流程与GC流程并发的处理方法以及读流程与GC流程并发的处理方法,其包括
设置辅助B+tree;
在写请求流程与GC流程并发时,写请求的数据元素插入所述辅助B+tree中,并在GC流程结束后,将插入的所述数据元素插入到原始B+tree中。
本发明方法通过使用“辅助B+tree”的方法,来解决Bcache的GC过程中,写请求必须等待造成的流量中断。
如图2所示的一个具体实施例,在GC过程中,系统维护一棵以node206为根节点的辅助B+tree。在GC过程正在进行时,持有了节点node201、node202、node203、node204以及node205的写锁;在Bcache原始逻辑中,此时的写请求必将等待在根节点node201的持锁请求上;但本发明方法中,写请求只需要将数据元素插入到辅助B+tree中,即只需请求node206、node207的锁便可以完成写操作;在GC流程结束之后,再将辅助B+tree上面的数据元素插入到原始B+tree中。由于以node201为根节点的原B+tree和以node206为根节点的辅助B+tree不是同一颗B+tree,所以GC流程和写流程不再存在由抢锁带来的竞争。
本发明方法在写请求的流程如图3所示的,首先进行“GC(流程)是否进行中”的判断条件,在GC流程正在进行中时,将元素插入到辅助B+tree中;在GC流程没有在进行中时,将元素插入到原始B+tree中。
因此,本发明方法通过使用辅助B+tree,解决了Bcache中以GC流程为代表的阻塞性高耗时任务造成的性能瓶颈。
本发明方法还包括针对读流程(即读请求的流程,下同)与GC流程并发的处理步骤,通过“可抢占式锁”,来解决Bcache GC流程中,读请求必须等待造成的流量中断;具体的,包括
取多个原始B+tree节点设置为GC流程检查点;
检查点设置任务优先级规则;
在读请求与GC流程并发时,根据所述检查点的优先级比对结果以及当前的读请求排队任务个数,确定GC流程继续执行或者中断。
本方法中通过设置检查点和优先级规则,使得GC流程在运行过程中,可以根据实际情况选择暂停,相当于设置了所述“可抢占式锁”,解决了Bcache中以GC任务为代表的阻塞性高耗时任务造成的性能瓶颈;具体的:
如图4中(4a)、(4b)、(4c)所示的,为本发明方法在读流程与GC流程并发示意图;与写请求只需要将元素插入到B+tree不同,读请求执行时,需查询以node401为根节点的原始B+tree以及以node406为根节点的辅助B+tree,以确保查询结果的正确性。
查询辅助B+tree时,与没有GC任务时读写请求竞争锁情况类似,需要竞争辅助B+tree中node406、node407的读写锁;查询原始B+tree时,GC流程正在持有node401、node402、node403、node404、node405的写锁,读流程需要排队尝试抢占GC流程持有的锁;GC任务在检查点发现GC任务的优先级比较低,并且有较多读请求排队时,暂时放弃自己持有的写锁,随即读请求可以顺利请求到node401、node402、node403的读锁,完成查询操作。
本步骤中,在GC流程中途设置检查点,到达检查点,并检查发现GC优先级低时,可以主动放弃持有的写锁,使得排队等待的读请求可以尽快完成查询操作。
如图5所示的,本发明中增加“GC(流程)是否进行中”的判断条件,当该判断条件为真时,需要额外查找辅助B+tree,并且在辅助B+tree与原始B+tree都查询完成之后,需要将两者的查询结果组合。由于辅助B+tree中的数据比原始B+tree中的数据要更新,所以当两者查询结果有重合部分时,应当以辅助B+tree中的查询结果为准。
传统技术中,除非遇到错误中途退出,否则一次GC任务是不可被打断的,每次GC就是取整颗B+tree进行整理;结合图6所示的,本发明步骤中,开始垃圾回收流程:
1.取N(N为正整数且N为可调节参数,根据原始B+tree节点大小和单个处理耗时情况而定)个原始B+tree节点设置为GC流程检查点,将GC流程分阶段执行,在各B+tree节点进行任务优先级比较,方便每个阶段结束时,作为一个检查点,随时暂停GC任务。
本发明方法还包括维护GC任务优先级:
由于传统技术中,GC任务是不可被打断的,所以不需要额外维护任务的优先级;在本发明方法中,如果GC任务优先级高,则前端读业务(即读流程)不可抢占GC流程优先级,前端读业务就将持续等待;如果GC任务优先级低,而前端读业务繁忙时,会一直抢占GC流程持有的锁资源,GC任务有无法完成的风险。为解决此问题,需要动态维护GC任务的优先级,一直被抢占时,提高优先级;长时间未被抢占时,降低其优先级;再结合等待在读锁上的任务个数,动态调整“是否可以抢占”这个事件判断;动态调整例如:GC流程放弃一次锁,优先级提高一级,防止GC任务永远无法完成;其中优先级别的高、低程度、等待在读锁上的任务个数等都可以根据实际情况自行设置。
GC流程对原始B+tree的处理完毕后,需要遍历辅助B+tree,以更新统计信息。
由于在GC流程中新产生的写请求记录在了辅助B+tree上面,GC流程又仅仅遍历了原始B+tree,这样会造成“缓存设备每个区间的用途用量”这个信息与实际有偏差;为确保各项统计信息的正确性,在对原始B+tree的GC流程处理结束后,需要遍历辅助B+tree,将辅助B+tree合并到原始B+tree(即本B+tree),统计更新信息。
至此,垃圾回收完成。
本发明还提供了用于实施上述本发明方法的系统,包括包括处理器和存储器,存储器中存储有程序,程序被处理器运行时,执行:
设置辅助B+tree;
在写请求流程与GC流程并发时,将写请求的数据元素插入所述辅助B+tree中,并在GC流程结束后,将插入的所述数据元素插入到原始B+tree中。
程序被处理器运行时,还执行:
取多个原始B+tree节点设置为GC流程检查点;
在检查点设置任务优先级规则;其中所述在检查点设置任务优先级规则,包括对GC任务优先级的设置和/或对排队等待的读请求任务个数设置;
在读请求与GC流程并发时,根据所述检查点的优先级比对结果以及当前的读请求排队任务个数,确定GC流程继续执行或者中断。
并且程序被处理器运行时,还执行:
所述GC流程处理完毕后,遍历所述辅助B+tree。
程序被处理器运行时,还执行:
维护GC任务优先级。
本发明系统用于实施本发明上述方法,其实现原理和过程可参考上述对本发明方法的描述;本系统中的程序为计算机程序(也称为软件、软件应用、脚本或代码)可以用任何适合形式的编程语言(包括编译语言或解释语言)来编写,并且计算机程序可以用任何形式来部署,包括作为独立程序或者作为模块、部件、子例程或者适合在计算环境中使用的其他单元。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围,其均应涵盖在本发明的权利要求和说明书的范围当中。

Claims (4)

1.一种Linux Bcache中的垃圾回收方法,其特征在于,包括
设置辅助B+tree;
在写请求流程与GC流程并发时,写请求的数据元素插入所述辅助B+tree中,并在GC流程结束后,将插入的所述数据元素插入到原始B+tree中;
取多个原始B+tree节点设置为GC流程检查点;
在检查点设置任务优先级规则;
在读请求与GC流程并发时,根据所述检查点的优先级比对结果以及当前的读请求排队任务个数,确定GC流程继续执行或者中断,
所述在检查点设置任务优先级规则,包括对GC任务优先级的设置和/或对排队等待的读请求任务个数设置。
2.根据权利要求1所述的Linux Bcache中的垃圾回收方法,其特征在于,所述GC流程处理完毕后,遍历所述辅助B+tree。
3.一种Linux Bcache中的垃圾回收系统,包括处理器和存储器,其特征在于,存储器中存储有程序,程序被处理器运行时,执行:
设置辅助B+tree;
在写请求流程与GC流程并发时,将写请求的数据元素插入所述辅助B+tree中,并在GC流程结束后,将插入的所述数据元素插入到原始B+tree中;
取多个原始B+tree节点设置为GC流程检查点;
在检查点设置任务优先级规则;
在读请求与GC流程并发时,根据所述检查点的优先级比对结果以及当前的读请求排队任务个数,确定GC流程继续执行或者中断,
所述在检查点设置任务优先级规则,包括对GC任务优先级的设置和/或对排队等待的读请求任务个数设置。
4.根据权利要求3所述的Linux Bcache中的垃圾回收系统,其特征在于,所述GC流程处理完毕后,遍历所述辅助B+tree。
CN201911369383.9A 2019-12-26 2019-12-26 一种Linux Bcache中的垃圾回收方法及系统 Active CN111352860B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911369383.9A CN111352860B (zh) 2019-12-26 2019-12-26 一种Linux Bcache中的垃圾回收方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911369383.9A CN111352860B (zh) 2019-12-26 2019-12-26 一种Linux Bcache中的垃圾回收方法及系统

Publications (2)

Publication Number Publication Date
CN111352860A CN111352860A (zh) 2020-06-30
CN111352860B true CN111352860B (zh) 2022-05-13

Family

ID=71195739

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911369383.9A Active CN111352860B (zh) 2019-12-26 2019-12-26 一种Linux Bcache中的垃圾回收方法及系统

Country Status (1)

Country Link
CN (1) CN111352860B (zh)

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5276872A (en) * 1991-06-25 1994-01-04 Digital Equipment Corporation Concurrency and recovery for index trees with nodal updates using multiple atomic actions by which the trees integrity is preserved during undesired system interruptions
CN102722449A (zh) * 2012-05-24 2012-10-10 中国科学院计算技术研究所 基于SSD的Key-Value型本地存储方法及系统
CN105005621A (zh) * 2015-07-23 2015-10-28 张真 一种大数据分布式存储及并行索引系统的构建方法
CN107783988A (zh) * 2016-08-26 2018-03-09 阿里巴巴集团控股有限公司 一种目录树的加锁方法及设备
CN109407979A (zh) * 2018-09-27 2019-03-01 清华大学 多线程持久性b+树数据结构设计与实现方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7987214B2 (en) * 2008-08-29 2011-07-26 Tatu Ylonen Oy Determining the address range of a subtree of a linearized tree

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5276872A (en) * 1991-06-25 1994-01-04 Digital Equipment Corporation Concurrency and recovery for index trees with nodal updates using multiple atomic actions by which the trees integrity is preserved during undesired system interruptions
CN102722449A (zh) * 2012-05-24 2012-10-10 中国科学院计算技术研究所 基于SSD的Key-Value型本地存储方法及系统
CN105005621A (zh) * 2015-07-23 2015-10-28 张真 一种大数据分布式存储及并行索引系统的构建方法
CN107783988A (zh) * 2016-08-26 2018-03-09 阿里巴巴集团控股有限公司 一种目录树的加锁方法及设备
CN109407979A (zh) * 2018-09-27 2019-03-01 清华大学 多线程持久性b+树数据结构设计与实现方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
基于Linux的混合存储系统Bcache的研究与改进;唐华敏;《中国优秀硕士论文电子期刊网 信息科技辑》;20170315;第I137-225页 *
高并发读写性能的多版本B+树研究;luo juan;《万方学位论文》;20141103;第1-89页 *

Also Published As

Publication number Publication date
CN111352860A (zh) 2020-06-30

Similar Documents

Publication Publication Date Title
EP2972885B1 (en) Memory object reference count management with improved scalability
US8458721B2 (en) System and method for implementing hierarchical queue-based locks using flat combining
US7472228B2 (en) Read-copy update method
US7734879B2 (en) Efficiently boosting priority of read-copy update readers in a real-time data processing system
US8495641B2 (en) Efficiently boosting priority of read-copy update readers while resolving races with exiting and unlocking processes
US5274809A (en) Task execution control method for a multiprocessor system with enhanced post/wait procedure
US9430388B2 (en) Scheduler, multi-core processor system, and scheduling method
US8738862B2 (en) Transactional memory system with efficient cache support
US9513959B2 (en) Contention management for a hardware transactional memory
US8615771B2 (en) Effective management of blocked-tasks in preemptible read-copy update
US7668851B2 (en) Lockless hash table lookups while performing key update on hash table element
US9798595B2 (en) Transparent user mode scheduling on traditional threading systems
US20140223242A1 (en) Motivating Lazy RCU Callbacks Under Out-Of-Memory Conditions
CN107278296B (zh) 用于响应于事务执行生成跟踪数据的装置和方法
US11132294B2 (en) Real-time replicating garbage collection
US20210034437A1 (en) System and method for multidimensional search with a resource pool in a computing environment
US10372510B2 (en) Using expedited grace periods to short-circuit normal grace-period computations
US11221947B2 (en) Concurrent garbage collection with minimal graph traversal
US10313477B2 (en) System and method for use of a non-blocking process with a resource pool in a computing environment
US7793023B2 (en) Exclusion control
Marotta et al. A non-blocking priority queue for the pending event set
KR101885030B1 (ko) 하이브리드 트랜잭셔널 메모리 시스템에서의 트랜잭션 처리 방법 및 트랜잭션 처리 장치
CN111352860B (zh) 一种Linux Bcache中的垃圾回收方法及系统
US8589633B2 (en) Control apparatus
CN110537174B (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