本公開涉及分布式
技術(shù)領(lǐng)域:
,特別涉及一種存儲空間回收方法及裝置。
背景技術(shù):
:隨著互聯(lián)網(wǎng)技術(shù)的迅速發(fā)展,人們越來越多地使用計算機存儲數(shù)據(jù),這使得對數(shù)據(jù)存儲的需求不斷增長。由于單機的文件系統(tǒng)存儲容量有限,因此時下各大互聯(lián)網(wǎng)公司一般均采用自研或開源的分布式文件系統(tǒng)存儲數(shù)據(jù)。其中,存儲的數(shù)據(jù)中常常會包含較多有時效性的數(shù)據(jù),因此分布式文件系統(tǒng)一般會支持?jǐn)?shù)據(jù)刪除操作。由于在執(zhí)行數(shù)據(jù)刪除操作后,刪除數(shù)據(jù)所占用的存儲空間處于空閑狀態(tài),出于合理利用存儲空間的目的,此時對這類存儲空間進行回收顯得尤為重要。相關(guān)技術(shù)中,分布式文件系統(tǒng)中的文件按照時間先后順序依次存儲在數(shù)據(jù)塊(Block)中。當(dāng)某一數(shù)據(jù)塊中有文件被刪除時,會對該數(shù)據(jù)塊進行壓縮(Compaction)操作,即將未被刪除的文件整合在一起。比如,將已刪除文件之后的全部未刪除文件整體進行移動,以將已刪除文件的存儲空間占據(jù),在保證未刪除文件依舊順序存儲的前提下,實現(xiàn)了對存儲空間的回收。在實現(xiàn)本公開的過程中,發(fā)明人發(fā)現(xiàn)相關(guān)技術(shù)至少存在以下問題:由于上述存儲空間回收方式會涉及到文件移動,因此需采用索引文件(IndexFile)保存文件的元數(shù)據(jù)信息,以記錄文件的存儲位置。而索引文件通常會占用較大內(nèi)存,并且在每次訪問文件前均需訪問索引文件以獲取存儲位置,這會導(dǎo)致輸入輸出操作大幅度增加,所以上述存儲空間的回收方式效果欠佳。技術(shù)實現(xiàn)要素:為克服相關(guān)技術(shù)中存在的問題,本公開提供一種存儲空間回收方法及裝置。根據(jù)本公開實施例的第一方面,提供一種存儲空間回收方法,包括:接收分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求,所述存儲空間回收請求至少包括一個數(shù)據(jù)塊中待刪除文件的文件標(biāo)識,所述存儲空間回收請求是由所述主節(jié)點在確定所述數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值后發(fā)送的;根據(jù)所述文件標(biāo)識在所述數(shù)據(jù)塊中確定所述待刪除文件,將所述待刪除文件的文件頭復(fù)制到臨時文件中,并對所述待刪除文件執(zhí)行添加文件洞處理;將所述數(shù)據(jù)塊中非刪除文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到所述臨時文件中;以所述臨時文件替換所述數(shù)據(jù)塊中原始寫入文件,完成所述數(shù)據(jù)塊的存儲空間回收。在另一個實施例中,所述方法還包括:為所述數(shù)據(jù)塊中包含的每一個文件均設(shè)置一個刪除標(biāo)識,所述刪除標(biāo)識存儲在每一個文件的文件頭中;為所述待刪除文件中的每一個文件的刪除標(biāo)識設(shè)置第一標(biāo)記。在另一個實施例中,所述將所述待刪除文件的文件頭復(fù)制到臨時文件中,并對所述待刪除文件執(zhí)行添加文件洞處理,包括:若所述數(shù)據(jù)塊中一個文件的刪除標(biāo)識取值為所述第一標(biāo)記,則確定所述文件為待刪除文件,將所述文件的文件頭復(fù)制到所述臨時文件中,并調(diào)用系統(tǒng)指針在所述文件的除文件頭之外的其他部分添加文件洞。在另一個實施例中,所述將所述待刪除文件的文件頭復(fù)制到臨時文件中,并對所述待刪除文件執(zhí)行添加文件洞處理,包括:若至少兩個連續(xù)存儲文件的刪除標(biāo)識均取值為所述第一標(biāo)記,則在所述至少兩個連續(xù)存儲的文件中選取一個文件的文件頭;將所述文件頭中存儲的文件尺寸更新為所述至少兩個連續(xù)存儲文件的文件尺寸之和;將更新后的文件頭復(fù)制到所述臨時文件中,并調(diào)用系統(tǒng)指針在所述文件的除文件頭之外的其他部分中添加文件洞。在另一個實施例中,所述調(diào)用系統(tǒng)指針在所述文件除文件頭之外的其他部分中添加文件洞,包括:調(diào)用所述系統(tǒng)指針依次跳過所述文件的文件數(shù)據(jù)和文件尾,以在所述文件數(shù)據(jù)以及所述文件尾的存儲位置處形成文件洞。在另一個實施例中,所述將所述數(shù)據(jù)塊中非刪除文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到所述臨時文件中,包括:若所述數(shù)據(jù)塊中一個文件的刪除標(biāo)識取值為第二標(biāo)記,則確定所述文件為所述非刪除文件,將所述文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到所述臨時文件中。在另一個實施例中,所述方法還包括:在接收到所述分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求后,將所述存儲空間收回請求發(fā)送至存儲有所述數(shù)據(jù)塊的其他副本的其他數(shù)據(jù)節(jié)點;在均完成對所述數(shù)據(jù)塊的存儲空間回收操作后,向所述主節(jié)點返回空間回收完成響應(yīng)。根據(jù)本公開實施例的第二方面,提供一種存儲空間回收方法,包括:周期性獲取分布式文件系統(tǒng)中存儲的數(shù)據(jù)塊狀態(tài)表,所述數(shù)據(jù)塊狀態(tài)表中記錄了至少一個數(shù)據(jù)塊的刪除文件尺寸和待刪除文件的文件標(biāo)識;對于每一個數(shù)據(jù)塊,若所述數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值,則獲取所述數(shù)據(jù)塊的屬性信息;根據(jù)所述屬性信息,向所述數(shù)據(jù)塊所在的數(shù)據(jù)節(jié)點發(fā)送存儲空間回收請求,所述存儲空間回收請求中至少包括所述數(shù)據(jù)塊中待刪除文件的文件標(biāo)識,所述數(shù)據(jù)節(jié)點用于根據(jù)所述文件標(biāo)識在所述數(shù)據(jù)塊中確定待刪除文件,并對所述待刪除文件執(zhí)行添加文件洞處理,完成所述數(shù)據(jù)塊的存儲空間回收。根據(jù)本公開實施例的第三方面,提供一種存儲空間回收裝置,包括:接收模塊,被配置為接收分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求,所述存儲空間回收請求至少包括一個數(shù)據(jù)塊中待刪除文件的文件標(biāo)識,所述存儲空間回收請求是由所述主節(jié)點在確定所述數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值后發(fā)送的;第一復(fù)制模塊,被配置為根據(jù)所述文件標(biāo)識在所述數(shù)據(jù)塊中確定所述待刪除文件,將所述待刪除文件的文件頭復(fù)制到臨時文件中,并對所述待刪除文件執(zhí)行添加文件洞處理;第二復(fù)制模塊,被配置為將所述數(shù)據(jù)塊中非刪除文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到所述臨時文件中;替換模塊,被配置為以所述臨時文件替換所述數(shù)據(jù)塊中原始寫入文件,完成所述數(shù)據(jù)塊的存儲空間回收。在另一個實施例中,所述裝置還包括:第一設(shè)置模塊,被配置為為所述數(shù)據(jù)塊中包含的每一個文件均設(shè)置一個刪除標(biāo)識,所述刪除標(biāo)識存儲在每一個文件的文件頭中;第二設(shè)置模塊,被配置為為所述待刪除文件中的每一個文件的刪除標(biāo)識設(shè)置第一標(biāo)記。在另一個實施例中,所述第一復(fù)制模塊,被配置為若所述數(shù)據(jù)塊中一個文件的刪除標(biāo)識取值為所述第一標(biāo)記,則確定所述文件為待刪除文件,將所述文件的文件頭復(fù)制到所述臨時文件中,并調(diào)用系統(tǒng)指針在所述文件的除文件頭之外的其他部分添加文件洞。在另一個實施例中,所述第一復(fù)制模塊,被配置為若至少兩個連續(xù)存儲文件的刪除標(biāo)識均取值為所述第一標(biāo)記,則在所述至少兩個連續(xù)存儲的文件中選取一個文件的文件頭;將所述文件頭中存儲的文件尺寸更新為所述至少兩個連續(xù)存儲文件的文件尺寸之和;將更新后的文件頭復(fù)制到所述臨時文件中,并調(diào)用系統(tǒng)指針在所述文件的除文件頭之外的其他部分中添加文件洞。在另一個實施例中,所述第一復(fù)制模塊,被配置為調(diào)用所述系統(tǒng)指針依次跳過所述文件的文件數(shù)據(jù)和文件尾,以在所述文件數(shù)據(jù)以及所述文件尾的存儲位置處形成文件洞。在另一個實施例中,所述第二復(fù)制模塊,被配置為若所述數(shù)據(jù)塊中一個文件的刪除標(biāo)識取值為第二標(biāo)記,則確定所述文件為所述非刪除文件,將所述文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到所述臨時文件中。在另一個實施例中,所述裝置還包括:發(fā)送模塊,被配置為在接收到所述分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求后,將所述存儲空間收回請求發(fā)送至存儲有所述數(shù)據(jù)塊的其他副本的其他數(shù)據(jù)節(jié)點;返回模塊,被配置為在均完成對所述數(shù)據(jù)塊的存儲空間回收操作后,向所述主節(jié)點返回空間回收完成響應(yīng)。根據(jù)本公開實施例的第四方面,提供一種存儲空間回收裝置,包括:第一獲取模塊,被配置為周期性獲取分布式文件系統(tǒng)中存儲的數(shù)據(jù)塊狀態(tài)表,所述數(shù)據(jù)塊狀態(tài)表中記錄了至少一個數(shù)據(jù)塊的刪除文件尺寸和待刪除文件的文件標(biāo)識;第二獲取模塊,被配置為對于每一個數(shù)據(jù)塊,若所述數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值,則獲取所述數(shù)據(jù)塊的屬性信息;發(fā)送模塊,被配置為根據(jù)所述屬性信息,向所述數(shù)據(jù)塊所在的數(shù)據(jù)節(jié)點發(fā)送存儲空間回收請求,所述存儲空間回收請求中至少包括所述數(shù)據(jù)塊中待刪除文件的文件標(biāo)識,所述數(shù)據(jù)節(jié)點用于根據(jù)所述文件標(biāo)識在所述數(shù)據(jù)塊中確定待刪除文件,并對所述待刪除文件執(zhí)行添加文件洞處理,完成所述數(shù)據(jù)塊的存儲空間回收。根據(jù)本公開實施例的第五方面,提供一種存儲空間回收裝置,包括:處理器;用于存儲處理器可執(zhí)行指令的存儲器;其中,所述處理器被配置為:接收分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求,所述存儲空間回收請求至少包括一個數(shù)據(jù)塊中待刪除文件的文件標(biāo)識,所述存儲空間回收請求是由所述主節(jié)點在確定所述數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值后發(fā)送的;根據(jù)所述文件標(biāo)識在所述數(shù)據(jù)塊中確定所述待刪除文件,將所述待刪除文件的文件頭復(fù)制到臨時文件中,并對所述待刪除文件執(zhí)行添加文件洞處理;將所述數(shù)據(jù)塊中非刪除文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到所述臨時文件中;以所述臨時文件替換所述數(shù)據(jù)塊中原始寫入文件,完成所述數(shù)據(jù)塊的存儲空間回收。根據(jù)本公開實施例的第六方面,提供一種存儲空間回收裝置,包括:處理器;用于存儲處理器可執(zhí)行指令的存儲器;其中,所述處理器被配置為:周期性獲取分布式文件系統(tǒng)中存儲的數(shù)據(jù)塊狀態(tài)表,所述數(shù)據(jù)塊狀態(tài)表中記錄了至少一個數(shù)據(jù)塊的刪除文件尺寸和待刪除文件的文件標(biāo)識;對于每一個數(shù)據(jù)塊,若所述數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值,則獲取所述數(shù)據(jù)塊的屬性信息;根據(jù)所述屬性信息,向所述數(shù)據(jù)塊所在的數(shù)據(jù)節(jié)點發(fā)送存儲空間回收請求,所述存儲空間回收請求中至少包括所述數(shù)據(jù)塊中待刪除文件的文件標(biāo)識,所述數(shù)據(jù)節(jié)點用于根據(jù)所述文件標(biāo)識在所述數(shù)據(jù)塊中確定待刪除文件,并對所述待刪除文件執(zhí)行添加文件洞處理,完成所述數(shù)據(jù)塊的存儲空間回收。本公開的實施例提供的技術(shù)方案可以包括以下有益效果:在接收到分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求后,數(shù)據(jù)節(jié)點會根據(jù)該存儲空間回收請求中的文件標(biāo)識,在該數(shù)據(jù)塊中確定該待刪除文件,將該待刪除文件的文件頭復(fù)制到臨時文件中,并對該待刪除文件執(zhí)行添加文件洞處理;此外,還將該數(shù)據(jù)塊中非刪除文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到該臨時文件中;之后,以該臨時文件替換該數(shù)據(jù)塊中原始寫入文件,完成該數(shù)據(jù)塊的存儲空間回收。由于文件洞不占用存儲空間,因此通過對待刪除文件執(zhí)行添加文件洞處理,可實現(xiàn)對這些文件的刪除并將這些文件所占用的存儲空間進行回收,不但無需改變未刪除文件的存儲位置且不需要使用索引文件,該種存儲空間回收方式效果較佳。應(yīng)當(dāng)理解的是,以上的一般描述和后文的細節(jié)描述僅是示例性和解釋性的,并不能限制本公開。附圖說明此處的附圖被并入說明書中并構(gòu)成本說明書的一部分,示出了符合本發(fā)明的實施例,并與說明書一起用于解釋本發(fā)明的原理。圖1是根據(jù)一示例性實施例示出的一種分布式文件系統(tǒng)的架構(gòu)圖。圖2是根據(jù)一示例性實施例示出的一種存儲空間回收方法的流程圖。圖3是根據(jù)一示例性實施例示出的一種存儲空間回收方法的流程圖。圖4是根據(jù)一示例性實施例示出的一種存儲空間回收方法的流程圖。圖5是根據(jù)一示例性實施例示出的一種存儲空間回收裝置的框圖。圖6是根據(jù)一示例性實施例示出的一種存儲空間回收裝置的框圖。圖7是根據(jù)一示例性實施例示出的一種存儲空間回收裝置的框圖。圖8是根據(jù)一示例性實施例示出的一種存儲空間回收裝置的框圖。圖9是根據(jù)一示例性實施例示出的一種存儲空間回收裝置的框圖。具體實施方式這里將詳細地對示例性實施例進行說明,其示例表示在附圖中。下面的描述涉及附圖時,除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實施例中所描述的實施方式并不代表與本發(fā)明相一致的所有實施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本發(fā)明的一些方面相一致的裝置和方法的例子。在對本公開實施例進行詳細的解釋說明之前,先對本公開實施例涉及的分布式文件系統(tǒng)的架構(gòu)進行簡單介紹。參見圖1,該分布式文件系統(tǒng)的架構(gòu)中包括客戶端(Client)、主節(jié)點(MasterNode)、從節(jié)點(SlaveNode)、數(shù)據(jù)節(jié)點(DataNode)以及磁盤(Storage)。其中,客戶端負責(zé)提供文件的讀寫接口。需要說明的是,此處的客戶端并不等同于一般意義上的個人固定終端或個人移動終端等客戶端,其本質(zhì)上為分布式文件系統(tǒng)提供的應(yīng)用服務(wù)器。主節(jié)點和從節(jié)點構(gòu)成了MHA(MasterHighAvailability,主節(jié)點高可用)架構(gòu)。主節(jié)點負責(zé)存儲分布式文件系統(tǒng)的相關(guān)元數(shù)據(jù)信息,包括數(shù)據(jù)塊(Block)的分布信息和當(dāng)前所有數(shù)據(jù)節(jié)點的信息。數(shù)據(jù)節(jié)點負責(zé)存儲文件的數(shù)據(jù)和相關(guān)的元數(shù)據(jù)信息,按Block的方式存儲,文件占用Block的一部分。Block按照多副本的方式存放在多個數(shù)據(jù)節(jié)點上,一個數(shù)據(jù)節(jié)點上可能有多個磁盤。本公開實施例對上述Block副本個數(shù)及數(shù)據(jù)節(jié)點上的磁盤數(shù)量均不進行具體限定。當(dāng)主節(jié)點出現(xiàn)故障時,從節(jié)點可代替主節(jié)點執(zhí)行相應(yīng)功能。在本公開實施例中,主節(jié)點中運行有進程CompactManager(壓縮管理器),用于實現(xiàn)存儲空間回收。正常情況下,CompactManager周期性獲取分布式文件系統(tǒng)中存儲的數(shù)據(jù)塊狀態(tài)表,從該數(shù)據(jù)塊狀態(tài)表中獲取一個數(shù)據(jù)塊的刪除文件尺寸和該數(shù)據(jù)塊中待刪除文件的文件標(biāo)識。若該數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值,則此時需要對該待刪除文件執(zhí)行添加文件洞處理,實現(xiàn)在刪除這些文件后對已刪除文件所占用存儲空間的回收。圖2是根據(jù)一示例性實施例示出的一種存儲空間回收方法的流程圖,如圖2所示,該方法用于數(shù)據(jù)節(jié)點中,包括以下步驟。在步驟201中,接收分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求,該存儲空間回收請求至少包括一個數(shù)據(jù)塊中待刪除文件的文件標(biāo)識,該存儲空間回收請求是由該主節(jié)點在確定該數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值后發(fā)送的。在步驟202中,根據(jù)文件標(biāo)識在數(shù)據(jù)塊中確定待刪除文件,將該待刪除文件的文件頭復(fù)制到臨時文件中,并對該待刪除文件執(zhí)行添加文件洞處理。在步驟203中,將數(shù)據(jù)塊中非刪除文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到臨時文件中。在步驟204中,以臨時文件替換該數(shù)據(jù)塊中原始寫入文件,完成該數(shù)據(jù)塊的存儲空間回收。本公開實施例提供的方法,在接收到分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求后,數(shù)據(jù)節(jié)點會根據(jù)該存儲空間回收請求中的文件標(biāo)識,在該數(shù)據(jù)塊中確定該待刪除文件,將該待刪除文件的文件頭復(fù)制到臨時文件中,并對該待刪除文件執(zhí)行添加文件洞處理;此外,還將該數(shù)據(jù)塊中非刪除文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到該臨時文件中;之后,以該臨時文件替換該數(shù)據(jù)塊中原始寫入文件,完成該數(shù)據(jù)塊的存儲空間回收。由于文件洞不占用存儲空間,因此通過對待刪除文件執(zhí)行添加文件洞處理,可實現(xiàn)對這些文件的刪除并將這些文件所占用的存儲空間進行回收,不但無需改變未刪除文件的存儲位置且不需要使用索引文件,該種存儲空間回收方式效果較佳。在另一個實施例中,該方法還包括:為數(shù)據(jù)塊中包含的每一個文件均設(shè)置一個刪除標(biāo)識,該刪除標(biāo)識存儲在每一個文件的文件頭中;為待刪除文件中的每一個文件的刪除標(biāo)識設(shè)置第一標(biāo)記。在另一個實施例中,將待刪除文件的文件頭復(fù)制到臨時文件中,并對該待刪除文件執(zhí)行添加文件洞處理,包括:若數(shù)據(jù)塊中一個文件的刪除標(biāo)識取值為第一標(biāo)記,則確定該文件為待刪除文件,將該文件的文件頭復(fù)制到臨時文件中,并調(diào)用系統(tǒng)指針在該文件的除文件頭之外的其他部分添加文件洞。在另一個實施例中,將待刪除文件的文件頭復(fù)制到臨時文件中,并對該待刪除文件執(zhí)行添加文件洞處理,包括:若至少兩個連續(xù)存儲文件的刪除標(biāo)識均取值為所述第一標(biāo)記,則在該至少兩個連續(xù)存儲的文件中選取一個文件的文件頭;將文件頭中存儲的文件尺寸更新為該至少兩個連續(xù)存儲文件的文件尺寸之和;將更新后的文件頭復(fù)制到臨時文件中,并調(diào)用系統(tǒng)指針在該文件的除文件頭之外的其他部分中添加文件洞。在另一個實施例中,調(diào)用系統(tǒng)指針在文件除文件頭之外的其他部分中添加文件洞,包括:調(diào)用系統(tǒng)指針依次跳過該文件的文件數(shù)據(jù)和文件尾,以在該文件數(shù)據(jù)以及該文件尾的存儲位置處形成文件洞。在另一個實施例中,將數(shù)據(jù)塊中非刪除文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到臨時文件中,包括:若數(shù)據(jù)塊中一個文件的刪除標(biāo)識取值為第二標(biāo)記,則確定該文件為非刪除文件,將該文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到臨時文件中。在另一個實施例中,該方法還包括:在接收到分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求后,將該存儲空間回收請求發(fā)送至存儲有該數(shù)據(jù)塊的其他副本的其他數(shù)據(jù)節(jié)點;在均完成對數(shù)據(jù)塊的存儲空間回收操作后,向主節(jié)點返回空間回收完成響應(yīng)。上述所有可選技術(shù)方案,可以采用任意結(jié)合形成本公開的可選實施例,在此不再一一贅述。圖3是根據(jù)一示例性實施例示出的一種存儲空間回收方法的流程圖,如圖3所示,該方法用于主節(jié)點中,包括以下步驟。在步驟301中,周期性獲取分布式文件系統(tǒng)中存儲的數(shù)據(jù)塊狀態(tài)表,該數(shù)據(jù)塊狀態(tài)表中記錄了至少一個數(shù)據(jù)塊的刪除文件尺寸和待刪除文件的文件標(biāo)識。在步驟302中,對于每一個數(shù)據(jù)塊,若該數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值,則獲取該數(shù)據(jù)塊的屬性信息。在步驟303中,根據(jù)屬性信息,向數(shù)據(jù)塊所在的數(shù)據(jù)節(jié)點發(fā)送存儲空間回收請求,該存儲空間回收請求中至少包括該數(shù)據(jù)塊中待刪除文件的文件標(biāo)識,數(shù)據(jù)節(jié)點用于根據(jù)該文件標(biāo)識在該數(shù)據(jù)塊中確定待刪除文件,并對該待刪除文件執(zhí)行添加文件洞處理,完成該數(shù)據(jù)塊的存儲空間回收。本公開實施例提供的方法,在周期性獲取到分布式文件系統(tǒng)中存儲的數(shù)據(jù)塊狀態(tài)表后,獲取該數(shù)據(jù)塊狀態(tài)表中記錄的數(shù)據(jù)塊的刪除文件尺寸和待刪除文件的文件標(biāo)識;對于每一個數(shù)據(jù)塊,若該數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值,則獲取該數(shù)據(jù)塊的屬性信息;根據(jù)該屬性信息,向該數(shù)據(jù)塊所在的數(shù)據(jù)節(jié)點發(fā)送存儲空間回收請求,由該數(shù)據(jù)節(jié)點根據(jù)文件標(biāo)識在該數(shù)據(jù)塊中確定待刪除文件,并對該待刪除文件執(zhí)行添加文件洞處理,完成該數(shù)據(jù)塊的存儲空間回收。由于文件洞不占用存儲空間,因此通過對待刪除文件執(zhí)行添加文件洞處理,可實現(xiàn)對這些文件的刪除并將這些文件所占用的存儲空間進行回收,不但無需改變未刪除文件的存儲位置且不需要使用索引文件,該種存儲空間回收方式效果較佳。圖4是根據(jù)一示例性實施例示出的一種存儲空間回收方法的流程圖。交互主體包括數(shù)據(jù)節(jié)點及主節(jié)點,如圖4所示,包括以下步驟。在步驟401中,主節(jié)點周期性獲取分布式文件系統(tǒng)中存儲的數(shù)據(jù)塊狀態(tài)表BlockStatTable。在本公開實施例中,數(shù)據(jù)塊狀態(tài)表BlockStatTable存儲在數(shù)據(jù)庫中,該數(shù)據(jù)塊狀態(tài)表BlockStatTable可如下表1所示,記錄了至少一個數(shù)據(jù)塊的塊標(biāo)識Blockid、刪除文件尺寸RemoveSize及待刪除文件的文件標(biāo)識Fileid。其中,F(xiàn)ileid包括Blockid和BlockOffset。數(shù)據(jù)塊狀態(tài)表BlockStatTable除包括下述三項內(nèi)容外,還可包括其他內(nèi)容,本公開實施例對數(shù)據(jù)塊狀態(tài)表BlockStatTable包括的內(nèi)容,塊標(biāo)識Blockid、刪除文件尺寸RemoveSize及文件標(biāo)識Fileid的表示方法均不進行具體限定。其中,至少一個數(shù)據(jù)塊指代分布式文件系統(tǒng)的各個數(shù)據(jù)節(jié)點上有文件刪除的數(shù)據(jù)塊。表1數(shù)據(jù)塊的塊標(biāo)識刪除文件尺寸/MB待刪除文件的文件標(biāo)識Block118File1Block212File2………BlockNMFileL數(shù)據(jù)庫存在于圖1所示的MHA架構(gòu)中。對于一個數(shù)據(jù)塊來說,當(dāng)該數(shù)據(jù)塊中有文件需要刪除時,便更新數(shù)據(jù)塊狀態(tài)表BlockStatTable,將待刪除文件的文件標(biāo)識Fileid寫入該數(shù)據(jù)塊狀態(tài)表BlockStatTable中,并根據(jù)這些待刪除文件對數(shù)據(jù)塊狀態(tài)表BlockStatTable中當(dāng)前統(tǒng)計的刪除文件尺寸RemoveSize進行重新統(tǒng)計,以覆蓋更新前統(tǒng)計的刪除文件尺寸RemoveSize。主節(jié)點可啟動一個新的進程CompactManager來周期性獲取上述數(shù)據(jù)塊狀態(tài)表BlockStatTable。其中,周期性可指代每隔預(yù)設(shè)時長進行一次數(shù)據(jù)塊狀態(tài)表BlockStatTable的獲取。例如,預(yù)設(shè)時長為15min,則進程CompactManager每隔15min進行一次數(shù)據(jù)塊狀態(tài)表BlockStatTable的獲取。本公開實施例對主節(jié)點獲取數(shù)據(jù)塊狀態(tài)表BlockStatTable的方式及時間均不進行具體限定。在步驟402中,對于每一個數(shù)據(jù)塊,主節(jié)點基于該數(shù)據(jù)塊的刪除文件尺寸RemoveSize,判斷該數(shù)據(jù)塊是否需要回收存儲空間;若該數(shù)據(jù)塊的刪除文件尺寸RemoveSize大于預(yù)設(shè)閾值,則執(zhí)行下述步驟403。在本公開實施例中,預(yù)設(shè)閾值可以為一個具體的數(shù)值。如若一個數(shù)據(jù)塊存儲空間為512MB,則預(yù)設(shè)閾值可以為300MB。繼續(xù)以該數(shù)值為例,當(dāng)刪除文件尺寸RemoveSize為400MB,大于預(yù)設(shè)閾值300MB時,這時刪除文件尺寸RemoveSize已經(jīng)占用數(shù)據(jù)塊78%的存儲空間,為提高空間利用率,需要進行存儲空間回收。其中,本公開實施例對預(yù)設(shè)閾值的數(shù)值大小及數(shù)據(jù)塊的存儲空間大小不進行具體限定。需要說明的是,若數(shù)據(jù)塊狀態(tài)表BlockStatTable記錄的該數(shù)據(jù)塊的刪除文件尺寸RemoveSize不大于預(yù)設(shè)閾值,則不需要對該數(shù)據(jù)塊執(zhí)行回收存儲空間操作,處理流程至此結(jié)束。在步驟403中,若該數(shù)據(jù)塊的刪除文件尺寸RemoveSize大于預(yù)設(shè)閾值,則主節(jié)點確定該數(shù)據(jù)塊需要進行存儲空間回收并獲取該數(shù)據(jù)塊的屬性信息。在本公開實施例中,數(shù)據(jù)塊的屬性信息存儲在數(shù)據(jù)塊屬性列表BlockAttributeTable中,該數(shù)據(jù)塊屬性列表BlockAttributeTable同樣存在于步驟401所述的數(shù)據(jù)庫中。該數(shù)據(jù)塊屬性列表BlockAttributeTable可如下表2所示,用于存儲數(shù)據(jù)塊的塊標(biāo)識Blockid,以及該數(shù)據(jù)塊所屬的數(shù)據(jù)節(jié)點的節(jié)點標(biāo)識DataNodeid。其中,主節(jié)點在根據(jù)數(shù)據(jù)塊狀態(tài)表BlockStatTable確定該數(shù)據(jù)塊需要回收存儲空間后,根據(jù)該數(shù)據(jù)塊的塊標(biāo)識Blockid在數(shù)據(jù)塊屬性列表BlockAttributeTable中確定該數(shù)據(jù)塊所屬的數(shù)據(jù)節(jié)點的節(jié)點標(biāo)識DataNodeid。表2例如,當(dāng)確定需要回收存儲空間的數(shù)據(jù)塊的塊標(biāo)識Blockid為Block1,則根據(jù)數(shù)據(jù)塊屬性列表BlockAttributeTable可以確定該數(shù)據(jù)塊所屬的數(shù)據(jù)節(jié)點為DataNode1;當(dāng)確定需要回收存儲空間的數(shù)據(jù)塊的塊標(biāo)識Blockid為Block2,則根據(jù)數(shù)據(jù)塊屬性列表BlockAttributeTable可以確定該數(shù)據(jù)塊所屬的數(shù)據(jù)節(jié)點為DataNode1。本公開實施例對數(shù)據(jù)塊屬性列表BlockAttributeTable的形式、塊標(biāo)識Blockid的表示方法、節(jié)點標(biāo)識DataNodeid的表示方法及數(shù)據(jù)節(jié)點上的數(shù)據(jù)塊個數(shù)均不進行具體限定。在步驟404中,主節(jié)點根據(jù)該數(shù)據(jù)塊的屬性信息,向該數(shù)據(jù)塊所在的數(shù)據(jù)節(jié)點發(fā)送存儲空間回收請求CompactRequest。在本公開實施例中,存儲空間回收請求CompactRequest至少包括該數(shù)據(jù)塊中待刪除文件的文件標(biāo)識Fileid。其中,由于數(shù)據(jù)塊按照多副本的方式存儲在多個數(shù)據(jù)節(jié)點上,因此該數(shù)據(jù)塊所在數(shù)據(jù)節(jié)點在接收到主節(jié)點發(fā)送的存儲空間回收請求CompactRequest后,會將該存儲空間回收請求CompactRequest立即發(fā)送至存儲有該數(shù)據(jù)塊的其他副本的其他數(shù)據(jù)節(jié)點,以便其他數(shù)據(jù)節(jié)點同樣進行數(shù)據(jù)塊的存儲空間回收。在步驟405中,該數(shù)據(jù)節(jié)點在接收到該存儲空間回收請求CompactRequest后,根據(jù)該存儲空間回收請求CompactRequest中的文件標(biāo)識Fileid在該數(shù)據(jù)塊中確定待刪除文件。在本公開實施例中,為了便于對待刪除文件和非刪除文件進行區(qū)分,會為該數(shù)據(jù)塊中包含的每一個文件均設(shè)置一個刪除標(biāo)識RemoveFlag,該刪除標(biāo)識RemoveFlag保存在每一個文件的文件頭FileHeader中。當(dāng)一個文件為待刪除文件時,其刪除標(biāo)識RemoveFlag為第一標(biāo)記;當(dāng)一個文件為非刪除文件時,其刪除標(biāo)識為第二標(biāo)記。其中,每一個文件都包括文件頭FileHeader、文件數(shù)據(jù)FileData及文件尾FileFooter。對于一個文件來說,該刪除標(biāo)識RemoveFlag默認為第二標(biāo)記。在該數(shù)據(jù)節(jié)點中的CompactSever,在對該數(shù)據(jù)塊進行掃描得到每一個文件后,若根據(jù)上述文件標(biāo)識Fileid確定待刪除文件后,會將這些文件的刪除標(biāo)識RemoveFlag由第二標(biāo)記更新為第一標(biāo)記。其中,第一標(biāo)記可以用True(真)表示,第二標(biāo)記可以用False(假)表示。例如,若根據(jù)存儲空間回收請求CompactRequest中的文件標(biāo)識Fileid確定該待刪除文件為文件A,則將文件A的文件頭FileHeader中設(shè)置為False的刪除標(biāo)識RemoveFlag重置為True;若文件B的文件標(biāo)識Fileid沒有包括在存儲空間回收請求CompactRequest中,則文件B的文件頭FileHeader中設(shè)置為False的刪除標(biāo)識RemoveFlag保持不變。本公開實施例對刪除標(biāo)識RemoveFlag的表示方式不進行具體限定。在步驟406中,對于待刪除文件,該數(shù)據(jù)節(jié)點將待刪除文件的文件頭FileHeader復(fù)制到臨時文件TmpBlock中,并對該文件執(zhí)行添加文件洞FileHole處理。其中,若該數(shù)據(jù)塊中一個文件的刪除標(biāo)識RemoveFlag取值為第一標(biāo)記,則確定這個文件為待刪除文件。文件洞FileHole指代文件中的空字符文件。對于該空字符文件,數(shù)據(jù)塊不分配存儲空間進行存儲,因此文件洞FileHole并不占用數(shù)據(jù)塊中的存儲空間。在本公開實施例中,在對文件執(zhí)行添加文件洞FileHole處理時,需要使用操作系統(tǒng)調(diào)用系統(tǒng)指針lseek執(zhí)行。例如,可以使用Linux(類多用戶計算機操作系統(tǒng))調(diào)用系統(tǒng)指針lseek跳過該文件的文件數(shù)據(jù)FileData和文件尾FileFooter,在該文件的文件數(shù)據(jù)FileData及文件尾FileFooter的存儲位置處形成文件洞FileHole。其中,本公開實施例對添加文件洞FileHole使用的操作系統(tǒng)不進行具體限定。在另一個實施例中,若在數(shù)據(jù)塊中至少兩個連續(xù)存儲文件的刪除標(biāo)識RemoveFlag均取值為第一標(biāo)記,則在該至少兩個連續(xù)存儲的文件中選取一個文件的文件頭FileHeader,將該文件頭FileHeader中存儲的文件尺寸FileSize更新為該至少兩個連續(xù)存儲文件的文件尺寸FileSize之和,并將該更新后的文件頭FileHeader復(fù)制到上述臨時文件TmpBlock中;之后調(diào)用系統(tǒng)指針lseek,在該至少兩個連續(xù)存儲文件的除文件頭FileHeader之外的其他部分(包括文件數(shù)據(jù)FileData和文件尾FileFooter)中添加文件洞FileHole,以減少存儲空間的浪費。例如,文件A的FileHeader為A-18,其中18為文件A的文件尺寸FileSize;文件B的FileHeader為B-12,其中12為文件B的文件尺寸FileSize;文件A和文件B的刪除標(biāo)識RemoveFlag均為True,則選擇文件A的FileHeaderA-18,將FileHeaderA-18中的文件尺寸18改為文件A和文件B的文件尺寸FileSize之和,即30;之后,將FileHeader更新為A-30,再將更新后的FileHeaderA-30復(fù)制到上述臨時文件TmpBlock中;在文件A和文件B除FileHeader之外的其他部分中添加文件洞FileHole。其中,本公開實施例對FileHeader的表示方法及在至少兩個連續(xù)存儲的文件中選取文件的FileHeader的策略不進行具體限定。在步驟407中,對于非刪除文件,該數(shù)據(jù)節(jié)點將該非刪除文件的文件頭FileHeader、文件數(shù)據(jù)FileData和文件尾FileFooter復(fù)制到臨時文件TmpBlock中。在本公開實施例中,若文件的刪除標(biāo)識RemoveFlag取值為第二標(biāo)記,則確定該文件為非刪除文件,將該文件的文件頭FileHeader、文件數(shù)據(jù)FileData和文件尾FileFooter均復(fù)制到上述臨時文件TmpBlock中。在步驟408中,該數(shù)據(jù)節(jié)點以臨時文件TmpBlock替換數(shù)據(jù)塊中原始寫入數(shù)據(jù),完成數(shù)據(jù)塊的存儲空間回收。在本公開實施例中,當(dāng)所有數(shù)據(jù)節(jié)點均完成對該數(shù)據(jù)塊的存儲空間回收操作后,該數(shù)據(jù)節(jié)點會向主節(jié)點返回存儲空間回收完成響應(yīng)Response。其中,此處的該數(shù)據(jù)節(jié)點指代所有數(shù)據(jù)節(jié)點中的主數(shù)據(jù)節(jié)點。所有數(shù)據(jù)節(jié)點指代該數(shù)據(jù)節(jié)點及該數(shù)據(jù)塊的其他副本所屬的其他數(shù)據(jù)節(jié)點,即從數(shù)據(jù)節(jié)點。其中,文件標(biāo)識Fileid包括塊標(biāo)識Blockid及塊偏移量BlockOffset,在對存儲空間的回收處理過程中,由于沒有對任何文件進行移動,因此對于非刪除文件,根據(jù)初始的Blockid及BlockOffset進行數(shù)據(jù)替換,以保證文件的存儲位置不變。本公開實施例提供的方法,在接收到分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求后,數(shù)據(jù)節(jié)點會根據(jù)該存儲空間回收請求中的文件標(biāo)識,在該數(shù)據(jù)塊中確定該待刪除文件,將該待刪除文件的文件頭復(fù)制到臨時文件中,并對該待刪除文件執(zhí)行添加文件洞處理;此外,還將該數(shù)據(jù)塊中非刪除文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到該臨時文件中;之后,以該臨時文件替換該數(shù)據(jù)塊中原始寫入文件,完成該數(shù)據(jù)塊的存儲空間回收。由于文件洞不占用存儲空間,因此通過對待刪除文件執(zhí)行添加文件洞處理,可實現(xiàn)對這些文件的刪除并將這些文件所占用的存儲空間進行回收,不但無需改變未刪除文件的存儲位置且不需要使用索引文件,該種存儲空間回收方式效果較佳。圖5是根據(jù)一示例性實施例示出的一種存儲空間回收裝置的框圖。參照圖5,該裝置包括接收模塊501,第一復(fù)制模塊502,第二復(fù)制模塊503,替換模塊504。該接收模塊501,被配置為接收分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求,所述存儲空間回收請求至少包括一個數(shù)據(jù)塊中待刪除文件的文件標(biāo)識,所述存儲空間回收請求是由所述主節(jié)點在確定所述數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值后發(fā)送的;該第一復(fù)制模塊502,被配置為根據(jù)所述文件標(biāo)識在所述數(shù)據(jù)塊中確定所述待刪除文件,將所述待刪除文件的文件頭復(fù)制到臨時文件中,并對所述待刪除文件執(zhí)行添加文件洞處理;該第二復(fù)制模塊503,被配置為將所述數(shù)據(jù)塊中非刪除文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到所述臨時文件中;該替換模塊504,被配置為以所述臨時文件替換所述數(shù)據(jù)塊中原始寫入文件,完成所述數(shù)據(jù)塊的存儲空間回收。在另一個實施例中,參見圖6,該裝置還包括第一設(shè)置模塊505,第二設(shè)置模塊506:該第一設(shè)置模塊505,被配置為為所述數(shù)據(jù)塊中包含的每一個文件均設(shè)置一個刪除標(biāo)識,所述刪除標(biāo)識存儲在每一個文件的文件頭中;該第二設(shè)置模塊506,被配置為為所述待刪除文件中的每一個文件的刪除標(biāo)識設(shè)置第一標(biāo)記。在另一個實施例中,第一復(fù)制模塊502,被配置為若所述數(shù)據(jù)塊中一個文件的刪除標(biāo)識取值為所述第一標(biāo)記,則確定所述文件為待刪除文件,將所述文件的文件頭復(fù)制到所述臨時文件中,并調(diào)用系統(tǒng)指針在所述文件的除文件頭之外的其他部分添加文件洞。在另一個實施例中,第一復(fù)制模塊502,被配置為若至少兩個連續(xù)存儲文件的刪除標(biāo)識均取值為所述第一標(biāo)記,則在所述至少兩個連續(xù)存儲的文件中選取一個文件的文件頭;將所述文件頭中存儲的文件尺寸更新為所述至少兩個連續(xù)存儲文件的文件尺寸之和;將更新后的文件頭復(fù)制到所述臨時文件中,并調(diào)用系統(tǒng)指針在所述文件的除文件頭之外的其他部分中添加文件洞。在另一個實施例中,第一復(fù)制模塊502,被配置為調(diào)用所述系統(tǒng)指針依次跳過所述文件的文件數(shù)據(jù)和文件尾,以在所述文件數(shù)據(jù)以及所述文件尾的存儲位置處形成文件洞。在另一個實施例中,該第二復(fù)制模塊503,被配置為若所述數(shù)據(jù)塊中一個文件的刪除標(biāo)識取值為第二標(biāo)記,則確定所述文件為所述非刪除文件,將所述文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到所述臨時文件中。在另一個實施例中,參見圖7,該裝置還包括發(fā)送模塊507,返回模塊508:該發(fā)送模塊507,被配置為在接收到所述分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求后,將所述存儲空間收回請求發(fā)送至存儲有所述數(shù)據(jù)塊的其他副本的其他數(shù)據(jù)節(jié)點;該返回模塊508,被配置為在均完成對所述數(shù)據(jù)塊的存儲空間回收操作后,向所述主節(jié)點返回空間回收完成響應(yīng)。本公開實施例提供的裝置,在接收到分布式文件系統(tǒng)中主節(jié)點發(fā)送的存儲空間回收請求后,數(shù)據(jù)節(jié)點會根據(jù)該存儲空間回收請求中的文件標(biāo)識,在該數(shù)據(jù)塊中確定該待刪除文件,將該待刪除文件的文件頭復(fù)制到臨時文件中,并對該待刪除文件執(zhí)行添加文件洞處理;此外,還將該數(shù)據(jù)塊中非刪除文件的文件頭、文件數(shù)據(jù)和文件尾復(fù)制到該臨時文件中;之后,以該臨時文件替換該數(shù)據(jù)塊中原始寫入文件,完成該數(shù)據(jù)塊的存儲空間回收。由于文件洞不占用存儲空間,因此通過對待刪除文件執(zhí)行添加文件洞處理,可實現(xiàn)對這些文件的刪除并將這些文件所占用的存儲空間進行回收,不但無需改變未刪除文件的存儲位置且不需要使用索引文件,該種存儲空間回收方式效果較佳。圖8根據(jù)一示例性實施例示出的一種存儲空間回收裝置的框圖。參照圖8,該裝置包括第一獲取模塊801,第二獲取模塊802,發(fā)送模塊803。該第一獲取模塊801,被配置為周期性獲取分布式文件系統(tǒng)中存儲的數(shù)據(jù)塊狀態(tài)表,所述數(shù)據(jù)塊狀態(tài)表中記錄了至少一個數(shù)據(jù)塊的刪除文件尺寸和待刪除文件的文件標(biāo)識;該第二獲取模塊802,被配置為對于每一個數(shù)據(jù)塊,若所述數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值,則獲取所述數(shù)據(jù)塊的屬性信息;該發(fā)送模塊803,被配置為根據(jù)所述屬性信息,向所述數(shù)據(jù)塊所在的數(shù)據(jù)節(jié)點發(fā)送存儲空間回收請求,所述存儲空間回收請求中至少包括所述數(shù)據(jù)塊中待刪除文件的文件標(biāo)識,所述數(shù)據(jù)節(jié)點用于根據(jù)所述文件標(biāo)識在所述數(shù)據(jù)塊中確定待刪除文件,并對所述待刪除文件執(zhí)行添加文件洞處理,完成所述數(shù)據(jù)塊的存儲空間回收。本公開實施例提供的裝置,在周期性獲取到分布式文件系統(tǒng)中存儲的數(shù)據(jù)塊狀態(tài)表后,獲取該數(shù)據(jù)塊狀態(tài)表中記錄的數(shù)據(jù)塊的刪除文件尺寸和待刪除文件的文件標(biāo)識;對于每一個數(shù)據(jù)塊,若該數(shù)據(jù)塊的刪除文件尺寸大于預(yù)設(shè)閾值,則獲取該數(shù)據(jù)塊的屬性信息;根據(jù)該屬性信息,向該數(shù)據(jù)塊所在的數(shù)據(jù)節(jié)點發(fā)送存儲空間回收請求,由該數(shù)據(jù)節(jié)點根據(jù)文件標(biāo)識在該數(shù)據(jù)塊中確定待刪除文件,并對該待刪除文件執(zhí)行添加文件洞處理,完成該數(shù)據(jù)塊的存儲空間回收。由于文件洞不占用存儲空間,因此通過對待刪除文件執(zhí)行添加文件洞處理,可實現(xiàn)對這些文件的刪除并將這些文件所占用的存儲空間進行回收,不但無需改變未刪除文件的存儲位置且不需要使用索引文件,該種存儲空間回收方式效果較佳。圖9是根據(jù)一示例性實施例示出的一種存儲空間回收裝置900的框圖。例如,裝置900可以被提供為一服務(wù)器。參照圖9,裝置900包括處理組件922,其進一步包括一個或多個處理器,以及由存儲器932所代表的存儲器資源,用于存儲可由處理組件922的執(zhí)行的指令,例如應(yīng)用程序。存儲器932中存儲的應(yīng)用程序可以包括一個或一個以上的每一個對應(yīng)于一組指令的模塊。此外,處理組件922被配置為執(zhí)行指令,以執(zhí)行上述存儲空間回收方法。裝置900還可以包括一個電源組件926被配置為執(zhí)行裝置900的電源管理,一個有線或無線網(wǎng)絡(luò)接口950被配置為將裝置900連接到網(wǎng)絡(luò),和一個輸入輸出(I/O)接口958。裝置900可以操作基于存儲在存儲器932的操作系統(tǒng),例如WindowsServerTM,MacOSXTM,UnixTM,LinuxTM,F(xiàn)reeBSDTM或類似。本領(lǐng)域技術(shù)人員在考慮說明書及實踐這里公開的發(fā)明后,將容易想到本發(fā)明的其它實施方案。本申請旨在涵蓋本發(fā)明的任何變型、用途或者適應(yīng)性變化,這些變型、用途或者適應(yīng)性變化遵循本發(fā)明的一般性原理并包括本公開未公開的本
技術(shù)領(lǐng)域:
中的公知常識或慣用技術(shù)手段。說明書和實施例僅被視為示例性的,本發(fā)明的真正范圍和精神由下面的權(quán)利要求指出。應(yīng)當(dāng)理解的是,本發(fā)明并不局限于上面已經(jīng)描述并在附圖中示出的精確結(jié)構(gòu),并且可以在不脫離其范圍進行各種修改和改變。本發(fā)明的范圍僅由所附的權(quán)利要求來限制。當(dāng)前第1頁1 2 3