一种配置文件的节粒度三方合并保存方法及系统与流程
本技术涉及计算机软件配置,特别涉及一种配置文件的节粒度三方合并保存方法及系统。
背景技术:
1、结构化文本配置文件由若干节构成,每个节以节头标记起始并延续至下一个节头之前,节内包含键值行以及注释行、空行等格式内容。在工业控制、嵌入式设备以及多进程协同软件中,多个软件模块或者多个进程常常共享同一份配置文件,各自更新其中的部分内容。现有的配置文件保存方式主要有三类。
2、第一类为整文件重写方式,即先把整个配置文件加载到内存中,在内存中完成修改后再把全部内容整体写回磁盘。这类方式以加载时刻的文件快照作为写回基线,在加载之后由其他模块对该文件所作的修改会在写回时被整体覆盖丢失;并且部分实现还会丢失人工编辑的注释、丢失空行,或者打乱节与键的排列顺序。
3、第二类为只读解析方式,仅支持对配置文件的解析与读取,不支持写回,无法用于需要保存修改的场景。
4、第三类为操作系统提供的键粒度写接口,以单个键为粒度对配置文件进行就地改写。这类方式每修改一个键即触发一次全文件重写,不具有写入原子性,也不支持删除整节或者批量更新的语义,并且与具体的操作系统绑定,在部分场景下还会破坏注释与格式。
5、上述现有方式存在以下技术问题。其一,覆盖事故发生在文件粒度,当一个模块修改第一个节、另一个模块修改第二个节时,即使二者修改的是互不相关的节,后保存的一方也会把先保存一方的修改整体覆盖丢失。其二,安全更新一个节的前提过于苛刻,要安全地更新某一个节,必须先加载整个文件,并且必须保证从加载到保存之间没有任何其他模块写入该文件,这在多模块、多进程运行的环境中无法保证。其三,人工格式无法保留,配置文件无法审计,人工编辑的注释、空行以及键的排列顺序在机器整体重写之后丢失,配置文件无法长期审计,也无法进行差分比对。其四,写回过程非原子,整体写回的过程中如果发生断电或者程序崩溃,会在磁盘上产生被截断的半截文件,破坏配置文件的完整性。
6、因此,如何在不引入数据库或者中心服务的前提下,使多个写者对同一配置文件的保存操作互不覆盖,同时完整保留人工格式并保证写回的原子性,成为本领域亟待解决的技术问题。
技术实现思路
1、有鉴于此,本技术提供了一种配置文件的节粒度三方合并保存方法。本说明书一个或者多个实施例同时涉及一种配置文件的节粒度三方合并保存系统,一种计算设备,一种计算机可读存储介质以及一种计算机程序,以解决现有技术中存在的技术缺陷。
2、根据本技术的第一方面,提供了一种配置文件的节粒度三方合并保存方法,所述配置文件存储于磁盘且由若干节构成,每个节以节头标记起始并延续至下一个节头之前,内存对象用于维护所述配置文件的行序列,包括:以所述配置文件的原始行序列为单一数据源解析所述配置文件,将所述原始行序列中的每一行分类为节头、键值行、注释行或空行,并对所述键值行建立节到键到行下标的索引;对所述内存对象的每一次写操作,将所述写操作作用的节名记入脏节集,所述脏节集为所述内存对象自创建起被写操作作用过的全部节名的集合;属于所述脏节集的节为脏节,不属于所述脏节集的节为非脏节;响应于保存请求,重新读取所述磁盘上所述配置文件的当前文本,将所述当前文本作为合并基线;以所述合并基线为底逐行扫描,在扫描到的当前行所属的节不属于所述脏节集时将该行原样输出,在扫描到的当前行所属的节属于所述脏节集时丢弃该行并在首次遇到该节的节头时以所述内存对象渲染的节内容整节重写、在所述内存对象中该节为空时不再输出该节的任何内容,以及将所述脏节集中所述合并基线中不存在的节追加输出,得到合并结果;将所述合并结果写入临时文件并刷新校验,在所述刷新校验通过后以原子替换方式用所述临时文件替换所述磁盘上的所述配置文件。
3、在一种可能实现的方式中,所述写操作包括设值操作、删键操作和删节操作;在所述写操作为所述设值操作的情况下,将所述设值操作作用的节名记入所述脏节集;在所述写操作为所述删键操作且所述内存对象中存在所述删键操作作用的节的情况下,将所述删键操作作用的节名记入所述脏节集,在所述写操作为所述删键操作且所述内存对象中不存在所述删键操作作用的节的情况下,不将所述删键操作作用的节名记入所述脏节集;在所述写操作为所述删节操作的情况下,将所述删节操作作用的节名记入所述脏节集。
4、在一种可能实现的方式中,还包括:在所述内存对象为未解析所述配置文件的空对象的情况下,在所述空对象上执行对目标节的写操作后执行重新读取所述配置文件的当前文本、逐行扫描合并与原子替换的步骤,将所述目标节合并至所述磁盘上的所述配置文件,所述配置文件中除所述目标节之外的内容保持不变。
5、在一种可能实现的方式中,所述非脏节的原样输出的行包括该非脏节的节头、键值行、注释行和空行,且所述非脏节的行包括其他写者在所述内存对象建立之后写入所述磁盘的内容;所述脏节的节头在所述合并基线中重复出现时仅重写一次;以所述内存对象渲染的节内容仅包括所述脏节中每个键的生效行。
6、在一种可能实现的方式中,所述节头之前的键值行构成节名为空的全局节,所述全局节的节名参与所述脏节集;在所述全局节属于所述脏节集的情况下,所述合并基线中所述全局节的行被丢弃,所述全局节以所述内存对象渲染的节内容置于所述合并结果的首部。
7、在一种可能实现的方式中,所述以所述合并基线为底逐行扫描的步骤之前还包括:检测所述合并基线的首部是否包含字节序标记;在检测到所述字节序标记的情况下,将所述字节序标记排除在逐行扫描之外,并在所述合并结果的首部原样输出所述字节序标记。
8、在一种可能实现的方式中,所述注释行和所述空行保留原文;所述原始行序列中无法识别的行按照注释行保留并记录所述无法识别的行的诊断行号;所述节到键到行下标的索引中,同一节内重复出现的键所对应的行下标为该键最后一次出现的键值行的行下标;在所述内存对象中新增键时,将新增的键值行定位至该键所属节的最后一行之后;在所述内存对象中新增节时,将新增的节追加至所述原始行序列的末尾。
9、在一种可能实现的方式中,在将所述合并结果写入所述临时文件失败或者所述刷新校验失败的情况下,删除所述临时文件;在所述原子替换失败的情况下,重新读取所述磁盘上所述配置文件的文本并重新执行所述以所述合并基线为底逐行扫描的步骤;所述方法还包括:将重新读取所述配置文件的当前文本、逐行扫描合并与原子替换的步骤置于跨进程文件锁的保护下执行。
10、根据本技术的第二方面,提供了一种配置文件的节粒度三方合并保存系统,所述配置文件存储于磁盘且由若干节构成,每个节以节头标记起始并延续至下一个节头之前,包括:内存模型模块,用于以所述配置文件的原始行序列为单一数据源解析所述配置文件,将所述原始行序列中的每一行分类为节头、键值行、注释行或空行,并对所述键值行建立节到键到行下标的索引;变更跟踪模块,用于对内存对象的每一次写操作,将所述写操作作用的节名记入脏节集,所述内存对象用于维护所述配置文件的行序列,所述脏节集为所述内存对象自创建起被写操作作用过的全部节名的集合;文件读取模块,用于响应于保存请求,重新读取所述磁盘上所述配置文件的当前文本,将所述当前文本作为合并基线;节粒度合并模块,用于以所述合并基线为底逐行扫描,在扫描到的当前行所属的节不属于所述脏节集时将该行原样输出,在扫描到的当前行所属的节属于所述脏节集时丢弃该行并在首次遇到该节的节头时以所述内存对象渲染的节内容整节重写、在所述内存对象中该节为空时不再输出该节的任何内容,以及将所述脏节集中所述合并基线中不存在的节追加输出,得到合并结果;原子写回模块,用于将所述合并结果写入临时文件并刷新校验,在所述刷新校验通过后以原子替换方式用所述临时文件替换所述磁盘上的所述配置文件。
11、在一种可能实现的方式中,所述变更跟踪模块包括设值处理单元、删键处理单元和删节处理单元;所述设值处理单元用于在所述内存对象上的写操作为设值操作时,将所述设值操作作用的节名记入所述脏节集;所述删键处理单元用于在所述内存对象中存在删键操作作用的节时,将所述删键操作作用的节名记入所述脏节集,并在所述内存对象中不存在所述删键操作作用的节时,不将所述删键操作作用的节名记入所述脏节集;所述删节处理单元用于在所述内存对象上的写操作为删节操作时,将所述删节操作作用的节名记入所述脏节集。
12、根据本技术的第三方面,提供了一种计算设备,包括:
13、存储器和处理器;
14、所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令,该计算机可执行指令被处理器执行时实现上述一种配置文件的节粒度三方合并保存方法的步骤。
15、根据本技术的第四方面,提供了一种计算机可读存储介质,其存储有计算机可执行指令,该指令被处理器执行时实现上述一种配置文件的节粒度三方合并保存方法的步骤。
16、根据本技术的第五方面,提供了一种计算机程序,其中,当所述计算机程序在计算机中执行时,令计算机执行上述一种配置文件的节粒度三方合并保存方法的步骤。
17、本技术以变更声明圈定替换范围,将作用范围从文件粒度缩小到节粒度,多个模块或者多个进程共享同一配置文件时互不覆盖,协同粒度由文件级降至节级,无需引入数据库或者中心服务;本技术以保存时刻重新读取的磁盘最新文本作为合并基线,而不是以加载时刻的快照作为基线,因此安全更新某一个节不再要求从加载到保存之间没有其他写者写入该文件,普通写者与轻量写者可以并行工作;本技术对非脏节按行原样字节输出,人工编辑的注释、空行、节与键的排列顺序以及字节序标记全部得以保留,配置文件可以长期审计并进行差分比对;本技术通过删键操作仅在内存对象中存在该节时置脏、删节操作无条件置脏的非对称删除语义,使删除一个键不会误删磁盘上的整个节,而删除一个节总能够生效,删除语义精确;本技术通过先把合并结果写入临时文件并刷新校验、再原子替换目标文件的方式完成写回,任何时刻磁盘上存在的都是完整文件,杜绝了断电或者程序崩溃所产生的半截文件;本技术可以由标准库实现且不绑定特定的操作系统,实现轻量、跨平台,可以直接替换以单个键为粒度的配置文件写接口。
版权声明:本站专利文献数据主要来源于国家知识产权局等公开渠道,由 技术新讯 进行整理汇编。页面设计及数据汇编的著作权归本站所有。全部内容仅供个人学习、科研评估与技术交流参考,严禁用于任何商业用途(包括但不限于直接生产制造、技术转让、倒卖数据等)。
免责条款:专利技术具有时效性,本站不对资料的绝对准确性、完整性和可实施性提供任何明示或暗示的担保。因参考本站内容造成的直接或间接损失,本站不承担相关法律责任。若您认为本站内容有侵权问题,请及时提供权属证明与我们联系,本站将在核实后依法处理。反馈意见:yyfuon@163.com