文件处理方法、装置、设备及介质与流程

    专利2022-07-08  133


    本发明实施例涉及分布式存储技术领域,尤其涉及一种文件处理方法、装置、设备及介质。



    背景技术:

    在分布式存储系统中,当某个节点上的数据丢失时,通常需要通过读取其他节点上的数据,将丢失的数据恢复出来,以保证数据的可靠性。

    然而,在实际的分布式存储系统中,会存在许多空洞文件。当需要对这些空洞文件进行数据修复时,如果按照原来的修复流程进行处理,在复制这些空洞文件时会写入“0”数据,从而占用磁盘空间导致磁盘空间浪费。而且,对于异常大的空洞文件进行修复时,由于需要对空洞文件大量填充“0”数据,因此会增加修复耗时,影响系统性能;同时,大量填充“0”数据,会导致数据量非常大,从而导致数据的传输开销也非常大。



    技术实现要素:

    本发明实施例中提供了一种文件处理方法、装置、设备及介质,以实现对空洞文件进行修复,缩小空洞文件中的空洞。

    第一方面,本发明实施例中提供了一种文件处理方法,包括:

    从待处理文件中读取待处理数据,其中所述待处理数据中文件空洞的取值为预设数值;

    若所述待处理数据的取值均为所述预设数值,则从所述待处理文件中删除所述待处理数据,以得到新待处理文件;

    比较所述待处理文件和所述新待处理文件的磁盘使用量,并根据比较结果进行文件修复。

    第二方面,本发明实施例中还提供了一种文件处理装置,包括:

    数据读取模块,用于从待处理文件中读取待处理数据,其中所述待处理数据中文件空洞的取值为预设数值;

    文件修改模块,用于若所述待处理数据的取值均为所述预设数值,则从所述待处理文件中删除所述待处理数据,以得到新待处理文件;

    文件比对模块,用于比较所述待处理文件和所述新待处理文件的磁盘使用量,并根据比较结果进行文件修复。

    第三方面,本发明实施例中还提供了一种电子设备,包括:

    一个或多个处理装置;

    存储装置,用于存储一个或多个程序;

    当所述一个或多个程序被所述一个或多个处理装置执行,使得所述一个或多个处理装置实现如本发明任意实施例中提供的所述文件处理方法。

    第四方面,本发明实施例中还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理装置执行时实现如本发明任意实施例中提供的所述文件处理方法。

    本发明实施例中提供了一种文件处理方案,在读取待处理文件时将读取的待处理数据中文件空洞的取值为预设数值,在此基础上,当检测到待处理数据为预设取值时,将待处理数据从待处理完文件中删除,通过比较删除待处理数据前后对应待处理文件和新待处理文件的磁盘使用量来判断待处理数据是否为空洞。采用本实施例的方案,通过比较结果可以将待处理文件的文件空洞尽可能地删除而将非文件空洞的数据进行保留,这样当需要对待处理文件进行文件修复时就可以直接利用保留的数据进行修复,而不需要在写入数据时针对文件空洞填充大量的“0”数据,降低了文件修复时的数据量,同时降低了分布式存储系统中实现节点间文件修复时远程传输数据的传输开销。

    上述发明内容仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。

    附图说明

    通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:

    图1是本发明实施例中提供的一种文件处理方法的流程图;

    图2是本发明实施例中提供的一种非空洞文件的磁盘占用空间和文件大小的示意图;

    图3是本发明实施例中提供的一种空洞文件的磁盘占用空间和文件大小的示意图;

    图4是本发明实施例中提供的另一种文件处理方法的流程图;

    图5是本发明实施例中提供的又一种文件处理方法的流程图;

    图6是本发明实施例中提供的又一种文件处理方法的流程图;

    图7是本发明实施例中提供的又一种文件处理方法的流程图;

    图8是本发明实施例中提供的一个大小为20g的空洞文件实际占用的磁盘空间的示意图;

    图9是本发明实施例中提供的修复文件前一个存储节点的实际占用磁盘空间的示意图;

    图10是本发明实施例中提供的采用传统方式进行文件修复后实际占用磁盘空间的示意图;

    图11是本发明实施例中提供的采用改进方案进行文件修复后实际占用磁盘空间的示意图;

    图12是本发明实施例中提供的一种文件处理装置的结构框图;

    图13是本发明实施例中提供的一种电子设备的结构示意图。

    具体实施方式

    下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。

    在更加详细地讨论示例性实施例之前,应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作(或步骤)描述成顺序的处理,但是其中的许多操作(或步骤)可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。

    为了更好地理解本发明实施例的技术方案,下面先简单介绍一下本实施例涉及的关键术语。文件空洞:在unix文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞。如果文件位移量比文件的当前长度更大,下一个写操作就会把文件“撑大”。这就是所谓的在文件里创造“文件空洞”,没有被实际写入文件的所有字节由重复的0表示。数据修复:为了保护数据的可靠性,当部分数据因所在的节点失败而丢失时,能够尽快利用存活节点上剩余的部分数据将其重新恢复出来,此过程被称为数据修复。

    图1是本发明实施例中提供的一种文件处理方法的流程图。本发明实施例可适用于在分布式存储系统中对节点间的空洞文件进行修复的情况。该方法可由文件处理装置执行,该装置可采用软件和/或硬件的方式实现,并集成在任何具有网络通信功能的电子设备上。其中,该电子设备可以为分布式存储系统中的节点设备,例如服务器等。如图1所示,本发明实施例中提供的文件处理方法,具体包括以下步骤:

    s110、从待处理文件中读取待处理数据,其中待处理数据中文件空洞的取值为预设数值。

    在本实施例中,ntfs以及大部分unix的文件系统都允许这种空洞文件类型的存在,比如稀疏文件,在某些应用上(数据库快照,日志文件等),给文件预留了很多空余空间,只有当数据写入时,文件系统才会分配磁盘空间块。如果应用程序中止或失效,空余空间没有填充,最终就成为了空洞文件,文件空洞并不影响文件数据的连续性。然而,当修复空洞文件时,如果仍然按照与正常文件一样的统一流程来修复,比如先读后写,并以“0”数据填充空洞的统一流程,会导致需要修复的文件写入大量的“0”数据,占用磁盘空间从而导致磁盘空间浪费。而且,对于异常大的空洞文件进行修复非常耗时。同时,如果不对空洞文件进行修复,则会让数据丢失冗余性。因此,在修复空洞文件时需要尽可能地缩小其文件空洞。

    在本实施例中,待处理文件是分布式存储系统中需要在节点间进行文件修复过程的文件,且待处理文件属于包含有文件空洞的空洞文件,而非未包含有文件空洞的正常文件。在分布式存储系统中,文件的read命令会把空洞文件中的空洞部分的数据读成“0”数据。正因如此,采用read命令和write命令拷贝一个空洞文件后,最终拷贝得到的文件是没有空洞的,也就是说空洞文件中的空洞部分已经被“0”数据填充。基于上述read命令的读数据的原理,从待处理文件中读取一部分待处理数据。如果待处理数据中包含文件空洞,那么read命令在读取待处理数据时会将待处理数据中的文件空洞读成预设数值,比如在linux中会将文件空洞读成“0”数据;而对于待处理数据中非文件空洞的数据会正常读出,而不会读成预设数值。在linux中,预设数值为“0”。

    s120、若待处理数据的取值均为预设数值,则从待处理文件中删除待处理数据,以得到新待处理文件。

    在本实施例中,以在linux中预设数值为“0”为例,对本步骤的相关内容进行解释说明。在待处理文件中读取待处理数据后,若检测到读取后的待处理数据的取值均为“0”,传统方式是将读取的该部分待处理数据认为是文件空洞而直接全部丢弃。然而,这样无法区分读取的该部分待处理数据是真实的“0”数据与空洞的“0”数据,如果该部分的待处理数据是真实的“0”数据,那么传统方式就会将真实的“0”数据直接丢弃,从而使得依据待处理数据修复的文件出现数据丢失的问题,造成数据不一致的风险。为此,若检测到读取后的待处理数据的取值均为“0”,本实施例的方案不会直接将读取的待处理数据进行丢弃,而是会在待处理文件中将该部分待处理数据进行删除,得到删除待处理数据后的新的待处理文件,记为新待处理文件。

    在本实施例中,可选地,在linux类型的分布式存储系统中,若待处理数据的取值不为预设数值,即待处理数据的取值不为“0”,则表明读取的该部分待处理数据中肯定不包含有文件空洞,此时可以将从待处理文件中读取的该部分的待处理数据直接保留下来,而不会去丢弃。

    s130、比较待处理文件和新待处理文件的磁盘使用量,并根据比较结果进行文件修复。

    在本实施例中,磁盘使用量是指待处理文件占用的磁盘空间的大小。一个文件占用的磁盘空间与一个文件的大小不等同。文件占用的磁盘空间取决于文件系统中的块(block)大小。例如,在linux中一般默认一个块大小是4k,那么一个大小为1个字节的文件,最小也要占用4k的磁盘空间。当然,如果创建文件系统时制定的块大小是16k,那么即便一个文件只有1个字节,该文件占用的磁盘空间也是一个块,即16k。可见,如果一个分区上主要放大文件,block可以设置的大一些,有利于减少磁盘碎片;如果主要放小文件,block可以设置小一下,否则太浪费磁盘空间。

    在本实施例中,通常情况下,文件的文件大小比文件占用的磁盘占用空间小。例如,图2是本发明实施例中提供的一种非空洞文件的磁盘占用空间和文件大小的示意图。这里以图2示出的非空洞文件为例,非空洞文件的文件大小是74682字节,设置文件系统的block大小是4k,一个74682字节的非空洞文件占用的磁盘空间是(74682/1024)k/4k=18.23个block,由于一个block只能被一个文件占用,因此上述非空洞文件实际占用的磁盘空间是19个block,就是19*4k=76k。但是,如果文件有比较大的空洞,就会出现文件大小比磁盘占用空间大的情况。图3是本发明实施例中提供的一种空洞文件的磁盘占用空间和文件大小的示意图。这里以图3示出的空洞文件为例,空洞文件的文件大小是20g,但是该空洞文件实际占用磁盘空间是68k。不难看出,空洞文件中的文件空洞并不会占用磁盘空间。

    基于上述分析,可以确定在从待处理文件中读取待处理数据之前的待处理文件的磁盘使用量,即确定待处理文件占用的磁盘空间,而不是确定待处理文件的文件大小。同时,还可以确定在从待处理文件中删除待处理数据后的新的待处理文件的磁盘使用量,即确定新待处理文件占用的磁盘空间。由于空洞文件中的文件空洞不会占用磁盘空间,因此可以通过比较待处理文件和新待处理文件占用的磁盘空间大小,来判断从待处理文件中读取的待处理数据是属于文件空洞,还是属于真实的“0”数据,从而可以保证将取值为预设数值且属于文件空洞的待处理数据进行舍弃,而将取值为预设数值且属于真实的“0”数据的待处理数据进行保留。

    在本实施例中,经过上述各个步骤,可以利用从待处理文件中读取并保留下来的取值为非预设数值,以及取值为预设数值且不是文件空洞的待处理数据来进行节点间的文件修复操作。可以理解的,在分布式文件存储系统中,具有冗余特征的节点资源类型包含:副本类型和纠删码类型。当节点资源(节点上的文件)故障被替换,或者离线再上线,为保持节点冗余,需要对节点上的资源进行数据修复。考虑到副本与纠删码的原理不同,当识别待处理文件中各个待处理数据是否为文件空洞后,需要利用保留下来的待处理数据分别采用对应不同的实现方案来进行具体修复,具体修复过程下面将继续详细阐述。

    本发明实施例中提供了一种文件处理方案,在读取待处理文件时将读取的待处理数据中文件空洞的取值为预设数值,在此基础上,当检测到待处理数据为预设取值时,将待处理数据从待处理完文件中删除,通过比较删除待处理数据前后对应待处理文件和新待处理文件的磁盘使用量来判断待处理数据是否为空洞。采用本实施例的方案,通过比较结果可以将待处理文件的文件空洞尽可能地删除缩小,而能够将非文件空洞的数据进行保留,这样当需要对待处理文件进行文件修复时就可以直接利用保留下来的数据进行修复,而不需要在写入数据时针对文件空洞填充大量的“0”数据,降低了文件修复时的数据量,同时降低文件修复时的数据量会大幅度降低分布式存储系统中实现节点间文件修复时远程传输数据的传输开销。

    在上述实施例的基础上,可选地,在从待处理文件中读取待处理数据的步骤之前,具体还包括:将节点间文件修复操作所需要的源文件备份到源文件所在节点的本地,并将备份得到的文件作为待处理文件。

    在本实施例中,考虑到在从待处理文件中读取待处理数据且确定读取后的待处理数据的取值为预设数值后,需要通过判断取值为预设数值的待处理数据是空洞的“0”数据还是真实的“0”数据,而完成上述判断需要对待处理文件进行数据删除操作并比较待处理文件和新待处理文件的磁盘使用量。如果待处理文件是源文件,那么就会造成对节点上的原始的文件发生改变,一旦改变就很难在对改变的源文件进行恢复。因此,可以对节点间文件修复操作所需要的源文件备份到本地。

    在本实施例中,考虑到源文件属于空洞文件,后续也需要利用空洞进行判断,因此在备份源文件时需要将源文件中的空洞进行保留,而不能在备份过程中将源文件中的空洞取值为预设数值,即不能在备份过程中将源文件中的空洞填充为“0”数据。采用上述方式的有益效果在于,可以避免在将文件空洞填充为“0”数据后,后续无法判断出文件中“0”数据是空洞的“0”数据还是真实的“0”数据;同时,大量填充空洞也会增加数据量,一旦后续无法准确识别出文件空洞,那么这些空洞的“0”数据会一直保留在待处理文件中,进而后续在进行文件修复时就会增加修复量。

    图4是本发明实施例中提供的另一种文件处理方法的流程图,本发明实施例在上述实施例的基础上进行进一步优化,本发明实施例可以与上述一个或者多个实施例中各个可选方案结合。如图4所示,本发明实施例中提供的文件处理方法具体包括以下步骤:

    s410、将节点间文件修复操作所需要的源文件备份到源文件所在节点的本地,并将备份得到的文件作为待处理文件;其中,待处理文件中保留了源文件的文件空洞。

    在本实施例中,虽然节点间文件修复操作所需要的源文件是空洞文件,但不是所有的空洞文件都需要进行空洞缩小处理,即不会对所有的空洞文件均进行空洞剔除。如果空洞文件的逻辑大小非常大,这类空洞文件中的文件空洞非常多,一旦对这类空洞文件剔除空洞,无疑需要进行大量的数据处理操作,占用较多的数据处理能力,从而影响其他文件修复操作。而如果空洞文件的逻辑大小非常小,这类空洞文件中的文件空洞非常少,也就没必要剔除空洞。

    鉴于上述情况,在将节点间文件修复操作所需要的源文件备份到源文件所在节点的本地的步骤之前,具体可以采用预设的文件逻辑大小区间范围对节点间文件修复操作所需要的源文件进行筛选,将文件逻辑大小不属于预设的文件逻辑大小区间范围的源文件进行剔除,而将属于预设的文件逻辑大小区间范围的源文件进行保留,以便备份得到待处理文件。

    在本实施例的,可选地,综合源文件所在节点的空闲磁盘空间大小v与允许修复的空洞文件的个数n,以及当前修复线程数t这三者因素得到平均修复空洞文件的逻辑大小h得到,其中,h=v/nt,并将该h作为预设的文件逻辑大小区间范围的上限值。此外,根据分布式存储系统的业务类型分布,允许自定义最小值h,比如某些业务生成的数据文件有限制文件大小,那么h值可以设为自定义大小,并将该h作为预设的文件逻辑大小区间范围的下限值。

    s420、若待处理文件为副本文件,则从待处理文件中读取固定逻辑长度的待处理数据,并记录起始读取位置和读取偏移量;其中待处理数据中文件空洞的取值为预设数值。

    在本实施例中,当通过文件修复进程打开待处理文件时,可以查询待处理文件的磁盘使用量,并将查询结果进行记录。当从待处理文件中读取待处理数据时,可以每次读取一个字节的待处理数据,但是这样的读取会出现大量的读操作,导致数据处理非常慢。因此,当从待处理文件中读取待处理数据时,可以从待处理文件中读取固定逻辑长度的待处理数据,实现一次性读取多个字节的待处理数据,避免造成多次读操作导致数据处理迟滞。可选地,为了方便对读取的待处理数据进行处理,可以从待处理文件中读取固定逻辑长度的待处理数据到预设的缓冲区。其中,读取的固定逻辑长度的待处理数据的逻辑长度可以与底层资源阵列的逻辑块大小保持一致。

    在本实施例中,当从待处理文件中读取固定逻辑长度的待处理数据时,需要记录读取的待处理数据在待处理文件中的起始读取位置和读取偏移量,这样就可以通过起始读取位置和读取偏移量获知从待处理文件中读取了哪些待处理数据。可选地,在待处理文件中标记上述的起始读取位置和读取偏移量。

    s430、若读取后的固定逻辑长度的待处理数据的取值不均为预设数值,则将该取值不均为预设数值的待处理数据保留下来。

    在本实施例中,仍以预设数值为“0”为例进行说明,当从待处理文件中读取固定逻辑长度的待处理数据时,如果该固定逻辑长度的待处理数据中包含有文件空洞,那么在读操作时会将包含的文件空洞取值为“0”,当然,固定逻辑长度的待处理数据中还可能包含有真实的“0”。因此,若读取后的固定逻辑长度的待处理数据的取值不均为预设数值“0”,则可以认定该固定逻辑长度的待处理数据中包含有空洞“0”和真实的“0”以外的其他数据,而这些数据是不可以丢弃的需要直接保留下来。

    在一个可选示例中,若从待处理文件中读取固定逻辑长度的待处理数据到预设的缓冲区,则对缓冲区中固定逻辑长度的待处理数据进行循环比对,确定固定逻辑长度的待处理数据是否均为预设数值“0”。若根据循环比对结果确定均为预设数值“0”,则保留缓冲区中的该固定逻辑长度的待处数据。

    s440、若读取后的固定逻辑长度的待处理数据的取值均为预设数值,依据起始读取位置和读取偏移量,从待处理文件中删除待处理数据,以得到新待处理文件。

    在本实施例中,若读取后的固定逻辑长度的待处理数据的取值均为预设数值“0”,此时无法确定这些预设数值“0”是属于文件空洞“0”数据还是真实的“0”数据。为此,可以先依据前述记录的起始读取位置和读取偏移量,从待处理文件中找到前述读取的待处理数据,并从待处理文件中删除,这样就可以得到删除待处理数据后的新的待处理文件,记为新待处理文件。此外,可以查询该新待处理文件的磁盘使用量,并将查询结果进行记录。

    s450、比较待处理文件和新待处理文件的磁盘使用量,并根据比较结果进行文件修复。

    在本实施例中,若待处理文件和新待处理文件的磁盘使用量不同,即若确定待处理文件的磁盘使用量小于新待处理文件的磁盘使用量,则表明从待处理文件中删除的固定逻辑长度的待处理数据中包含有真实的“0”。此时,确定该固定逻辑长度的待处理数据不为文件空洞,并保留该固定逻辑长度的待处理数据。可选地,若一开始从待处理文件中读取固定逻辑长度的待处理数据到预设的缓冲区,则将读到缓冲区的该固定逻辑长度的待处理数据直接保留在缓冲区中,以便后续从缓冲区中取出待处理数据进行修复。

    在本实施例中,若待处理文件和新待处理文件的磁盘使用量相同,即若确定待处理文件的磁盘使用量等于新待处理文件的磁盘使用量,则表明从待处理文件中删除的固定逻辑长度的待处理数据中全部都是空洞的“0”。此时,确定该固定逻辑长度的待处理数据为文件空洞,并删除读取的该固定逻辑长度的待处理数据。可选地,若一开始从待处理文件中读取固定逻辑长度的待处理数据到预设的缓冲区,则将读到缓冲区的该固定逻辑长度的待处理数据直接删除。

    在本实施例中,副本类与纠删码类的文件修复原理相比,副本类的文件修复原理比较简单。对于存储有相同副本的多个在线存储节点而言,只需要从多个在线存储节点存储的副本文件任意选一个副本作为节点间文件修复操作所需要的源文件,并将源文件的备份中的数据直接复制到目标文件即可完成文件修复操作。当待处理文件中的待处理文件全部读取完毕后,可以将保留下来的待处理数据(包括读取的且取值不均为预设数值“0”的待处理数据,以及读取的取值为预设数值且不是文件空洞的待处理数据)写到目标文件中,最后得到的目标文件即为修复后得到的且缩小空洞的文件,整个过程不需要其他算法开销。

    可以理解的是,虽然固定逻辑长度的待处理数据不均为预设数值,但不表示固定逻辑长度的待处理数据中不含任何属于空洞或者属于真实的“0”。由于本申请方案是缩小文件空洞而不是完全剔除文件空洞,因此,对固定逻辑长度的待处理数据中包含的一个或者少量的属于空洞或者属于真实的“0”进行保留不影响总体上缩小文件空洞的初衷。当然,也可以每次读一个字节的待处理数据,每一个字节的待处理数据进行判断,就可彻底去掉文件空洞,但是待处理文件的包含大量字节的待处理数据,如果每次读一个字节,虽然最终能去掉全部待处理数据,但是会增加数据修复耗时,得不偿失。

    本发明实施例中提供了一种文件处理方案,采用本实施例的方案,通过比较待处理文件和新待处理文件的磁盘使用量,可以将待处理文件的文件空洞尽可能地删除缩小,而能够将非文件空洞的数据进行保留,这样当需要对待处理文件进行文件修复时就可以将保留下来的数据写入到一个目标文件中,由于保留下来的数据的文件空洞比较少,可以保证在向目标文件中写入数据时不需要针对文件空洞填充大量的“0”数据,降低了文件修复时的数据量,同时降低文件修复时的数据量会大幅度降低分布式存储系统中实现节点间文件修复时远程传输数据的传输开销。

    图5是本发明实施例中提供的又一种文件处理方法的流程图。本实施例可以以上述实施例为基础,提供了一种副本类文件修复的优选实例。如图5所示,本发明实施例中提供的文件处理方法具体包括以下步骤:

    s510、若待处理文件为副本文件,则将节点间文件修复操作所需要的源文件备份到源文件所在节点的本地,将备份得到的文件作为待处理文件。

    其中,待处理文件中保留了源文件中的文件空洞。

    s520、打开待处理文件。

    s530、查询待处理文件的磁盘使用量,并记录待处理文件的磁盘使用量ds。

    其中,具体可以采用linux中的du命令查询待处理文件占用的磁盘空间。

    s540、从待处理文件中读取固定逻辑长度的待处理数据到缓冲区。

    其中,当通过read命令从待处理文件中读取固定逻辑长度的待处理数据到缓冲区时,读取的固定逻辑长度的待处理数据中文件空洞被读成预设数值“0”。

    s550、记录读取的固定逻辑长度的待处理数据在待处理文件中的起始读取位置和读取偏移量。

    s560、判断固定逻辑长度的待处理数据的取值是否均为预设数值“0”。

    其中,若判断固定逻辑长度的待处理数据的取值均为预设数值“0”,则继续执行步骤s570的操作;否则,返回执行步骤s540的操作。

    s570、保留缓冲区中该取值不均为预设数值“0”的待处理数据。

    其中,在执行完步骤s570后返回继续执行s540的操作,直至待处理文件中的待处理数据读取完毕。

    s580、依据起始读取位置和读取偏移量,从待处理文件中删除该读取的固定逻辑长度的待处理数据,以得到新待处理文件。

    s590、查询该新待处理文件的磁盘使用量xs,并记录该新待处理文件的磁盘使用量xs。

    s5100、判断待处理文件的磁盘使用量ds和新待处理文件的磁盘使用量xs是否相同。

    其中,若待处理文件的磁盘使用量ds和新待处理文件的磁盘使用量xs不相同,则继续执行步骤s5110的操作;否则,返回执行步骤s5120的操作。

    s5110、保留缓冲区中该取值均为预设数值“0”的待处理数据,并将该新待处理文件记为待处理文件。

    其中,在执行s5110操作后,返回继续执行s530的操作,直至待处理文件中的待处理数据读取完毕。

    s5120、删除缓冲区中该取值均为预设数值“0”的待处理数据。

    其中,在执行s5120操作后,返回继续执行s540的操作,直至待处理文件中的待处理数据读取完毕。

    s5130、将缓冲区已经保留下的待处理数据写入目标文件中。

    采用上述实施例中提供的优先方案,可以针对副本类的待修复文件里的文件空洞进行尽可能地缩小处理,而不会丢失任何真实的“0”数据,并且已经尽可能地将文件空洞剔除,因此在文件修复时不需要对大量的文件空洞填充大量的“0”数据,降低了文件修复时的数据量,同时降低文件修复时的数据量会大幅度降低分布式存储系统中实现节点间文件修复时远程传输数据的传输开销。

    图6是本发明实施例中提供的又一种文件处理方法的流程图,本发明实施例在上述实施例的基础上进行进一步优化,本发明实施例可以与上述一个或者多个实施例中各个可选方案结合。如图6所示,本发明实施例中提供的文件处理方法具体包括以下步骤:

    s610、向存储有源文件的各个存储节点发送指令,指示各个存储节点将节点间文件修复操作所需要的各个源文件分别备份到各个源文件所在节点的本地,并将备份得到的各个文件作为各个待处理文件;其中,每一个待处理文件中保留了对应源文件的文件空洞。

    在本实施例中,在步骤s610中涉及的节点间文件修复操作所需要的源文件属于经纠删码算法处理后得到的数据分片,且这些数据分片均为空洞文件。对于纠删码卷来说,其冗余特点是基于k m的纠删码算法,文件写入的时候,会分成固定大小的数据块,每个数据块分成k片,通过纠删码算法,得到k m个数据分片,离散写入不同的存储节点。当纠删码卷中的一个存储节点的资源损坏,数据丢失时,可加入一个新的存储节点资源替换损坏的存储节点资源,此时可以读取其他在线存储节点的数据进行数据修复,恢复数据的冗余性。

    在本实施例中,与前述的副本类相似,在将节点间文件修复操作所需要的各个源文件分别备份到各个源文件所在节点的本地的步骤之前,针对节点间文件修复操作所需要的各个源文件中的每一源文件,具体可以采用预设的文件逻辑大小区间范围对源文件进行筛选,将文件逻辑大小不属于预设的文件逻辑大小区间范围的源文件进行剔除,而将属于预设的文件逻辑大小区间范围的源文件进行保留,以便备份得到分别备份在各个存储节点的多个待处理文件。

    在本实施例中,可选地,对于分别存储有步骤s610中各个源文件的多个在线存储节点而言,每一个在线存储节点可以根据自身的空闲磁盘空间大小v与允许修复的空洞文件个数n,以及当前修复线程数t这三者因素得到每个在线存储节点的平均修复空洞文件分片的逻辑大小并上报给主节点。进而,将集群的平均修复空洞文件分片大小作为预设的文件逻辑大小区间范围的上限值。此外,预设的文件逻辑大小区间范围的下限值h的确定方式可以参见前述针对副本文件的确定方式。

    s620、若待处理文件为经纠删码算法处理后得到的数据分片,从存储于至少两个存储节点中的待处理文件中读取至少两个待处理数据。

    在本实施例中,对于纠删码卷来说,存储节点上存储的待处理文件是纠删码算法处理后得到的数据分片。如果有k m个存储节点,那么对一个完整的文件进行纠删码算法处理后得到k m个数据分片,这样k m个存储节点上的待处理文件组成了纠删码类型的一个完整文件。以k m个存储节点为例,当有m个存储节点上的待处理文件失效时,需要根据k个存储节点的待处理文件来恢复m个存储节点上失效的待处理文件。

    在本实施例中,由于需要使用至少两个在线存储节点上的待处理文件进行文件修复,例如需要使用k个在线存储节点的待处理文件来恢复m个存储节点上失效的待处理文件,而各个存储节点上的待处理文件属于空洞文件,因此需要先对各个存储节点上的待处理文件进行空洞缩小处理。此时,针对至少两个存储节点中每一个存储节点上的待处理文件,从每一个存储节点的待处理文件中读取待处理数据,这样就可以从至少两个存储节点的待处理文件中读取多个待处理数据。

    在本实施例的一种可选方式中,从存储于至少两个存储节点中的待处理文件中读取至少两个待处理数据,具体包括:

    针对存储于至少两个存储节点中的每一个存储节点上的待处理文件,从待处理文件中读取属于同一条带的固定逻辑长度的待处理数据,并记录起始读取位置和读取偏移量。

    在本实施方式中,对于至少两个在线存储节点,当从每一个在线存储节点的待处理文件中读取待处理数据时,可以每次读取一个字节的待处理数据,但是这样的读取会出现大量的读操作,导致数据处理非常慢。因此,当从每一个在线存储节点的待处理文件中读取待处理数据时,可以从每一个在线存储节点的待处理文件中读取属于同一条带的固定逻辑长度的待处理数据,实现一次性读取多个字节的待处理数据,避免造成多次读操作导致数据处理迟滞。这样就可以分别从多个在线存储节点上读取多个属于同一条带的固定逻辑长度的待处理数据。可选地,针对存储于至少两个存储节点中的每一个存储节点上的待处理文件,从每一个在线存储节点的待处理文件中读取属于同一条带的固定逻辑长度的待处理数据到预设的缓冲区。

    在本实施方式中,对于从每一个在线存储节点的待处理文件中读取属于同一条带的固定逻辑长度的待处理数据而言,需要记录读取的属于同一条带的固定逻辑长度的待处理数据在每一在线存储节点的待处理文件中的起始读取位置和读取偏移量,这样就可以通过起始读取位置和读取偏移量获知从每一在线存储节点的待处理文件中读取了哪些待处理数据。可选地,在每一在线存储节点的待处理文件中标记上述的起始读取位置和读取偏移量。

    s630、若读取后的至少两个待处理数据的取值不均为预设数值,则将取值不均为预设数值的至少两个待处理数据保留下来。

    在本实施例中,仍以预设数值为“0”为例,对于从每一个在线存储节点的待处理文件中读取属于同一条带的固定逻辑长度的待处理数据而言,若读取后的固定逻辑长度的待处理数据的取值不均为预设数值“0”,则可以认定该固定逻辑长度的待处理数据中包含有空洞“0”和真实的“0”以外的其他数据,而这些数据是不可以丢弃的需要直接保留下来。

    在本实施例中,纠删码跟副本的实现方案区别在于,纠删码修复时,只有读取到一个条带上的k个待处理数据都为空洞数据“0”,才可以丢弃,因为纠删码是行列矩阵进行编解码,同一个条带上的k个待处理数据是参与运算的元素,若该条带上有空洞“0”和真实数据“0”的数据,丢弃空洞“0”待处理数据,剩下的数据“0”的待处理数据无法独立解码,所以要求该条带上全为空洞“0”待处理数据时才可以丢弃。考虑到需要结合至少两个在线存储节点的待处理文件进行数据恢复,因此,只有从所有在线存储节点读取的所有节点的待处理数据均是预设数值,即从k个在线存储节点的待处理文件中获取的k个节点的待处理数据全部都是预设数值,才会将k个节点的待处理数据进行舍弃;否则,只要从一个在线存储节点的待处理文件读取的待处理数据不为预设数值,就需要将从所有在线存储节点读取的多个待处理数据均保留下来。

    在一个可选示例中,对缓冲区中属于同一条带的多个固定逻辑长度的待处理数据进行循环比对,确定从多个存储节点分别读取的多个固定逻辑长度的待处理数据是否均为预设数值“0”。若根据循环比对结果确定多个固定逻辑长度的待处理数据均为预设数值“0”,则保留缓冲区中的属于同一条带的多个该固定逻辑长度的待处数据。

    s640、若读取后的至少两个待处理数据的取值不均为预设数值,则控制至少两个存储节点从待处理文件中删除至少两个待处理数据,以得到至少两个新待处理文件。

    在本实施例中,控制至少两个存储节点从待处理文件中删除至少两个待处理数据,包括:针对至少两个存储节点中的每一个存储节点,向存储节点发送数据删除通知,指示存储节点依据起始读取位置和读取偏移量,从所属的待处理文件中删除该属于同一条带的待处理数据,这样就可以保证各个存储节点上均得到删除待处理数据后的新的待处理文件,记为新待处理文件。此时,每一个在线存储节点就会存储一个新的待处理文件。此外,可以向每一个在线存储节点发送查询指令,指示每一个在线存储节点去查询得到的新待处理文件的磁盘使用量,并将查询结果进行记录,这样就可以确定每一个在线存储节点上的新待处理文件的磁盘使用量。

    s650、比较待处理文件和新待处理文件的磁盘使用量,并根据比较结果进行文件修复。

    在本实施例中,对于至少两个在线存储节点中的每一个在线存储节点,若每一个在线存储节点的待处理文件和新待处理文件的磁盘使用量不同,即若确定每一个在线存储节点的待处理文件的磁盘使用量小于新待处理文件的磁盘使用量,则表明从该在线存储节点的待处理文件中删除的属于同一条带的固定逻辑长度的待处理数据中包含有真实的“0”。此时,确定该属于同一条带的固定逻辑长度的待处理数据不为文件空洞。进而,只要确定存在一个在线存储节点的待处理文件和新待处理文件的磁盘使用量不同,那么就将分别从至少两个在线存储节点顺序读取的属于同一条带的固定逻辑长度的至少两个待处理数据全部进行保留。同时,将全部保留下来的属于同一条带的固定逻辑长度的至少两个待处理数据添加到纠删码解码进程中,以对已失效的存储节点进行文件修复。

    在本实施例中,对于至少两个在线存储节点中的每一个在线存储节点,若每一个在线存储节点的待处理文件和新待处理文件的磁盘使用量相同,即若确定每一个在线存储节点的待处理文件的磁盘使用量等于新待处理文件的磁盘使用量,则表明从该在线存储节点的待处理文件中删除的属于同一条带的固定逻辑长度的待处理数据中不包含有真实的“0”,而包含有空洞的“0”数据。此时,确定该属于同一条带的固定逻辑长度的待处理数据为文件空洞。进而,只有确定该至少两个在线存储节点中的全部在线存储节点的待处理文件和新待处理文件的磁盘使用量均相同,才将分别从至少两个在线存储节点顺序读取的属于同一条带的固定逻辑长度的至少两个待处理数据全部舍弃。可选地,将读到缓冲区的分别从至少两个在线存储节点顺序读取的属于同一条带的固定逻辑长度的至少两个待处理数据从缓冲区中全部删除。

    可以理解的是,虽然属于同一条带的固定逻辑长度的待处理数据不均为预设数值,但不表示属于同一条带的固定逻辑长度的待处理数据中不含任何属于空洞或者属于真实的“0”。由于本申请方案是缩小文件空洞而不是完全剔除文件空洞,因此,对属于同一条带的固定逻辑长度的待处理数据中包含的一个或者少量的属于空洞或者属于真实的“0”进行保留不影响总体上缩小文件空洞的初衷,而不是彻底去掉文件空洞的初衷。当然,也可以每次读一个字节的待处理数据,每一个字节的待处理数据进行判断,就可彻底去掉文件空洞,但是待处理文件的包含大量字节的待处理数据,如果每次读一个字节,虽然最终能去掉全部待处理数据,但是会增加数据修复耗时,得不偿失。

    本发明实施例中提供了一种文件处理方案,采用本实施例的方案,通过比较至少两个存储节点上的待处理文件和新待处理文件的磁盘使用量,可以将每一个在线存储节点上的待处理文件的文件空洞尽可能地删除缩小,而能够将非文件空洞的数据进行保留,这样当需要使用多个在线存储节点上的待处理文件对已失效的存储节点上的待处理文件进行文件修复时就可以直接进入纠删码解码进程中进行修复,由于保留下来的数据的文件空洞比较少,可以保证在修复时不需要针对文件空洞填充大量的“0”数据,降低了文件修复时的数据量,同时降低文件修复时的数据量会大幅度降低分布式存储系统中实现节点间文件修复时远程传输数据的传输开销。

    图7是本发明实施例中提供的又一种文件处理方法的流程图。本实施例可以以上述实施例为基础,以k m个存储节点组成纠删码卷,有m个存储节点的数据失效,需要根据k个存储节点的数据来恢复失效数据为例,提供了一种纠删码类文件修复的优选实例,。如图7所示,本发明实施例中提供的文件处理方法具体包括以下步骤:

    s710、若待处理文件为经纠删码算法处理后得到的数据分片,则向存储有源文件的k个在线存储节点发送指令,指示k个在线存储节点将节点间文件修复操作所需要的k个源文件分别备份到k个源文件所在节点的本地,并将备份得到的k个文件作为k个数据分片。

    其中,每一个数据分片中均保留了对应源文件的文件空洞。

    s720、打开k个在线存储节点的数据分片。

    s730、分别查询k个数据分片的磁盘使用量ds,并记录k个数据分片的磁盘使用量ds。

    其中,具体可以采用linux中的du命令查询数据分片占用的磁盘空间。

    s740、从k个数据分片中分别顺序读取属于同一条带的固定逻辑长度的k个待处理数据到缓冲区。

    其中,修复开始,按同一个条带的数据分片顺序,去k个在线存储节点的数据分片里读取固定逻辑长度待处理数据d,并将读取的k个固定逻辑长度待处理数据d放入到主节点的缓冲区,一个条带包含k个待处理数据d。当通过read命令从数据分片中读取固定逻辑长度的待处理数据到缓冲区时,读取的固定逻辑长度的待处理数据中文件空洞被读成预设数值“0”。

    s750、分别记录读取的k个固定逻辑长度的待处理数据在各自所属的数据分片中的起始读取位置和读取偏移量。

    s760、判断k个固定逻辑长度的待处理数据的取值是否均为预设数值“0”。

    其中,若判断属于同一条带的k个固定逻辑长度的待处理数据的取值均为预设数值“0”,则继续执行步骤s770的操作;否则,返回执行步骤s780的操作。

    s770、依据k个固定逻辑长度的待处理数据在各自所属的数据分片中的起始读取位置和读取偏移量,分别从k个数据分片中删除对应的固定逻辑长度的待处理数据,以得到k个新数据分片。

    其中,在执行完步骤s770后继续执行s790的操作。

    s780、将属于同一条带的k个固定逻辑长度的待处理数据均保留下来,并添加到纠删码解码进程中,进行该条带k个固定逻辑长度的待处理数据的修复。

    其中,在执行s780的操作后,返回继续执行s740的操作,直至k个在线存储节点的数据分片中的各个待处理数据均读取完毕。

    s790、查询k个新数据分片的磁盘使用量xs,并记录k个新数据分片的磁盘使用量xs。

    s7100、判断k个新数据分片的磁盘使用量与其对应的k个数据分片的磁盘使用量ds是否均相同。

    其中,若k个新数据分片的磁盘使用量与其对应的k个数据分片的磁盘使用量ds只要有一个不相同,则继续执行步骤s780的操作;否则,返回执行步骤s7110的操作。

    s7110、删除缓冲区中该属于同一条带的k个固定逻辑长度的待处理数据。

    其中,在执行s7110操作后,返回继续执行s740的操作,直至k个在线存储节点的数据分片中的各个待处理数据均读取完毕。

    采用上述实施例中提供的优先方案,可以针对纠删码类的k个数据分片里的文件空洞进行尽可能地缩小处理,而不会丢失任何真实的“0”数据,并且已经尽可能地将文件空洞剔除,因此在使用k个数据分片进行文件修复时不需要对大量的文件空洞填充大量的“0”数据,降低了文件修复时的数据量,同时降低文件修复时的数据量会大幅度降低分布式存储系统中实现节点间文件修复时远程传输数据的传输开销。

    此外,本发明实施例中还通过具体实验数据说明采用本实施例方案修复空洞文件的优点。图8示出了一个大小为20g的空洞文件写入到2 1的纠删码卷中,文件在3个存储节点中实际占用的磁盘空间的示意图。图9示出了修复文件前一个存储节点的实际占用磁盘空间的示意图,如图9所示,修复之前,该文件在卷中的存储节点nasdevice8中实际占用的磁盘空间大小为68kb。当存储节点nasdevice8损坏,纠删码卷中加入一个新的存储节点替换已经损坏的存储节点nasdevice8,触发文件修复。图10示出了传统方式的文件修复后实际占用磁盘空间的示意图,如图10所示,如果不用本实施例的文件处理方案,在文件修复后,该文件在存储节点中实际占用的空间大小为10g。图11示出了采用本实施例的方案进行文件修复后实际占用磁盘空间的示意图,如图11所示,如果使用本实施例的文件处理方案(当读取的数据全部是0时,表明这段数据是空洞数据,直接舍弃掉这段数据不修复),在文件修复后,该文件在存储节点中实际占用的磁盘空间大小为512kb。

    可见,采用本实施例的文件处理方法对空洞文件进行修复可以大大减少磁盘空间的浪费。本申请针对通用型分布式存储系统中,在文件修复流程中增加对空洞文件的特殊处理,使得空洞文件修复后不会占用不必要的磁盘空间。避免了空间浪费;对异常大的空洞文件不去做修复处理,避免异常文件修复对系统性能的影响。

    图12是本发明实施例中提供的一种文件处理装置的结构框图。本发明实施例可适用于在分布式存储系统中对节点间的空洞文件进行修复的情况。该装置可采用软件和/或硬件的方式实现,并集成在任何具有网络通信功能的电子设备上。如图12所示,本发明实施例中提供的文件处理装置具体包括:数据读取模块1210、文件修改模块1220和文件比对模块1230。其中:

    数据读取模块1210,用于从待处理文件中读取待处理数据,其中所述待处理数据中文件空洞的取值为预设数值;

    文件修改模块1220,用于若所述待处理数据的取值均为所述预设数值,则从所述待处理文件中删除所述待处理数据,以得到新待处理文件;

    文件比对模块1230,用于比较所述待处理文件和所述新待处理文件的磁盘使用量,并根据比较结果进行文件修复。

    在上述实施例的基础上,可选地,若所述待处理文件为副本文件,数据读取模块1210包括:

    从所述待处理文件中读取固定逻辑长度的待处理数据,并记录起始读取位置和读取偏移量;

    相应地,文件修改模块包括:

    依据所述起始读取位置和读取偏移量,从所述待处理文件中删除所述待处理数据。

    在上述实施例的基础上,可选地,若所述待处理文件为经纠删码算法处理后得到的数据分片,数据读取模块1210包括:

    数据读取单元,用于从存储于至少两个存储节点中的待处理文件中读取至少两个待处理数据;

    相应地,文件修改模块包括:

    文件修改控制单元,用于控制所述至少两个存储节点从待处理文件中删除所述至少两个待处理数据,以得到至少两个新待处理文件。

    在上述实施例的基础上,可选地,数据读取单元包括:

    针对存储于至少两个存储节点中的每一个待处理文件,从所述待处理文件中读取属于同一条带的固定逻辑长度的待处理数据,并记录起始读取位置和读取偏移量;

    相应地,文件修改控制单元包括:

    针对所述至少两个存储节点中的每一个存储节点,向所述存储节点发送数据删除通知,指示所述存储节点依据所述起始读取位置和读取偏移量,从所属的所述待处理文件中删除该属于同一条带的所述待处理数据。

    在上述实施例的基础上,可选地,文件比对模块1230包括:

    数据保留处理单元,用于若所述待处理文件和新待处理文件的磁盘使用量不同,则确定所述待处理数据不为文件空洞,并保留所述待处理数据,以进行文件修复;

    数据删除处理单元,用于若所述待处理文件和新待处理文件的磁盘使用量相同,则确定所述待处理数据为文件空洞,并删除所述待处理数据。

    在上述实施例的基础上,可选地,若所述待处理文件为经纠删码算法处理后得到的数据分片,文件比对模块还包括

    纠删码解码处理单元,用于将从至少两个存储节点的待处理文件中读取并保留的属于同一条带的所述待处理数据,添加到纠删码解码进程中,以对待处理文件已失效的存储节点进行文件修复。

    本发明实施例中所提供的文件处理装置可执行上述本发明任意实施例中所提供的文件处理方法,具备执行该文件处理方法相应的功能和有益效果,详细过程参见前述实施例中文件处理方法的相关操作。

    图13是本发明实施例中提供的一种电子设备的结构示意图。如图13所示结构,本发明实施例中提供的电子设备包括:一个或多个处理器1310和存储装置1320;该电子设备中的处理器1310可以是一个或多个,图13中以一个处理器1310为例;存储装置1320用于存储一个或多个程序;所述一个或多个程序被所述一个或多个处理器1310执行,使得所述一个或多个处理器1310实现如本发明实施例中任一项所述的文件处理方法。

    该电子设备还可以包括:输入装置1330和输出装置1340。

    该电子设备中的处理器1310、存储装置1320、输入装置1330和输出装置1340可以通过总线或其他方式连接,图13中以通过总线连接为例。

    该电子设备中的存储装置1320作为一种计算机可读存储介质,可用于存储一个或多个程序,所述程序可以是软件程序、计算机可执行程序以及模块,如本发明实施例中所提供的文件处理方法对应的程序指令/模块。处理器1310通过运行存储在存储装置1320中的软件程序、指令以及模块,从而执行电子设备的各种功能应用以及数据处理,即实现上述方法实施例中文件处理方法。

    存储装置1320可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据电子设备的使用所创建的数据等。此外,存储装置1320可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储装置1320可进一步包括相对于处理器1310远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

    输入装置1330可用于接收输入的数字或字符信息,以及产生与电子设备的用户设置以及功能控制有关的键信号输入。输出装置1340可包括显示屏等显示设备。

    并且,当上述电子设备所包括一个或者多个程序被所述一个或者多个处理器1310执行时,程序进行如下操作:

    从待处理文件中读取待处理数据,其中所述待处理数据中文件空洞的取值为预设数值;

    若所述待处理数据的取值均为所述预设数值,则从所述待处理文件中删除所述待处理数据,以得到新待处理文件;

    比较所述待处理文件和所述新待处理文件的磁盘使用量,并根据比较结果进行文件修复。

    当然,本领域技术人员可以理解,当上述电子设备所包括一个或者多个程序被所述一个或者多个处理器1310执行时,程序还可以进行本发明任意实施例中所提供的文件处理方法中的相关操作。

    本发明实施例中提供了一种计算机可读介质,其上存储有计算机程序,该程序被处理器执行时用于执行文件处理方法,该方法包括:

    从待处理文件中读取待处理数据,其中所述待处理数据中文件空洞的取值为预设数值;

    若所述待处理数据的取值均为所述预设数值,则从所述待处理文件中删除所述待处理数据,以得到新待处理文件;

    比较所述待处理文件和所述新待处理文件的磁盘使用量,并根据比较结果进行文件修复。

    可选的,该程序被处理器执行时还可以用于执行本发明任意实施例中所提供的文件处理方法。

    本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(randomaccessmemory,ram)、只读存储器(readonlymemory,rom)、可擦式可编程只读存储器(erasableprogrammablereadonlymemory,eprom)、闪存、光纤、便携式cd-rom、光存储器件、磁存储器件、或者上述的任意合适的组合。计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。

    计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于:电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。

    计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、无线电频率(radiofrequency,rf)等等,或者上述的任意合适的组合。

    可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如java、smalltalk、c ,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(lan)或广域网(wan)——连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。

    在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。

    注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。


    技术特征:

    1.一种文件处理方法,其特征在于,包括:

    从待处理文件中读取待处理数据,其中所述待处理数据中文件空洞的取值为预设数值;

    若所述待处理数据的取值均为所述预设数值,则从所述待处理文件中删除所述待处理数据,以得到新待处理文件;

    比较所述待处理文件和所述新待处理文件的磁盘使用量,并根据比较结果进行文件修复。

    2.根据权利要求1所述的方法,其特征在于,若所述待处理文件为副本文件,则从待处理文件中读取待处理数据,包括:

    从所述待处理文件中读取固定逻辑长度的待处理数据,并记录起始读取位置和读取偏移量;

    相应地,从所述待处理文件中删除所述待处理数据,包括:

    依据所述起始读取位置和读取偏移量,从所述待处理文件中删除所述待处理数据。

    3.根据权利要求1所述的方法,其特征在于,若所述待处理文件为经纠删码算法处理后得到的数据分片,则从待处理文件中读取待处理数据,包括:

    从存储于至少两个存储节点中的待处理文件中读取至少两个待处理数据;

    相应地,从所述待处理文件中删除所述待处理数据,包括:

    控制所述至少两个存储节点从待处理文件中删除所述至少两个待处理数据,以得到至少两个新待处理文件。

    4.根据权利要求3所述的方法,其特征在于,从存储于至少两个存储节点中的待处理文件中读取至少两个待处理数据,包括:

    针对存储于至少两个存储节点中的每一个待处理文件,从所述待处理文件中读取属于同一条带的固定逻辑长度的待处理数据,并记录起始读取位置和读取偏移量;

    相应地,控制所述至少两个存储节点从待处理文件中删除所述至少两个待处理数据,包括:

    针对所述至少两个存储节点中的每一个存储节点,向所述存储节点发送数据删除通知,指示所述存储节点依据所述起始读取位置和读取偏移量,从所属的所述待处理文件中删除该属于同一条带的所述待处理数据。

    5.根据权利要求1-4中任一项所述的方法,其特征在于,比较所述待处理文件和新待处理文件的磁盘使用量,并根据比较结果进行文件修复,包括:

    若所述待处理文件和新待处理文件的磁盘使用量不同,则确定所述待处理数据不为文件空洞,并保留所述待处理数据,以进行文件修复;

    若所述待处理文件和新待处理文件的磁盘使用量相同,则确定所述待处理数据为文件空洞,并删除所述待处理数据。

    6.根据权利要求5所述的方法,其特征在于,若所述待处理文件为经纠删码算法处理后得到的数据分片,则根据比较结果进行文件修复,包括

    将从至少两个存储节点的待处理文件中读取并保留的属于同一条带的所述待处理数据,添加到纠删码解码进程中,以对待处理文件已失效的存储节点进行文件修复。

    7.一种文件处理装置,其特征在于,包括:

    数据读取模块,用于从待处理文件中读取待处理数据,其中所述待处理数据中文件空洞的取值为预设数值;

    文件修改模块,用于若所述待处理数据的取值均为所述预设数值,则从所述待处理文件中删除所述待处理数据,以得到新待处理文件;

    文件比对模块,用于比较所述待处理文件和所述新待处理文件的磁盘使用量,并根据比较结果进行文件修复。

    8.根据权利要求7所述的装置,其特征在于,若所述待处理文件为副本文件,数据读取模块包括:

    从所述待处理文件中读取固定逻辑长度的待处理数据,并记录起始读取位置和读取偏移量;

    相应地,文件修改模块包括:

    依据所述起始读取位置和读取偏移量,从所述待处理文件中删除所述待处理数据。

    9.根据权利要求7所述的装置,其特征在于,若所述待处理文件为经纠删码算法处理后得到的数据分片,数据读取模块包括:

    数据读取单元,用于从存储于至少两个存储节点中的待处理文件中读取至少两个待处理数据;

    相应地,文件修改模块包括:

    文件修改控制单元,用于控制所述至少两个存储节点从待处理文件中删除所述至少两个待处理数据,以得到至少两个新待处理文件。

    10.一种电子设备,其特征在于,包括:

    一个或多个处理装置;

    存储装置,用于存储一个或多个程序;

    当所述一个或多个程序被所述一个或多个处理装置执行,使得所述一个或多个处理装置实现权利要求1-6中任一所述的文件处理方法。

    11.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理装置执行时实现权利要求1-6中任一所述的文件处理方法。

    技术总结
    本发明实施例公开了一种文件处理方法、装置、设备及介质。所述方法包括:从待处理文件中读取待处理数据,其中待处理数据中文件空洞的取值为预设数值;若待处理数据的取值均为所述预设数值,则从待处理文件中删除所述待处理数据,以得到新待处理文件;比较待处理文件和新待处理文件的磁盘使用量,并根据比较结果进行文件修复。采用本实施例的方案,通过比较结果可以将待处理文件的文件空洞尽可能地删除,这样当需要对待处理文件进行文件修复时就直接利用保留的数据进行修复,而不需要在写入数据时针对文件空洞填充大量的“0”数据,降低了文件修复时的数据量,同时降低了分布式存储系统中实现节点间文件修复时远程传输数据的传输开销。

    技术研发人员:江萍;石岩;梁红伟
    受保护的技术使用者:浙江宇视科技有限公司
    技术研发日:2019.09.11
    技术公布日:2021.03.12

    转载请注明原文地址:https://wp.8miu.com/read-22327.html

    最新回复(0)