一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

用于协作的合并树的制作方法

2022-03-01 21:49:03 来源:中国专利 TAG:

用于协作的合并树
1.优先权要求
2.本专利申请要求于2019年5月3日提交的题为“merge trees for collaboration”的美国专利申请no.16/402,730的优先权,在此通过引用将其全文并入本文。


背景技术:

3.在容错分布式系统中可以使用原子广播(atomic broadcast)或“全序广播(total order broadcast)”来确保多个分布式进程以等效序列接收操作,而不管分布式系统中的哪个节点发起所述操作中的每个操作。所述操作可以被传播到分布式系统中的每个节点,使得每个操作在每个节点处完成,或者所述操作在每个节点处回滚。
附图说明
4.在不一定按比例绘制的附图中,相似的数字可以在不同的视图中描述相似的部件。具有不同字母后缀的相同数字可以表示相似组件的不同实例。附图通过示例而非限制的方式大体图示了在本文档中所讨论的各种实施例。
5.图1a是示例性协作消息传递架构的概览图。
6.图1b是图示了操作如何在三种状态之间移动的示例性状态转换图。
7.图2a示出了在所公开的实施例中的一个或多个实施例中的协作模块实例与同步服务之间交换的消息的示例性消息格式。
8.图2b是示出了在消息与连续排序的操作集合之间的关系的概览图。
9.图2c示出了在两个协作模块实例105a-b与同步服务106之间的示例性消息通信。
10.图2d示出了在协作模块实例与同步服务之间的示例性消息交换。
11.图2e是快照过程的概览图。
12.图3示出了在所公开的实施例中的一些实施例中可以被用于构建树的两个数据结构。
13.图4示出了由协作模块实例存储的合并树部分的示例。
14.图5示出了由协作模块实例存储的示例性合并树部分。
15.图6示出了由协作模块实例存储的合并树部分的经更新的版本。
16.图7示出了由协作模块实例存储的合并树部分的经更新的版本。
17.图8示出了来自图4的合并树部分的经更新的版本。
18.图9示出了由协作模块实例存储的合并树部分的经更新的版本。
19.图10示出了由协作模块实例存储的经更新的树部分。
20.图11示出了由协作模块实例存储的示例性合并树部分。
21.图12示出了指示对插入的确认的合并树部分。
22.图13示出了由协作模块实例存储的合并树部分。
23.图14是用于将对分布式数据结构的操作分布到多个协作模块实例的示例性过程的流程图。
24.图15是用于将对分布式数据结构的操作分布到多个协作模块实例的示例性过程的流程图。
25.图16是用于将对分布式数据结构的操作分布到多个协作模块实例的示例性过程的流程图。
26.图17是访问分布式数据结构的示例性过程的流程图。
27.图18是访问分布式数据结构的示例性过程的流程图。
28.图19是访问分布式数据结构的示例性过程的流程图。
29.图20是访问分布式数据结构的示例性过程的流程图。
30.图21是访问分布式数据结构的示例性过程的流程图。
31.图22是访问分布式数据结构的示例性过程的流程图。
32.图23图示了示例性机器的框图,在所述机器上可以在所公开的实施例中的一个或多个实施例中执行在本文中所讨论的技术(例如,方法)中的任意一种或多种技术(例如,方法)。
33.图24是可以由同步服务实现的示例性过程的流程图。
具体实施方式
34.以下描述和附图充分例示说明了具体实施例,以使得本领域技术人员能够对其进行实践。其他实施例可以并入结构、逻辑、电气、过程和其他变化。一些实施例的部分和特征可以被包含在其他实施例的那些部分和特征中或者替代其他实施例的那些部分和特征。权利要求中所阐述的实施例涵盖那些权利要求的所有可用等效物。
35.如上文所讨论的,全序广播是一种用于确保操作跨分布式系统中的每个节点来完成或者不由所述节点中的任意节点执行的技术。所公开的实施例利用全序广播架构来提供用于访问分布式数据结构(dds)的协作环境。集中式序列化过程定义了由协作的多个参与者发起的操作的次序。在至少一些方面中,所述次序可以由集中式序列化过程分配给每个操作的序列号来表示。一旦序列号被分配给操作,定义所述操作的信息以及其分配的序列号将被分发给协作的所有参与者。
36.所公开的实施例还提供了对哪些操作已经被协作中的所有参与者确认以及哪些操作尚未被如此确认的指示。由所有参与者确认的操作形成“协作窗口”的下限(排他地),表示跨参与者的未决的或者以其他方式未完全确认的操作。协作窗口的顶部由最近或最高排序的操作来表示。
37.当所公开的实施例操作时,“顶”端通过更高次序的序列号前进,并且随着时间的经过,下端也随着从每个参与者个体地接收到对操作的确认而前进。因此,协作窗口表示对分布式数据结构的序列化操作的“滚动”窗口。
38.在所公开的实施例中,每个参与者(例如,作为协作的一部分的计算设备,或者协作模块的实例,如下文进一步讨论的)个体地负责将每个序列化操作应用于其自己的分布式数据结构的副本。因此,如果操作是由第一参与者对由包括二十个参与者的协作会话访问的分布式数据结构发起的,则该操作将在分布式数据结构的二十个本地副本上物理地执行二十次,针对每个协作参与者执行一次。
39.所公开的实施例部分地由将硬件处理电路配置为执行实现所公开的实施例的操
作的指令来实现。为便于讨论,这些指令被统称为协作模块。所述指令可以被实例化以提供运行软件程序,所述软件程序可以访问执行在本文中所描述的指令和功能所必需的指令和数据。该实例化程序在本公开全文中被称为协作模块实例。每个协作模块实例操作用于将适当的硬件处理电路配置为执行在本文中所讨论的并且归因于其的功能中的一项或多项功能。尽管特定功能可以被归因于协作模块实例,但是并不要求明示或暗示协作模块实例包括用于实现在本文中所描述的功能中的所有功能的指令。相反,当特定功能被归因于协作模块实例时,协作模块实例仅需要包括实现该特定功能所必需的指令。
40.所公开的实施例中的一些实施例提供用于协作文本编辑的下一代架构。为了取得成功,这些改进应当提供快速加载时间、降低变化传播中的延迟、提供流畅的用户体验、以及以合理的成本高度可扩展。这种下一代架构还应当提供可扩展的背景,同时还提供相对简单的实现方式,例如,通过提供无状态操作模式。下一代架构应当将智能服务与在线协作相结合,并且支持文档分支。
41.所公开的文本编辑过程包括至少三个操作:插入、删除和注释。因为所述协作的多个参与者可能同时地编辑文本的相同部分,所以建立冲突规则以确定在检测到时如何解决跨协作模块实例的冲突编辑。所公开的实施例经由单个序列化服务将在每个协作模块实例处发生的改变分发到每个其他的协作模块实例,所述单个序列化服务可以经由集中式服务(诸如下文所讨论的同步服务)或者经由对等协议来实现。
42.所述序列化服务为每个操作分配序列号,并且将所述操作中的每个操作分发给协作的所有参与者。当特定操作已经被成功地分发到每个协作模块实例时,所述序列化服务也通知所有协作模块实例,使得所有协作模块实例都能够将该操作完全地合并到其分布式数据结构的永久副本中(例如,将协作窗口的底部按操作次序向前移动)。在适当的情况下,在参与所述协作的协作模块实例与所述序列化服务之间的消息可以被加密以确保安全通信。
43.所公开的实施例可以使用发布/订阅数据模式来实现。例如,syphon是使用apache kafka构建的高度可用并且可靠的分布式发布/订阅系统,并且可以在所公开的实施例中的一些实施例中使用。所公开的实施例可以提供多种不同类型的分布式数据结构,包括列表、映射、序列和流。在一些方面中,这些数据结构可以经由合并树来实现。
44.所公开的实施例提供导致跨所有协作模块实例的一致状态的协作模型。改变被乐观地复制,因为当改变发生时,其被分发到协作模块实例,并且然后在操作无法被分发到参与所述协作的所有协作模块实例的罕见事件中被反转。所公开的实施例立即提供本地改变的本地应用,导致针对交互式环境的低延迟。此外,由所公开的实施例提供的操作原语可以被用于构建更复杂的分布式数据结构,诸如丰富的字符串、表格、计数器、图形和其他类型的分布式数据结构。
45.一些实现方式提供对合并树的使用来表示共享的文档结构。所公开的合并树实现方式将来自参与所述协作的所有协作模块实例的改变的集成委托给每个个体协作模块实例。尽管这引起跨每个协作模块实例对每个操作的复制,但是其也减少了对同步服务的处理需求。合并树支持分层富文本构造,诸如嵌套表,并且启用具有交叉引用(诸如脚注)的多流文本。所公开的实施例中的一些实施例提供能够有效地高速缓存合并树中的信息并且参考在空间(文本中的位置)和时间(修订历史中的位置)两者中的合并树位置的智能服务。
46.所公开的合并树提供从所述树的另一分支的分支、合并和持续集成。合并树可以有效地使用存储并且提供对共享的合并树结构的历史中的点的取回。通过向加入协作模块实例提供记录的文档的副本和任何未决改变来促进协作会话的加入。所公开的实现可以提供本地垃圾收集,其导致稳定的存储器使用和紧凑的存储。所公开的合并树为同步服务中的操作处理提供恒定的时间和空间要求,这导致具有成本效益的同步服务部署。
47.所公开的实现方式进一步提供本地操作的经改进的性能,因为本地操作考虑在协作下的数据结构的总长度。这些实现方式可以提供在本地模型与协作模型之间的等效表示,这与提供拆分表示的google的操作转换(ot)和冲突树复制数据类型(crdt)的实现方式形成对比。这简化了相对于ot和crdt的实现方式。所公开的实施例还提供了经简化的撤销/重做架构。通过向上遍历所述树以标识正确的位置/范围,能够直接从所述合并树的段中读取支持撤消/重做操作的信息。改变跟踪也是在所公开的合并树中固有的,因为合并树的段直接映射到对底层协作数据结构所做的每个改变。此外,假定所述合并树具有很少的内部节点,树的克隆相对较快。最后的观察是:所公开的实施例为诸如插入、移除和注释之类的常见操作提供经改进的性能,同时对于更复杂并且不太常见的操作具有不比其他方法更差的性能。
48.图1a是协作消息传递架构的概览图。协作系统100示出了两个用户101a-b分别经由个体计算设备102a-b进行协作。分布式数据结构视图103a-b分别在显示屏104a-b上被示出给两个用户101a-b。在图1a中所示的协作消息传递架构促进了在所述协作中将用户10la-b中的任一用户对分布式数据结构(其至少一部分由视图103a-b示出)的编辑传播给其他参与者(例如,设备和/或协作模块实例)。尽管图1a仅示出了两个用户,但是所公开的实施例设想到了通过任意数量的用户/设备/协作模块实例进行协作。
49.图1a也示出了两个协作模块实例105a-b。协作模块实例105a-b中的每个协作模块实例表示被存储在非暂时性计算机可读存储介质上的一组指令和数据。协作模块实例105a-b中的指令分别将客户端设备102a-b中的每个客户端设备配置为执行在本文中所描述的功能中的一项或多项功能。在一些方面中,参与特定协作的每个协作模块实例将在不同的物理设备上运行。在一些情况下,多个协作模块实例可能在单个物理设备上运行。在一些方面中,协作模块实例105a-b中的一个或多个协作模块实例可以在除了客户端设备102a-b之外的设备(在图1a中未示出的其他设备)上执行,但是仍然可以从客户端设备102a-b接收输入并且向客户端设备102a-b提供输出。在一些方面中,协作模块实例105a可以例如在也运行同步服务106的计算机上运行。
50.术语“协作模块”并不意图以任何方式限制在本文中所公开的特征,而是仅仅用作用于引用那些共同特征的符号便利。例如,并不意图要求实现所要求保护的特征的所有指令都驻留在单个存储设备或单个计算设备上,或者例如在物理上是连续的。
51.在协作系统100的假设示例中,用户101a可以编辑分布式数据结构视图103a。本地编辑的数据由协作模块实例105a立即显示在用户101a的显示屏104a上。另外,协作模块实例105a向同步服务106发送消息110a。消息110a指示由用户101a执行的编辑操作的性质。例如,消息110a可以指示所述操作是插入操作、移除操作还是注释操作。消息110a还可以指示针对插入操作的插入点。换言之,在分布式数据结构视图103a内插入数据的位置。如果所述操作是移除操作,则消息110a指示被移除的分布式数据结构数据的范围。消息110a还指示
针对所述操作的参考序列号。所述参考序列号是用户101a(和设备102a)在分布式数据结构执行主题操作时对其进行操作的分布式数据结构的版本。
52.在接收到消息110a时,同步服务106为由消息110a定义的操作生成序列号。同步服务106然后向参与所述协作的协作模块实例105a-b中的每个协作模块实例广播标识由用户101a(和计算设备102a)执行的操作的消息。在图1a的示例中,这包括协作模块实例105a-b两者。在一些实施例中,所述广播可以是使用广播目的地地址的实际广播网络消息。在其他实施例中,所述广播可以包括共同地寻址参与协作系统100的每个协作模块的两个或更多个单播或多播消息。广播消息被示为消息120a和120b。在一些情况下,所述广播消息(例如,在图1a的示例中被统称为120a和120b)也可以指示参与所述协作的每个协作模块已经被通知由设备102a发起的操作。替代地,如在图1a中所示的,单独的广播消息(被共同示为消息130a和130b)可以指示由用户101a(和计算设备102a)发起的操作已经被成功地传播到参与所述协作的所有协作模块。
53.在图1a中所示的实施例中,同步服务106跨在分布式数据结构上发生的所有操作强制实施共同的操作次序,无论哪个协作模块发起所述操作。因此,在一些情况下,本地操作次序可以与由所述同步服务强制执行的操作次序不同。为了解决在本地操作次序与跨参与所述协作的所有协作模块共同的操作次序之间的差异,所公开的实施例提供冲突规则来解决这些差异。例如,在维护面向串的分布式数据结构的一些实施例中,具有更大序列号的插入操作(在公共次序中比第二插入更晚发生)比第二插入更早地放置在所述串中。在其他情况下,由两个不同的协作模块发起的两次删除可能重叠。一些实施例通过确定具有较早(例如,较小)序列号的删除操作用于执行所述删除来解决重叠删除,而较晚的删除的重叠部分基本上没有影响。
54.尽管上文参考同步服务106讨论了协作系统100,但是在一些其他实施例中,可以使用对等协议来实施操作次序。例如,一些实施例可以基于诸如orbitdb之类的开源库为数据分配序列号。
55.上文所描述的所述协作系统使得对分布式数据结构视图103a-b的每次编辑转换通过由协作模块实例105a-b中的至少一个协作模块实例维护的多达三种不同的状态。
56.图1b是图示了操作如何在三种状态之间移动的状态转换图。在图1b中被命名为“仅本地”的第一状态155表示在协作模块(例如,102a)已经执行本地编辑但是该编辑尚未被同步服务106(例如,经由消息120a)确认之后的操作状态。操作仅存在于发起所述操作的协作模块上的第一状态155中。所述操作将在处于第二状态中而不是处于第一状态中的第二协作模块上初始化。
57.当操作/编辑已经被同步服务106(例如,经由消息120a和/或120b)确认后,所述操作存在于第二状态160中。所述编辑的该第二状态可以存在于除了执行或导致所述编辑的所述协作模块之外的协作模块处。当所有协作模块都已经确认所述编辑并且对此的指示已经经由同步服务106(例如,经由消息130a或130b)被传播到所述协作模块时,所述编辑的第三状态165(在图1b中被命名为“同步”状态)存在于协作模块上。该第三状态可以被认为是“同步”状态,因为所述操作已经跨所述协作模块被同步,并且可能不再需要跟踪所述编辑的信息,因为经编辑的数据在所述分布式数据结构内被认为是“记录的”。
58.所公开的实施例通过协作模块以明确定义的次序处理对分布式数据结构的编辑
或操作。同步服务106通过为每个操作分配独有的序列号来定义操作的次序。尽管每个编辑或操作都被分配了标识所述操作自身的序列号,但是所述编辑在所述分布式数据结构的特定版本上操作。该特定版本可以通过与被分配给所述编辑或操作的序列号不同的第二序列号来标识。贯穿本公开,该第二序列号可以被称为针对所述编辑/操作的参考序列号。
59.下文是在操作的序列号与参考序列号之间的区别的一个操作示例。具体而言,在由第一序列号标识的第一操作被应用于分布式数据结构之后,所述分布式数据结构的结果版本可以由第一序列号来标识。所述第一序列号定义所述分布式数据结构的第一“版本”。由第二序列号定义的第二操作将修改所述分布式数据结构的第一“版本”,其包括由第一操作(例如其结果)引起的修改。该第二修改的结果是所述分布式数据结构的第二版本。由额外的序列号定义的进一步后续操作将进一步修改所述分布式数据结构以形成由那些序列号定义的额外的新“版本”。
60.基于操作的序列号和其所操作的分布式数据结构的版本,每个协作模块能够恰当地将在其他协作模块处发起的操作应用到其自己的分布式数据结构的副本。即使当多个协作模块可能“同时地”修改所述分布式数据结构时,以及甚至当一些协作模块在与所述分布式数据结构的演进版本同步方面可能滞后时,这也是可能的。
61.这是经由两个规则来完成的。首先,如果操作由本地协作模块发起,则由所述本地协作模块发起的后续操作对包括由第一操作引起的修改的分布式数据结构的版本进行操作。换言之,协作模块操作以顺序次序执行,没有例外。此外,本地操作应用所有远程操作,而不管序列号如何。
62.关于在本地设备处对特定的远程发起的修改的应用,所述本地设备可以仅考虑其已经接收到通知的操作中的一些操作。当将特定操作应用于分布式数据结构时,与远程发起的操作的操作序列号相比,具有较低参考序列号的操作(本地和远程两者发起的)是相关的。具有较高操作序列号的操作在发起特定操作时在发起设备处不可见,并且因此在确定如何将特定操作应用于分布式数据结构时是不相关的。
63.图2a示出了在所公开的实施例中的一个或多个实施例中的协作模块实例(例如105a-b)与同步服务106之间交换的消息的示例性消息格式。在一些方面中,消息110a、120a-b和130a-b中的任意消息可以包括下文关于图2a所讨论的字段中的一个或多个字段。
64.消息200包括协作标识符字段202、参考序列号或版本字段204、操作序列号字段206、操作类型字段208、操作范围字段210、操作数据字段212、以及最大序列号字段214。协作标识符202独有地标识参与所述协作的协作模块。协作标识符202标识发起由消息200标识的操作的协作模块。在一些方面中,当所述协作模块加入所述协作时,同步服务106为每个协作模块分配标识号。参考序列号或版本字段204标识分布式数据结构的版本,由消息200(经由字段206)标识的操作被应用到所述版本。因此,由协作模块维护的分布式数据结构的每个版本经由不同的参考序列号来标识。参考序列号或版本字段204标识当进行修改时在协作模块(经由字段202标识的)同步的数据段。
65.操作序列号字段206标识由消息200所标识的操作的序列号。当发起操作的协作模块发送包括操作序列号字段206的消息时,操作序列号字段206可以被设置为指示未分配序列号的预定值(诸如-1)。所述预定值向所述同步服务指示由所述消息标识的所述操作是新的,并且因此由所述同步服务为所述操作分配序列号。在由同步服务106分配所述序列号之
前,这样的操作可以被认为处于如上文关于图1b所描述的“仅本地”状态中。
66.同步服务106可以将递增序列号分配给与由所述同步服务接收到标识那些新操作的消息的次序一致的新操作。在同步服务106为特定操作分配序列号之后,与该操作有关的消息可以在操作序列号字段206中包括所分配的序列号。
67.操作类型字段208指示由消息200指示的操作类型。在一些实施例中,所述操作类型可以指示插入、移除或注释之一的操作类型,但是本公开设想到的操作并不仅限于这些操作类型。
68.操作范围字段210指示由所述操作所操作的分布式数据结构的数据范围。在一些方面中,所述范围是单个值,诸如在流中的插入操作的位置。在一些方面中,例如,当分布式数据结构中的数据范围被删除时,可以指示数据范围。
69.操作数据字段212指示要作为所述操作的一部分而应用的数据。例如,如果所述操作类型是插入,则操作数据字段212指示要插入的数据。
70.取决于所述字段的发送方的角色,最大序列号字段214可以具有两种不同的含义。当字段214由协作模块来传输时,字段214指示由所述协作模块从同步服务106或者在使用对等协议提供操作的序列化时的对等设备接收的最大序列号。当字段214由同步服务106传输或者从利用对等协议用于序列化的另一协作模块传输到协作模块时,则字段214指示已经被参与所述协作的所有协作模块确认的最大序列号。
71.图2b是示出了在图2a的消息200与连续排序的操作集合220之间的关系215的概览图。操作220根据操作序列次序219来排序。图2b示出了分布式数据结构的快照218。快照218表示在特定版本处的分布式数据结构的数据值。图2b还示出了对从快照218导出的分布式数据结构的版本执行的连续排序的操作集合220。
72.消息200也在图2b中被示出,包括上文关于图2a所讨论的字段中的每个字段。图2b示出了消息200的操作序列号字段206可以标识连续排序的操作集合220中的最高排序的操作222。注意,当由协作模块(例如105a-b)接收到消息200时,字段206标识最高排序的操作222,因为消息200指示序列号已经被分配给操作。如上文所讨论的,当协作模块发起操作时,其将操作序列号字段206设置为预定编号,指示所述操作需要具有被分配给其的序列号。在这种场景中,与在图2b中所示的示例相反,字段206可能不一定标识最高排序的操作。
73.消息200还包括参考序列号或版本字段204,其标识对所述分布式数据结构的操作224。注意,版本字段204标识所述分布式数据结构的版本,包括操作224的结果以及在操作224之后排序的所有操作。换言之,如果版本字段204的值为950,则所述分布式数据结构的该版本包括具有序列号950、949、948、947等的操作的结果。该示例假设操作被排序,使得序列号较高的操作发生在序列号较低的操作之后。一些实施例可以使用替代方案对操作进行排序(例如,编号上较低的序列号指示比编号上较高的序列号更晚的次序)。
74.当由同步服务106传输(或者由协作模块从对等网络接收)时,消息200也标识由参与所述协作的所有协作模块确认的操作的最大序列号。该最大序列号由字段214来指示。一些实现方式可以对下文并且包括操作226的操作执行垃圾收集过程232。在操作226之后排序的操作(例如,未决的连续操作230)具有至少一个未决的确认。在图2b中所示的未决连续操作230可以在本公开全文中被称为协作窗口。所述协作窗口定义已经由同步服务106(或者用于序列化的对等协议)分配序列号但是尚未被参与所述协作的所有协作模块确认的操
作。当所公开的实施例操作时,所述协作窗口表示滚动窗口,因为其通过由同步服务106(或对等协议)排序的顺序操作前进,其中所述协作窗口的顶部由最近分配的或最高排序的序列号来定义,并且所述协作窗口的底部由参与所述协作的所有协作模块确认的最大序列号(排他地)地定义。
75.图2c示出了在两个协作模块实例105a-b与同步服务106之间的示例性消息通信。尽管同步服务106是同步服务的示例,但是其他实施例可以使用对等协议来促进在协作模块实例之间的操作的序列化。
76.图2c示出了由同步服务(例如106)传输到协作模块实例105a的消息234。消息234可以包括上文关于图2a所讨论的字段中的一个或多个字段。具体地,消息234被示为传送值为十(10)的操作序列号(例如,经由版本字段204)、为九(9)的版本(例如,经由字段206)、以及为八(8)的最大序列号(例如,经由字段214)。由于消息234由同步服务106传输到协作模块实例105a,因此消息234的最大序列号值八(8)指示由参与所述协作的所有协作模块确认的操作的最大序列号。因此,在由同步服务106传输消息234时,所述同步服务已经从参与所述协作的所有协作模块接收到确认,直到并且包括分配了序列号八(8)的操作。
77.接下来,协作模块实例105a对所述分布式数据结构执行新操作并且传输消息235。消息235可以包括上文关于消息200和图2a所讨论的字段中的一个或多个字段。具体地,消息235被示出为指示协作模块实例105a以初始序列号-1发起第一操作。
“‑
1”是由在所公开的实施例中的一些实施例定义的第一预定(序列)号的示例,以指示尚未将序列号分配给在消息235中所定义的第一操作(例如,经由字段208、210和212中的一个或多个字段)。消息235还指示该第一操作是由协作模块实例105a在分布式数据结构的版本10上执行的。这指示在执行由消息235定义的操作之前,所有操作直到并且包括分配了序列号十(10)的操作都被应用于所述分布式数据结构。换言之,当执行由消息235定义的第一操作时,考虑了从直到并且包括操作十(10)的操作导出的任何结果。因此,如果第一操作依赖于由那些操作中的任意操作修改的所述分布式数据结构的一部分,则所述第一操作的结果基于那些修改。
78.消息235还指示由协作模块实例105a接收的最大操作序列号是十(10)(如由消息234所提供的)。在一些方面中,消息235中所图示的所述最大操作序列号可以被包含在字段214中。消息235用作协作模块实例105a对直到序列号十(10)的所有操作的同步服务106的确认。
79.接下来,图2c示出了由协作模块实例105b传输到同步服务106的消息236。消息236可以包括上文关于消息200所讨论的字段中的一个或多个字段。消息236标识协作模块实例105b(例如,经由字段202),并且指示协作模块实例105b已经发起新操作,其可以在所述消息中定义(例如,经由字段208、210、212,未示出)。消息236还指示对所述分布式数据结构的版本八(8)进行操作的第二操作。换言之,当对所述分布式数据结构执行所述第二操作时,协作模块实例105b包括具有高达并且包括序列号八(8)的序列号的任何操作结果。消息235还指示协作模块实例105b已经接收到最大操作序列号八(8)。因此,当与协作模块实例105a相比时,协作模块实例105b在对操作的通知方面有些落后。当与协作模块实例105b相比,协作模块实例105a已经被通知两个额外的操作(操作九(9)和十(10))。
80.注意,在消息236被同步服务106接收之后,两个操作需要具有分配的序列号,第一
操作由协作模块实例105a发起,并且第二操作由协作模块实例105b发起。还要注意,如上文所讨论的,协作模块实例105b有些落后,因为其仍然不知道操作被排序为九(9)和十(10)。对此,所述同步服务将消息237和238传输到协作模块实例105b。
81.消息237和238中的一个或多个消息可以包括上文关于消息200和图2a所描述的字段中的一个或多个字段。在一些方面中,消息237和238可以被广播或多播到不仅仅是协作模块实例105b的更多协作模块。消息237和238至少分别向协作模块实例105b通知分配有序列号九(9)和十(10)的操作。消息237和238可以提供定义由序列号九(9)和十(10)(例如,经由字段208、210和212)标识的操作的额外信息。
82.由同步服务106对消息237和238的传输展示了所公开的实施例中的若干实施例的至少一个设计参数,即跨所有协作模块强制执行单一操作次序的设计参数,以及确保每个协作模块接收有序操作的通知的设计参数。因此,由于协作模块实例105b经由消息236指示其最大接收到的序列号是八(8),因此同步服务106通过将操作九(9)和十(10)传送到协作模块实例105b(分别经由消息236和237)进行响应,使得分发模块也能够经由消息239传送被分配序列号十一(11)的后续操作。如所示的,消息239指示最初由消息236指示的第二操作已经由同步服务106分配序列号十一(11)。类似的消息240向协作模块实例105a通知第二操作、其对序列号11的分配、以及在其上执行第二操作的分布式数据结构的版本(如在消息236中所指示的)。
83.图2c还示出了从同步服务106传输到协作模块实例105b的消息241。消息241示出了由协作模块实例105a发起并且由消息234指示的第一操作已经被所述同步服务分配了序列号十二(12)。消息241可以(例如,经由字段208、210和212)提供定义所述第一操作的额外信息。注意,消息241中的版本指示等同于在消息235中所提供的指示,因为这两个消息定义了相同的操作。消息241的最大序列号指示为八(8),指示参与所述协作的所有协作模块的下限(在本示例中由协作模块实例105b设置)。所述同步服务向协作模块实例105a发送消息242。在一些方面中,消息241和242可以是向协作模块实例105a和105b广播或多播的相同消息。
84.图2c还示出了示例性心跳消息243。心跳消息243可以包括上文关于图2a和消息200所讨论的字段中的一个或多个字段。心跳消息243可以在预定或配置的不活动时段之后由协作模块实例105b来传输。不活动可以由协作模块实例105b向同步服务106所传输的消息来定义。在不活动确定中可以不考虑由协作模块实例105b接收到的消息。由于消息243是心跳消息,所以序列号字段(例如,字段206)被设置为第二预定值以区别于具有未分配序列号的操作的第一预定值(例如,在消息235和236中)。心跳消息243指示(例如,经由字段214)由协作模块实例105b接收到的最大序列号是十二(12)。
85.消息244指示协作模块实例105a已经发起对所述分布式数据结构的版本十二(12)的第三操作(当通过协作模块实例105a将第三操作应用于分布式数据结构时,考虑按编号12和更低排序的所有操作)。响应于接收到消息244,同步服务106向参与所述协作的所有协作模块分发第三操作的通知。对此,图2c示出了将消息245和246分别传送到协作模块实例105b和105a的同步服务。在一些方面中,消息245和246可以是同时地广播或多播到至少两个协作模块实例105a-b的相同物理消息。注意,消息245和246指示与在消息244中最初指示的相同的版本信息(12)和协作模块标识(105a)。还注意,心跳消息241更新了由协作模块实
例105b接收到的最大序列号。由于协作模块实例105b先前表示协作窗口的下限,因此消息245和246通过指示最大序列号值十二(12)(这与心跳消息243一致)来指示对所述协作窗口的底端的更新。
86.图2d示出了在协作模块实例105a-b与同步服务(在这种情况下是同步服务106)之间的示例性消息交换250。下文关于图2d所讨论的消息中的一个或多个消息可以包括上文关于图2a中的消息200所讨论的字段中的一个或多个字段。
87.在图2d中所图示的所述消息交换旨在展示诸如同步服务106的同步服务如何在操作被分发到参与协作的协作模块实例(或设备)时调整针对所述操作的参考序列号。这些调整允许协作模块实例在分布式数据结构上执行操作而不会阻塞或者以其他方式在继续之前等待所述同步服务。具体地,当协作模块实例执行多个操作时,在由所述同步服务为那些操作中的任意操作分配序列号之前,这些调整可能是适当的。
88.图2d示出了一系列三个消息251a-c,指示分别由协作模块实例105a发起的第一、第二和第三操作。消息251a-c都指示没有序列号被分配给第一、第二或第三操作中的任意操作(例如,经由针对序列号的示例性预定值-1)。消息251a-c中的每个消息还示出了针对其各自的操作的参考序列号十(10)。注意,所述参考序列号不随着三个消息251a-c中的每个消息被发送而改变。这是协作模块实例105a在三个操作的发起之间没有从所述同步服务(例如106)接收任何消息的结果。
89.接下来,图2d示出了发送一对消息252a-b的同步服务。在一些方面中,在图2d中所示的两个消息252a-b可以是向协作模块实例105a-b两者广播或多播的单个物理消息。消息252a-b指示序列号11已经被分配给由消息251a定义的第一操作。由第一操作操作的分布式数据结构的版本被(一个或多个)消息252a-b标识为版本十(10)。
90.接下来,图2d示出了同步服务106分别向协作模块实例105b和105a传输消息253a-b。与针对消息252a-b的情况一样,消息253a-b可以是分别广播或多播到协作模块实例253b和253a的单个物理消息。消息253a-b指示序列号已经被分配给由协作模块实例105a发起的第二操作(并且由消息251b指示)。注意,尽管协作模块实例105a指示针对第二操作的参考序列号为10(参见消息251b),但是当第二操作被分配序列号时,同步服务指示针对第二操作的参考序列号(具有序列号十二(12))是十一(11)。注意,该参考序列号等同于被分配给在(一个或多个)消息252a-b中所指示的操作的序列号。因此,所述同步服务基于其对由协作模块实例105a执行的多个操作的序列的了解来更新针对第二操作的参考序列号。
91.具体地,同步服务106被通知协作模块实例105a执行第一操作,并且然后接着是第二操作,并且然后是第三操作。该通知由消息序列251a-c来提供。因此,所述同步服务被提供关于第二操作在包括第一操作的结果的分布式数据结构的版本上执行的指示,所述第一操作经由(一个或多个)消息252a-b分配了序列号11。结果,所述同步服务在(一个或多个)消息253a-b中指示第二操作(序列号十二(12)在包括第一操作的结果的分布式数据结构的版本十一(11)上执行)。
92.类似地,同步服务106以类似方式更新针对第三操作的参考序列号。如在图2d中所示的,同步服务106传输消息254a-b(其可以与252a-b和253a-b相同),通知参与所述协作的协作模块实例第三操作由协作模块实例105a发起。第三操作最初在消息251c中被指示。所述第三操作被分配了序列号十三(13)。所述第二操作被分配了序列号十二(12)。由于第三
操作是对包括第二操作的结果的分布式数据结构的版本执行的,因此同步服务106在(一个或多个)消息254a-b中指示针对第三操作的参考序列号十二(12)。
93.图2e是快照过程的概览图。快照过程260示出了图1a的同步服务106,向持久性服务268提供操作记录265。持久性服务268将操作记录265馈送到操作日志270。在一些方面中,持久性服务268与所述同步服务集成。
94.操作日志270包括个体记录272,每个个体记录定义操作。被包含在操作日志270中的个体记录272可以按照由同步服务106分配给每个操作的操作序列号定义的次序被包含。
95.在一些方面中,操作日志270的每个个体记录可以由被包含在消息200的字段中的值中的一个或多个值组成,如上文所描述的。操作日志270由快照服务280来读取。快照服务280生成快照,诸如在图2e中所示的快照281a和281b。快照表示分布式数据结构在特定时间点处的状态。例如,快照281a可以表示在将直到并且包括由个体记录272表示的操作的所有操作被应用于数据结构之后的分布式数据结构的状态。快照服务280可以接收第一快照(诸如快照281a)以及序列号大于在第一快照中所包括的最大序列号操作的操作的额外操作记录集合作为输入。这些操作记录在图2e中被表示为285。快照服务280然后将额外的操作285应用到第一快照281a以生成第二快照281b,其表示直到并且包括操作记录288的分布式数据结构的第二状态。
96.图2e还示出了供应服务290。供应服务290负责将新的协作模块联机到现有的协作中。对此,供应服务290向新的协作模块(图2e中的102c)提供最新的快照,图2e中的281b。供应服务290还向新的协作模块实例105c提供序列号大于被包含在先前快照281b中的那些操作的操作记录。图2e将这些操作记录示为292a,其作为292a从操作日志270读取并且作为记录292b被提供给新的协作模块实例105c。协作模块实例105c然后将操作记录292b应用于快照281b以获得由所述协作管理的分布式数据结构的“当前”或最新版本。
97.图3是示出了在所公开的实施例中的一些实施例中可以被用于构建树的两个数据结构的视图300。在这些实施例中的一些实施例中,树数据结构被生成和维护以包括一个或多个块301以及一个或多个元素320。除了所述树的叶子级别之外,所述树的所有级别包括下文关于块数据结构301所描述的字段中的一个或多个字段,而所述树的叶子节点可以包括下文关于叶子/元素数据结构所描述的一个或多个字段。如下文所描述的示例性合并树数据结构(叶子、节点、块、树、元素等)表示在物理硬件存储器中提供的数据值的示例性格式。例如,下文所描述的字段中的每个字段可以在硬件存储器中存储一个或多个值。这些值可以由硬件处理电路(诸如一个或多个硬件处理器)存储在存储器中。这些值还可以由一个或多个硬件处理器根据需要从硬件存储器中读取以执行在本文中所讨论的功能中的一项或多项功能。在一些实施例中,硬件处理电路可以经由标识数据值中的每个数据值的存储器地址来写入或读取所述值。在一些方面中,所述存储器地址可以是基于字的地址,并且数据值可能不必被存储在所述存储器内的字对齐的物理位置中。在这些情况下,如在本领域中已知的,硬件处理电路可以被配置为读取包括特定值的数据字,并且然后在硬件处理电路内对字值执行额外的处理,以便隔离非字对齐值。所公开的实施例可以利用通过硬件处理电路访问被存储在硬件存储器中的一个或多个数据结构的任何现有方法。
98.下文关于图3所讨论的示例性块301具有可变长度。换言之,块301可以被存储在硬件存储器的可变数量的部分中(例如,可变数量的字节、字等)。长度基于参与协作的协作模
块的数量以及所述协作的当前协作窗口的尺寸两者而变化。所述协作窗口可以被认为是跨参与所述协作的所有协作模块已经被发起但是尚未最终确定(“同步”)的对分布式数据结构的多个编辑或操作。为了跟踪对分布式数据结构的尚未被完全同步/确认的编辑,块301包括最小长度字段302。块301的最小长度字段表示由在跨所有协作模块通用的或同步的块下方的树的元素所表示的分布式数据结构的长度。换言之,至少在一些方面中,最小长度字段302表示由所述块下方的元素表示的并且与小于或等于在字段214中接收到的最大序列号的序列号相关联的数据长度,如上文所讨论的。
99.块301还包括可变数量的协作模块标识符字段,诸如字段304。字段314被示为协作模块标识符字段的另一示例,但是在合并树块301中的协作模块标识符字段的数量可以从零到可能的任意上限变化,仅受参与协作的协作模块的数量限制。
100.针对合并树块301中所包括的每个协作模块实例标识符,在合并树块301中也包括可变数量的数据对。每对数据关联参考序列号(例如306
1..n
)和长度值(例如,被存储在字段308
1..n
中)。被存储在字段316
1..n
中的序列号值和被存储在字段318
1..n
中的长度值被示为与不同的协作模块实例标识符314相关联,以示出每个协作模块实例标识符的关联数量可以变化。
101.上文引入的块301的字段跟踪由合并树表示的分布式数据结构的哪一部分对于参与所述协作的每个协作模块实例是可见的。由这些字段提供的信息针对由所述参考序列号(例如306
1..n
和316
1..n
)标识的分布式数据结构的每个版本进行维护。当确定如何将源自本地或远程协作模块实例的操作应用于特定合并树时使用该信息。该信息可能是必要的,因为当远程协作模块发起操作时在所述远程协作模块处的分布式数据结构的版本可能不等同于在第二协作模块处的分布式数据结构的第二版本。在所公开的实施例中的一些实施例中,第二协作模块需要以复制由远程协作模块获得的结果的方式将所述操作应用于所述分布式数据结构的该第二版本。部分长度信息支持这些操作。
102.针对特定块和针对特定协作模块的部分长度信息可以由下文的等式1来定义,其中,对由所述块表示并且满足定义的条件的所有叶子节点元素执行求和:
103.plen(op client,op ref seq,block)=minlen(block)
104.∑len(leaf.op seq≤op ref seq) len(leaf.client=
105.op client and leaf.op seq>op ref seq)
ꢀꢀꢀ
(1)
106.其中:
107.minlen()返回由所述块所表示的数据的最小长度(由所述块所表示的同步数据的长度),
108.len()返回在分布式数据结构中由匹配所标识的(一个或多个)条件的元素所表示的数据的长度,
109.op client是发起所述操作的协作模块的标识符,
110.op ref seq是针对所述操作的参考序列号,
111.leaf node.client标识发起由叶子节点表示的操作的协作模块,
112.leaf node.op seq是由叶子节点表示的第二操作的操作序列号
113.示例性元素320包括数据字段322、操作序列号字段324、删除序列号字段325、参考序列号字段326和协作模块标识符字段328。数据字段322包括表示协作数据的一部分的数
据(例如,分布式数据结构)由特定元素来表示。操作序列号字段324标识被分配给由所述元素表示的操作的序列号。删除序列号字段325标识用于删除由元素320表示的数据的操作的序列号。换言之,操作序列号字段324可以指示插入或注释数据的操作的序列号,并且如果该数据随后被删除,则删除序列号字段325将指示该(后续)操作的序列号。
114.参考序列号字段326指示当协作模块执行由元素320定义的操作时由该协作模块接收的同步操作的最大序列号。同步操作可以是已经被参与协作的所有协作模块确认的那些操作。协作模块标识符字段328标识发起所述操作的协作模块。
115.以下图4-13表示支持在两个协作模块之间的协作的数据结构,为简单起见,其被称为协作模块实例105a和协作模块实例105b。这两个协作模块实例105a-b中的每个协作模块实例都在编辑字符串结构,并且合并树数据结构支持跨这两个协作模块实例105a-b的这些编辑的同步。
116.图4示出了由协作模块实例105a维护的合并树部分400的示例。合并树部分400表示字符串“cat on the mat”。该字符串是两个子字符串的级联的结果。第一子字符串“on the mat”由合并树部分400的元素405a来表示,以及第二字符串“cat”被协作模块实例105a插入到字符串“on the mat”的位置零(0)处。所述插入操作由元素405b来表示。元素405a-b中的每个元素可以利用上文关于合并树块301所讨论的字段中的一个或多个字段。
117.由元素405b表示的所述插入操作尚没有被服务器确认,并且因此被分配序列号-1,如所示的。由元素405a表示的“cat”的插入的参考序列号为零(0),因为所述插入发生在分布式数据结构的一版本上(字符串“on the mat”),其中,最高次序的操作分配了序列号零(0)。
118.图4还示出了树部分400的块420。树的块420存储最小长度值422(例如,在一些方面中,被存储在字段302中)。最小长度值422对应于数据“on the mat”的长度,由元素405a来表示。由元素405a表示的数据是确认数据,因为参与所述协作的所有协作模块实例都具有导致字符串“on the mat”的确认操作。由于分配了小于或等于当前参考序列号的序列号的操作的结果(例如,在一些方面中,如在来自同步服务106的字段214中所提供的),因此对参与所述协作的所有协作模块实例都是可见的。这样,该数据的长度能够被包含在最小长度值422中。
119.块420也包括针对协作模块实例105a的部分长度信息,如424所示。当协作模块实例105a访问序列号为零或更多的那些段时,部分长度信息424指示块420下方的段包括数据的四(4)个额外字符(超出最小长度)。这对应于由协作模块实例105a对“cat”的插入。块420不包括针对协作模块实例105b的任何部分长度信息,指示在任何情况下都没有额外数据可用于协作模块实例105b(因为队“cat”的插入尚未被同步服务106分配序列号,并且因此对于协作模块实例105b是不可见的)。
120.图5示出了协作模块实例105b上的示例性合并树部分500。图5的示例性合并树部分500表示字符串“big on the mat”。合并树部分500包括由元素505a表示的字符串部分“on the mat”,其与上文关于协作模块实例105a和合并树部分400所讨论的由元素405a表示的“on the mat”字符串部分同步。
121.树部分500还包括第二元素505b,其表示字符串“big”在字符串“on the mat”的位置零(0)处的插入操作。所述插入操作由协作模块实例105b来发起。协作模块实例105b将序
列号-1分配给插入“big”操作,直到所述插入被所述同步服务确认。由元素505b表示的所述插入的参考序列号/分布式数据结构版本为零。这指示在所述分布式数据结构上执行插入“big”的操作时,考虑了具有较低排序或等效序列号为零的操作的结果。
122.图5还示出了树部分500的块520。块520指示针对块520下方的叶子元素的最小长度值522。最小长度值522表示由元素505a表示的同步数据的长度。换言之,最小长度值522指示由块520表示的、已经传出协作窗口的底端的数据的长度(例如,未决的连续操作230)。
123.块520还包括针对协作模块实例105b的部分长度信息524。部分长度信息524指示对于零或以上的参考序列号,在块520下方的叶子元素除了最小长度值522之外还包括数据的四个额外字符。块520不包括用于协作模块实例105a的任何部分长度信息。这指示除了由最小长度值522表示的数据之外,在树部分500中没有额外的数据对协作模块实例105a可见。
124.图6示出了在协作模块实例105b上的合并树部分的经更新的版本。图6的合并树部分600反映了在协作模块实例105b上发生的额外插入操作,并且因此是对合并树部分500的修改。第二插入操作在字符串中的位置四(4)处插入词语“furry”并且由元素505c表示。词语“furry”出现在字符串中的词语“big”之后,由元素505b表示。由元素505c表示的插入操作被分配序列号-1,因为所述操作尚未被服务器分配序列号;以及被分配参考序列号零,因为对词语“furry”的插入发生在从服务器接收到任何操作之前。
125.树部分600的块被示为620。块620指示最小长度值622为十一,再次表示由元素505a表示的数据。最小长度值622不包括由元素505b和505c表示的数据的长度,因为该数据未被参与所述协作的所有协作模块实例确认。所述块也包括部分长度信息612。由于协作模块实例105b发起了由元素505b和505c表示的这两个插入操作,并且这两个操作的参考序列号都为零,因此部分长度信息612指示由协作模块实例105b访问参考序列号为零或超过最小长度值622的数据的更大的参考十(10)个字符的树部分600。这十个字符表示由元素505c表示的六个字符和来自元素505b的四(4)个字符(每个字符串末尾都包括空格)。
126.图7示出了被存储在协作模块实例105b处的合并树部分600的经更新的版本。经更新的部分被标记700。树部分700示出了来自图4的由协作模块实例105a发起的插入操作“cat”已经传播(例如,经由同步服务106)到协作模块实例105b。该插入操作在树部分700中被表示为元素505d。
127.由协作模块实例105a对“cat”的插入与由协作模块实例105b对“big”和“furry”的插入冲突,因为所有这些插入都将定位字符串的零。冲突规则确定元素505d在树部分700中的位置因此基于插入操作的参考序列号来确定。针对协作模块实例105a的、对“cat”的插入的参考序列号为零。在上文所讨论的冲突规则下,“big”和“furry”插入操作向左移动,因为其将被分配大于“cat”插入的序列号的序列号(一(1))。
128.图7还示出了树部分700的块720。所述块指示最小长度值722。块720也分别指示针对协作模块实例105a和102b的部分长度信息712a-b。部分长度信息712a指示针对一(1)或更大的参考序列号的四(4)个字符的部分长度。这对应于由元素505d表示的数据的长度。由元素505b和505c表示的数据对于协作模块实例105a尚不可见,并且因此没有为协作模块实例105a提供针对该数据的部分长度信息。针对协作模块实例105b的部分长度信息712b指示针对大于或等于零(0)的参考序列号,在块720下方的元素中包括数据的十个字符。所述十
个字符包括由元素505b和505c表示的数据。部分长度信息712b也包括,针对一(1)或更大的参考序列号,块720下方的元素包括数据的14个字符的指示。与在部分长度信息712b中的参考序列号零(0)相比,针对参考序列号一(1)的数据的额外四(4)个字符是由元素505d表示的数据。由元素505d表示的数据被分配序列号一(1)并且由协作模块实例105a发起。
129.在从同步服务106接收到对“cat”的插入的通知之后,协作模块实例105b可以从同步服务106接收到对“big”的插入的确认。所述同步服务将由元素505b表示的对“big”的插入操作分配序列号二。这将在下文的后续示例中示出。
130.图8示出了来自图4的合并树部分400的经更新的版本作为树部分800。树部分800示出了协作模块实例105a已经被通知由协作模块实例105b将“big”插入到字符串中。该插入操作被表示为元素405c。对“big”的插入使用参考序列号零(0),这与由元素405b表示的对“cat”的插入的参考序列号冲突。在冲突规则下,“big”被放在“cat”之前,因为其序列号(二(2))比“cat”(其为一(1))晚。
131.树部分800包括块820。块820指示最小长度值822。块820分别包括针对协作模块102a-b中的每个协作模块的部分长度信息812a-b。部分长度信息812a指示了:针对协作模块实例105a,块820下方的元素表示针对参考序列号为零的数据的四个字符(由元素405b表示)。部分长度信息812a还指示了,针对协作模块实例105a,当参考序列号为二或更大时,块820下方的元素表示额外数据的八(8)个字符(除了最小长度值822)。数据的这八个字符由元素405b和405c表示。关于协作模块实例105b,当参考序列号为零时,部分长度信息812b指示块820下方的元素表示数据的四(4)个额外字符(超出最小长度值822)。这四(4)个额外字符由元素405c表示,其由协作模块实例105b发起并且具有参考序列号零。当协作模块实例105b的参考序列号为一(1)时,部分长度信息812b指示块820下方的元素表示额外数据的总共八(8)个字符,因为当参考序列号为一时“cat”插入对于协作模块实例105b变得可见。
132.图9示出了协作模块实例105a的经更新的版本,将树部分合并为树部分900。树部分900示出了在协作模块实例105a上已经发生的额外插入操作。所述插入操作将字符串“top of”插入到前一字符串“big cat on the mat”的位置11处。由于所述插入发生在由先前协作模块实例105a合并树中的元素405a表示的字符串“on the mat”的中间,因此元素405a被分成两个元素,被标记为元素405d和405e。新字符“top of”由元素405f表示。由于由元素405d所表示的字符“on”和由元素405e所表示的字符“the mat”两者均源自具有序列号零(0)的原始字符串“on the mat”,因此序列号零也被分配给分别表示“on”“the mat”的元素405d和405e中的每个元素。当协作模块实例105a插入“top of”字符串时,其也向服务器发送指示插入操作、插入的字符和插入位置的消息。该插入操作的序列号被分配为-1(如在图9中所示的),直到同步服务106为插入操作提供确认的序列号。
133.被包含在树部分900中的块920指示最小长度信息922。对于协作模块实例105a-b,针对合并树部分900的部分长度信息在块920中分别被示为912a-b。部分长度信息912a指示了,针对协作模块实例105a,参考序列号零包括在块920下方的元素中的数据的十四(14)个额外字符。这十四(14)个额外字符包括由元素405b、405d和405f表示的数据。当在协作模块实例105a上的参考号达到二(2)或更多时,由协作模块实例105b对“big”的插入变得对协作模块实例105a可见,并且因此部分长度信息相对于序列号零增加四(4),如由部分长度信息912a所示的。
134.关于协作模块实例105b,部分长度信息912b指示当参考序列号为零时在块920下方的元素提供四(4)个额外字符。这四(4)个额外字符由元素405c表示。部分长度信息912b还指示当参考序列号为一(1)时在块920下方的元素提供四(4)个额外字符。当协作模块实例105a的、对“cat”的插入变得对协作模块实例105b可见时,这四(4)个额外字符由元素405b表示。
135.图10示出了在协作模块实例105b上的经更新的树部分1000。树部分1000反映在协作模块实例105b从服务器接收到对“furry”的插入的确认之后的状态。如所示的,所述更新为“furry”分配了序列号。
136.块1020包括最小长度信息1022。块1020还分别指示针对协作模块实例105a和102b的部分长度信息1012a-b。部分长度信息1012a指示针对零(0)或更大的参考序列号的四(4)个字符的部分长度。这对应于由协作模块实例105a发起的元素505d表示的数据的长度。当所述参考序列号为零时,由元素505a和505c表示的数据对于协作模块实例105a尚不可见,并且因此当所述参考序列号为零时,没有为协作模块实例105a提供针对该数据的部分长度信息。
137.部分长度信息1012a还指示当针对协作模块实例105a的参考序列号为二时,由元素505b表示的四个额外字符变得对协作模块实例105a可见。当参考序列号为三时,部分长度信息1012a指示块1020下方的元素包括信息的额外的十四(14)个字符,包括由元素505b和505c(和505d)表示的数据。
138.针对协作模块实例105b的部分长度信息1012b指示对于大于或等于零(0)的参考序列号,在块1020下方的元素中包括数据的十个字符。这十个字符包括由元素505b和505c表示的数据。部分长度信息1012b还包括,针对一(1)或更大的参考序列号,块1020下方的元素包括数据的14个字符的指示。与部分长度信息1012b中的参考序列号零(0)相比,针对参考序列号一(1)的数据的额外四(4)个字符是由元素505d表示的数据。由元素505d表示的数据被分配序列号一(1)并且由协作模块实例105a发起。
139.图11示出了在协作模块实例105a已经被同步服务106通知对“furry”的插入之后在协作模块实例105a上的示例性合并树部分1100。所述插入由元素405g表示。来自服务器的通知向协作模块实例105a指示furry插入被分配序列号三(3)。
140.被包含在树部分1100中的块1120指示最小长度信息1122。针对协作模块实例105a-b,针对合并树部分1100的部分长度信息在块1120中分别被示为1112a-b。部分长度信息1112a指示了:针对协作模块实例105a,参考序列号零包括在块1120下方的元素中的数据的十四(14)个额外字符。这十四(14)个额外字符包括由元素405b、405d和405f表示的数据。当协作模块实例105a上的参考号达到二(2)或更多时,由协作模块实例105b对“big”的插入变得对协作模块实例105a可见,并且因此部分长度信息相对于序列号零增加四(4)到总共十八(18)个,如由部分长度信息1112a所示的。当协作模块实例105a上的参考号达到三(3)或更多时,协作模块实例105b对“furry”的插入变得可见,并且因此部分长度信息1112a指示针对参考号为三(3)的数据的额外的六(6)个字符,如所示的。
141.关于协作模块实例105b,部分长度信息1112b指示当参考序列号为零时,四(4)个额外字符由块1120下方的元素提供。这四(4)个额外字符由元素405c表示。部分长度信息1112b还指示当参考序列号为一(1)时块1120下方的元素提供四(4)个额外字符。当协作模
块实例105a的、对“cat”插入变得对协作模块实例105b可见时,这四(4)个额外字符由元素405b表示。
142.图12示出了合并树部分1200,其指示协作模块实例105a已经从同步服务106接收到对“top of”的插入的确认。同步服务106为“top of”的插入操作分配了序列号四(4)。这在元素405f中被示出。
143.被包含在树部分1200中的块1220指示最小长度信息1222。针对协作模块实例105a-b,针对合并树部分1200的部分长度信息在块1220中分别被示为1212a-b。部分长度信息1212a指示了:针对协作模块实例105a,参考序列号零包括在块1220下方的元素中的数据的十四(14)个额外字符。这十四(14)个额外字符包括由元素405b、405d和405f表示的数据。当在协作模块实例105a上的参考号达到二(2)或更多时,协作模块实例105b对“big”的插入变得对协作模块实例105a可见,并且因此所述部分长度信息相对于序列号零增加四(4)到总共十八(18),如由部分长度信息1212a所示的。当协作模块实例105a上的参考号达到三(3)或更多时,由协作模块实例105b对“furry”的插入变得可见,并且因此部分长度信息1212a指示参考号为三(3)的数据的额外六(6)个字符,如所示的。
144.关于协作模块实例105b,部分长度信息1212b指示当参考序列号为零时块1220下方的元素提供四(4)个额外字符。这四(4)个额外字符由元素405c表示。部分长度信息1212b还指示当参考序列号为一(1)时在块1220下方的元素提供四(4)个额外字符。当协作模块实例105a的、对“cat”的插入变得对协作模块实例105b可见时,这四(4)个额外字符由元素405b表示。通过将序列号(4)分配给由元素405f表示的对“top of”的插入,然后可以更新部分长度信息1212b以指示这一点。换言之,当访问树部分1200时,协作模块实例105b对额外信息的十五(15)个字符具有可见性(超出由最小长度信息1222所指示的),当其参考序列号是四(4)或更大时,如由部分长度信息1212b所示的。由元素405f表示的数据提供相对于序列号一(1)的额外七个字符。
145.图13示出了在协作模块实例105b接收到由协作模块实例105a对字符串“top of”的插入的通知之后存储在协作模块实例105b上的合并树部分1300。所述插入由元素505g表示。为了完成所述插入,协作模块实例105b将其先前的“on the mat”元素505a分成两个元素505e和505f以分别表示“on”和“the mat”。“top of”插入然后由元素505g表示,如所示的。
146.块1320分别包括针对协作模块实例105a-b的最小长度值1322和部分长度信息1312a-b。基于由元素505g表示的对“top of”插入,参考序列号四(4)(相当于由同步服务106分配给“top of”插入操作的序列号)的指示提供了相对于一、二或三的参考序列号的数据的额外7个字符,如由部分长度信息1312b所示的。
147.图14是用于将对分布式数据结构的操作分布到多个协作模块的示例性过程的流程图。在一些方面中,下文关于图14所讨论的过程1400可以由同步服务106执行。在一些方面中,被存储在存储器中(例如下文的指令2324)的指令(例如下文的指令2324)可以将硬件处理电路(例如下文的处理器2302)配置为执行下文所讨论的功能中的一项或多项功能。
148.在开始操作1402之后,过程1400移动到操作1405。在操作1405中,与多个协作模块实例建立协作会话。例如,如上文关于图1a所讨论的,多个协作模块实例(例如,协作模块实例105a和105b)可以各自编辑分布式数据结构,诸如文本串。建立协作会话可以包括例如取
回定义分布式数据结构的特定版本的数据,并且在一些方面中,从一个或多个对应协作模块获得定义对分布式数据结构的一个或多个进程中操作的数据。进程中操作可能尚未与参与所述协作会话的每个协作模块实例同步。
149.在操作1410中,接收对分布式数据结构的操作的指示。例如,如上文关于图1a所讨论的,对分布式数据结构执行操作的协作模块实例可以将所述操作通知给同步服务106(例如,经由图2a的消息200)。操作1410还可以包括接收对其执行所述操作的分布式数据结构的版本的指示(例如,经由消息200的版本字段204)。在操作1410中接收到的进一步指示可以包括操作的类型(例如插入、删除或注释)、发起所述操作的协作模块实例的指示(例如字段202)、与所述操作相关联的值(例如注释值或者被插入作为另一示例的字符串)、以及在分布式数据结构中执行操作的位置的标识。例如,分布式数据结构中的偏移可以标识用于插入的插入点。作为另一示例,偏移范围可以指示要由操作删除的分布式数据结构的一部分。
150.在操作1415中,序列号被分配给所述操作。在一些方面中,可以根据由针对协作模块实例的公共服务(诸如同步服务106)接收操作的指示的次序,将操作序列号分配给操作。被分配给每个接收到的操作的序列号可以是单调递增的编号或严格递增的编号。在一些方面中,当协作模块实例发起操作并且将操作通知给所述公共服务(例如,同步服务106)时,所述协作模块实例可以将针对新操作的序列号发起为预定义的编号,诸如负一(-1)。所述公共服务在接收到所述通知时,可以至少部分地基于将针对操作的序列号设置为该预定义的编号来标识需要向所述操作分配序列号。
151.在操作1420中,定义所述操作的信息被分发给参与协作会话的多个协作模块实例。在一些方面中,所述信息可以被指示为与上文关于图2a所讨论的字段中的一个或多个字段一致。操作1420可以包括生成包括所述信息的消息并且将其传输到参与所述协作会话的每个协作模块实例。例如,图1a示出了消息120a和120b向协作模块实例105a和105b中的每个协作模块实例分发消息,通知那些协作模块实例中的每个协作模块实例由协作模块实例105a发起的操作。在该特定示例中,自从由协作模块实例105a发起操作以来已经知道所述操作的协作模块实例105a经由消息120a标识被分配给所述操作的序列号。
152.操作1425确定所述信息是否已经被分发到参与所述协作的所有协作模块实例。如果否,则处理返回到操作1420,其中,所述信息被分发给一个或多个额外设备。
153.如果所述信息被分发给所有协作模块实例,则过程1400移动到操作1430,这向参与所述协作的所有设备指示被分配给所述操作的序列号是同步的。换言之,操作1430向所有协作模块实例通知每个协作模块实例现在知道所述操作。在一些方面中,操作1430是通过更新字段214来完成的,如上文关于图2a所讨论的,以指示与在操作1415中所分配的操作序列号等效的值。然后,消息200可以被传输到所有协作模块实例。这在图1a中关于额外消息130a和130b被图示出,其向协作模块实例105a和105b中的每个协作模块实例分别通知操作已经跨所有协作模块实例被完全同步。
154.例如,如上文关于图2a所讨论的,从同步服务106传输到协作模块实例(例如105a和/或105b)的消息定义了对分布式数据结构执行的操作。在一些方面中,操作1410也包括接收(例如,由同步服务106)被分配给所述操作的序列号的指示。所述指示可以被包含在由协作字段(例如,字段206)接收的消息(例如200)的字段中。操作1410还可以包括接收在其
上执行所述操作的分布式数据结构的版本的指示(例如,版本字段204中的参考序列号)。
155.图15是用于将对分布式数据结构的操作分布到多个协作模块实例的示例性过程的流程图。在一些方面中,下文关于图15所讨论的过程1500可以由协作模块实例来执行,诸如协作模块实例105a-b中的任意协作模块实例。在一些方面中,被存储在存储器中(例如下文的指令2324)的指令(例如下文的指令2324)可以将硬件处理电路(例如下文的处理器2302)配置为执行下文所讨论的功能中的一项或多项功能。
156.在开始操作1502之后,过程1500移动到操作1505。在操作1505中,确定发起操作的节点、位置、参考序列号和协作模块实例。例如,在一些方面中,过程1500可以被执行以标识要对其应用操作的树的一部分。例如,插入、删除或注释操作可以由本地操作或者由远程协作模块实例生成。所述操作可以指示所述操作将影响的分布式数据结构的一部分。例如,插入命令可以指示所述分布式数据结构内的插入点。删除操作可以指示用于删除的分布式数据结构的数据范围。注释操作可以指示针对要添加的注释在分布式数据结构中的位置。
157.操作1510将偏移变量设置到在搜索中所指示的位置。随着过程1500的继续,所述偏移变量可以改变。
158.决策操作1515评估在操作1505中标识的节点是块(树的非叶子节点)还是元素(树的叶子节点)。如果节点是叶子,则在操作1505中标识的位置在操作1518中由叶子节点来定位或表示。因此,可以返回对叶子节点的标识作为搜索的结果。过程1500然后从操作1518移动到结束操作1519。如果所述节点是非叶子节点,则过程1500从决策操作1515移动到操作1520。
159.在操作1520中,获得所述节点的子节点。在一些方面中,操作1520被配置为从所述数据结构的第一位置(例如,表示数据结构的开始部分的节点)到所述数据结构的第二位置(表示数据结构的结束部分的节点)遍历子节点。例如,当分布式数据结构表示富文本字符串时,操作1520可以被配置为提供表示字符串的开始的节点,并且操作1520的后续调用可以提供表示富文本字符串的逐渐后面部分的节点。
160.在操作1525中,确定由子节点表示的协作模块实例特定长度。基于发起所述操作的协作模块实例和在所述协作模块实例处的参考序列号来确定所述协作模块实例特定长度。例如,如上文针对图4-13中的任一个的示例性树结构所讨论的,所公开的实施例可以维护部分长度信息,所述部分长度信息定义由树结构的特定部分表示的分布式数据结构的协作模块实例特定长度。在一些方面中,所述部分长度可以基于上文所讨论的等式1来确定。
161.操作1525可以基于所述部分长度以及最小长度值来确定协作模块实例特定长度,其中,所述最小长度值指示由操作1520的子节点下方的树的一部分表示的分布式数据结构的最小尺寸或长度。针对所述子节点的部分长度值和最小长度可以被相加以确定所述协作模块实例特定长度。
162.决策操作1530确定在操作1525中确定的长度是否大于或等于所述偏移值。如果所述长度大于偏移量,则正在搜索的位置(来自操作1505)由当前节点表示的树的部分表示。在这种情况下,过程1500移动到操作1535,其通过将节点设置为前一节点的子节点而移动到树中的较低层。如果所述长度不大于所述偏移值,则当前节点不表示包括所述位置在内的分布式数据结构的一部分。因此,在操作1540中通过所确定的长度来调整所述偏移值。然后,过程1500移动到操作1545,并且确定所述节点的另一子节点(当前节点的对等节点)。
163.图16是用于将对分布式数据结构的操作分布到多个协作模块实例的示例性过程的流程图。在一些方面中,下文关于图16所讨论的过程1600可以由协作模块实例来执行,诸如协作模块实例105a-b中的任意协作模块实例。在一些方面中,被存储在存储器(例如下文的指令2324)中的指令(例如下文的指令2324)可以将硬件处理电路(例如下文的处理器2302)配置为执行下文所讨论的功能中的一项或多项功能。
164.在开始操作1602之后,过程1600移动到操作1605。在操作1605中,接收定义操作的信息。所述信息可以从针对协作会话的公共服务来接收。所述公共服务可以与参与协作会话的协作模块实例通信。在一些方面中,所述公共服务是上文所讨论的同步服务106。定义所述操作的信息可以包括上文关于消息200和图2a所讨论的项目中的一个或多个项目。例如,所述信息可以包括由所述公共服务被分配给所述操作的操作序列号。所述操作序列号独有地标识所述操作。所述信息还可以包括针对所述操作的参考序列号。所述参考序列号标识由所述操作修改的所述分布式数据结构的版本。所述信息还可以包括操作类型的指示,例如,所述操作是对所述分布式数据结构(诸如文本串或富文本串)的插入、删除还是注释。所述信息可以包括与所述操作相关联的值(例如,要插入到数据结构中的数据,或者用于注释所述数据结构的数据)。所述信息还可以包括与参与协作会话的每个协作模块实例同步的操作的最大序列号的指示(例如,字段214的值)。所述信息还可以包括分布式数据结构内用于要应用的操作的位置(例如,消息200的字段210)。
165.在操作1610中,为合并树添加或修改元素以表示所述操作。在一些方面中,操作1610可以包括为添加的/修改的元素与树的根之间的每个块节点更新协作模块实例特定部分长度信息。因此,如果协作模块实例105a发起特定操作,则特定于协作模块实例105a的部分长度信息可以针对添加的节点/元素与根之间的每个块节点来更新。
166.例如,基于特定参考序列号将数据插入到富文本字串的操作可能导致在表示插入的数据的元素与表示富文本串的树的根节点之间的每个节点被更新以关联特定参考序列号与等价于插入的数据的长度的部分长度的增加。发起所述操作信息的协作模块实例的部分长度被更新。
167.在操作1615中,接收与序列号相关联的所述操作是同步操作的指示。例如,如关于图1a所讨论的,协作模块实例105a-h中的每个协作模块实例可以接收相应的消息130a-b,指示操作已经跨参与所述协作的所有协作模块实例同步。在一些方面中,这可以通过将消息200的字段214设置为与由公共服务(例如,同步服务106)分配的操作的序列号等效的值来实现。
168.在操作1620中,基于所接收到的操作1615的指示来更新参考序列号。换言之,协作模块实现方式可以跟踪针对分布式数据结构的最大同步序列号。当协作模块实例发起操作时,其可以使用所跟踪的参考序列号作为针对所述操作的基础。换言之,所跟踪的参考序列号被用于标识所述协作模块实例在其上操作的分布式数据结构的版本。当这些操作经由诸如同步服务106的公共服务与其他协作模块实例共享时提供该信息。例如,被用作针对特定操作的基础的分布式数据结构的版本可以经由消息200被传送给其他协作模块实例,并且具体而言,在一些实施例中,经由版本字段204,如上文所讨论的。在操作1620完成之后,过程1600移动到结束操作1625。
169.图17是访问分布式数据结构的示例性过程的流程图。在一些方面中,过程1700可
以由运行协作模块实例的设备执行。例如,过程1700可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面中,执行下文关于图17所讨论的功能中的一项或多项功能的协作模块实例可以在实现方式的服务器侧运行,诸如在也运行同步服务106的计算机上运行。在一些方面中,下文关于图17所讨论的过程1700可以由协作模块实例执行,诸如协作模块实例105a-b中的任意协作模块实例。在一些方面中,被存储在存储器(例如下文的指令2324)中的指令(例如下文的指令2324)可以将硬件处理电路(例如下文的处理器2302)配置为执行下文所讨论的功能中的一项或多项功能。在下文图17的讨论中,执行过程1700的设备可以被称为“执行设备”。
170.在开始操作1702之后,过程1700移动到操作1705。在操作1705中,标识最近最少使用的节点。如上文所讨论的,在经由树表示分布式数据结构的实施例中,可以维护树上最近最少使用的节点列表。最近最少使用的节点列表可以被用于促进垃圾收集和/或树结构的其他优化。
171.在一些方面中,除了lru列表之外,还可以通过一些其他方式由操作1705标识节点。例如,如上文所讨论的,随着参与协作的所有协作模块实例确认操作的最大序列号前进,可以执行对表示分布式数据结构的数据结构的一些维护,例如,如下文所描述的。
172.决策操作1715评估被分配给由节点所表示的操作的序列号是否小于协作的所有参与者(例如,协作模块实例)已经确认的最大序列号。换言之,所述节点是表示协作窗口内还是协作窗口下方的操作。在一些实施例中,这可以通过比较由所述节点标识的两个序列号来实现。例如,所述节点可以指示插入或注释序列号(例如,经由字段324)以及还有删除序列号(经由字段325)。如果指示了多个序列号,则所有多个序列号都必须在协作窗口下方通过,然后才可以在节点上执行进一步的操作(例如,垃圾收集)。
173.如果所述节点表示仍然在协作窗口内的操作,则过程1700返回到操作1705,并且可能从lru列表中选择另一节点。
174.如果由所述节点表示的所述操作已经传递出协作窗口,则过程1700从决策操作1715移动到操作1720,其评估所述操作是删除。为了做出该确定,操作1720可以评估所述节点是否包括删除序列号(例如,字段325)。如果指示了删除序列号,则过程1700移动到操作1722并且删除叶子节点。处理然后返回到操作1705。如果所述节点不表示删除操作,则过程1700移动到决策操作1725,其确定所述操作是否是插入操作。如果所述操作是插入,则过程1700从决策操作1725移动到操作1730,其标识分布式数据结构的相邻部分(例如,由兄弟节点表示)。操作1740可以将分布式数据结构的相邻部分集成到单个叶子节点中。所述集成可以取决于那些其他部分是否也已经传递到协作窗口下方。过程1700然后返回以从lru列表中获得另一节点。
175.如果所述操作不是插入,则过程1700从决策操作1725移动到决策操作1750,其评估是否存在更多树节点。如果存在更多树节点,则过程1700从决策操作1750移动到操作1705,如上文所讨论的。如果没有更多的树节点,则过程1700从决策操作1750移动到结束操作1752。
176.图18是访问分布式数据结构的示例性过程的流程图。在一些方面中,过程1800可以由运行协作模块实例的设备执行。例如,过程1800可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面中,协作模块实例执行下文关于图18所讨论的功能中的一项
或多项功能。所述协作模块实例(例如105a-b)可以在实现方式的服务器侧运行,诸如在也运行同步服务106的计算机上运行。在一些方面中,下文关于图18所讨论的过程1800可以由协作模块实例执行,诸如协作模块实例105a-b中的任意协作模块实例。在一些方面中,被存储在存储器(例如下文的指令2324)中的指令(例如下文的指令2324)可以将硬件处理电路(例如下文的处理器2302)配置为执行下文所讨论的功能中的一项或多项功能。在下文的图18的讨论中,执行过程1800的设备可以被称为“执行设备”。
177.在开始操作1805之后,过程1800转换到操作1810,其标识开始节点。在一些方面中,所述开始节点可以是表示分布式数据结构的树的根节点。
178.在操作1815中,针对操作序列号的部分长度信息小于或等于由参与所述协作的所有协作模块实例确认的最大序列号(例如,字段214的值)。支持操作1815的推理是:一旦特定序列号小于或等于由所有协作模块实例确认的最大序列号,被分配给该特定序列号的操作已经被参与所述协作的所有协作模块实例看到和/或已经由其应用,并且因此不需要为该操作维护部分长度。注意,针对所述节点的最小长度值可以基于删除的部分长度信息进行调整。
179.决策操作1820确定是否存在要检查的额外节点。如果否,则过程1800在结束操作1840处完成。否则,过程1800移动到操作1830,其递归地遍历到树中的下一节点。
180.图19是针对访问分布式数据结构的示例性过程的流程图。在一些方面中,过程1900可以由运行协作模块实例的设备执行。例如,过程1900可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面中,所述协作模块实例可以在实现方式的服务器侧运行,诸如在也运行同步服务106的计算机上运行。在一些方面中,被存储在存储器(例如下文的指令2324)中的指令(例如下文的指令2324)可以将硬件处理电路(例如下文的处理器2302)配置为执行下文所讨论的功能中的一项或多项功能。在下文的图19的讨论中,执行过程1900的设备可以被称为“执行设备”。
181.在开始操作1905之后,过程1900移动到操作1910,其加入协作会话。所述协作会话提供对分布式数据结构的访问。加入所述协作会话可以包括建立与同步服务106的会话。在一些方面中,加入所述协作会话可以包括经由对等协议与参与所述协作会话的其他设备和/或协作模块实例进行接口。
182.在操作1915中,对所述分布式数据结构执行离线编辑。执行离线编辑可以包括对所述分布式数据结构生成操作。在利用诸如在本文中所讨论的树结构的实施例中,执行所述离线编辑可以包括在必要时生成非叶子节点和/或叶子节点以在本地表示所述离线操作。由于所述编辑可以在所述执行设备无法联系同步服务106(或者当使用对等协议时的其他对等设备)时生成,因此在所述执行设备处维护的协作窗口可能变得相对较大,包括提供所述离线编辑的所有操作。
183.在操作1920中,所述执行设备重新加入所述协作会话。例如,尽管在操作1915期间所述执行设备可能没有到同步服务106的网络连接性,但是在1920中恢复在同步服务106与执行设备之间的网络连接性。
184.在操作1925中,接收分布式数据结构的快照。如上文所讨论的,快照指示所述分布式数据结构在一时间点处的绝对值或状态。因此,作为一个示例,如果在所述快照之前对所述分布式数据结构应用了一个或多个操作,则所述快照表示那些一个或多个操作的组合结
果。
185.在操作1930中,在所述快照之后发生的任何额外操作(由其他协作模块实例发起)被传送到所述执行设备(和执行协作模块实例)。这允许所述执行设备基于所述快照和所述额外操作来表示所述分布式数据结构的版本。注意,仅有序列号大于所述快照的版本的操作才被包含在所述版本中。
186.在操作1935中,所述离线编辑被应用于所述快照。在一些方面中,操作1935包括针对所述离线编辑中的每个离线编辑传输消息200,每个消息将特定离线编辑定义为对所述分布式数据结构的操作。每个消息将由过程1900构造,与上文所讨论的消息200的描述一致。操作1935还可以包括从所述同步服务接收对应数量的响应/消息,其中同步服务106为离线编辑/操作中的每个离线编辑/操作分配序列号。所述执行设备然后可以表示分布式数据结构的额外版本,其包括1930的操作和1935的操作两者。该过程将生成由所述执行设备维护的所述分布式数据结构的版本,所述版本与由参与所述协作的其他协作模块实例所维护的分布式数据结构一致。
187.决策操作1940确定在所述离线编辑与被应用于所述快照的所述操作之间是否存在任何冲突。如果存在冲突,则过程1900移动到操作1950,其显示消除冲突对话。所述消除冲突对话被配置为提供对冲突的两个操作之一的手动选择。所选择的操作将被应用于所述分布式数据结构,而两个操作中的第二操作将被取消。如果决策操作1940确定不存在冲突,则过程1900从决策操作1940移动到结束操作1955。
188.图20是访问分布式数据结构的示例性过程的流程图。在一些方面中,过程2000可以由运行协作模块实例的设备执行。例如,过程2000可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面中,执行下文关于图20所讨论的功能中的一项或多项功能的协作模块实例可以在实现方式的服务器侧运行,例如在也运行同步服务106的计算机上运行。在一些方面中,下文关于图20所讨论的过程2000可以由协作模块实例执行,诸如协作模块实例105a-b中的任意协作模块实例。在一些方面中,被存储在存储器(例如下文的指令2324)中的指令(例如下文的指令2324)可以将硬件处理电路(例如下文的处理器2302)配置为执行下文所讨论的功能中的一项或多项功能。在下文的图20的讨论中,执行过程2000的设备可以被称为“执行设备”。注意,在各种实施例中,上文至少关于图15-19和/或21和/或22所讨论的功能中的一项或多项功能可以被包含在过程2000中。
189.在开始操作2005之后,过程2000移动到操作2010。操作2010加入协作会话。所述协作会话提供对分布式数据结构的访问。加入协作会话可以包括打开到诸如同步服务106的服务的网络连接。加入所述协作会话还可以包括向所述服务标识协作会话将提供访问的分布式数据结构。在一些方面中,所述分布式数据结构可以是文件的形式。在一些方面中,所述文件可以被存储在可经由网络访问的稳定存储设备上。在一些方面中,可以经由统一资源定位符(url)来标识所述分布式数据结构。
190.在操作2015中,接收标识对所述分布式数据结构的连续排序的操作的消息。在一些方面中,从同步服务106接收所述消息。在利用对等协议在参与所述协作会话的协作模块实例之间进行通信的一些其他方面中,可以从参与所述协作会话的其他协作模块实例之一接收所述消息。所标识的操作中的每个操作都具有未决的确认。连续排序的操作定义了所述分布式数据结构的协作窗口。换言之,所述协作窗口表示对已经由参与所述协作的某个
协作模块实例发起的所述分布式数据结构的操作,但是尚未得到参与所述协作的所有协作模块实例的确认。因此,当(关于参与所述协作的所有协作模块实例)将所述协作视为整体时,所述协作窗口表示仍在“进行中”的操作。
191.如上文关于图2a和消息200所讨论的,可以指示操作序列号(例如,经由字段206)和针对同步或确认的操作的最大序列号(例如,经由字段214)。这两个值提供了对所述分布式数据结构的连续排序的操作的指示。例如,如果针对确认的操作的最大序列号是n,并且所述操作序列号是n c(其中,c是常数),那么存在由具有未决确认的消息所标识的c个连续排序的操作。之所以如此,是因为当所有设备都确认操作时,针对确认的操作的最大序列号(例如214)“向前”前进操作序列号(例如206)。新操作将在操作序列号被分配给参与所述协作的协作模块实例时推进所述操作序列号。
192.在操作2020中,所述分布式数据结构的第一版本被表示为包括连续排序的操作中的每个操作。通过将所述分布式数据结构表示为包括所述连续排序的操作中的每个操作,对第一版本的后续操作基于所述连续排序的操作中的每个操作的结果。一些方面可以通过存储或排队定义连续排序的操作的信息来实现这一点。例如,一些实施例可以使用队列或树型数据结构来存储未决(未确认的)操作。一旦所述连续排序的操作被适当地存储或排队,在这些实施例中,所述分布式数据结构被认为是“表示”那些操作。
193.在一些方面中,一旦操作被参与所述协作的所有协作模块实例确认,所述操作就可以被应用于所述分布式数据结构。换言之,在所述分布式数据结构中所包含的数据可能被所述操作不可撤销地修改。关于如何表示对分布式数据结构的操作的细节因实施例而变化。在一些实施例中,与所述分布式数据结构上的协作异步的垃圾收集过程或其他过程可以将所述操作应用于被包含在所述分布式数据结构中的数据。例如,如上文所描述的,垃圾收集过程可以对参与所述协作的所有协作模块实例所确认的操作进行操作。在一些方面中,基于在操作2015中接收到的所述消息,所述分布式数据结构可以基于所述操作被修改。
194.在操作2025中,所述分布式数据结构的第二版本被表示为包括第一操作,所述第一操作在所述连续排序的操作的最后一个操作之后。所述第一操作由所述执行设备来发起。如上文所讨论的,一些实现方式可以存储定义未决操作的信息。因此,在这些实施例中,可以存储、排队或者以其他方式记录定义所述第一操作的信息,诸如操作的类型(例如字段208),所述操作被应用到的分布式数据结构内的位置或范围(例如字段210),所述操作被应用到的分布式数据结构的版本(例如字段204),以及发起所述操作的协作模块实例(例如字段202)。通过表示所述分布式数据结构的第二版本,对所述分布式数据结构执行的后续操作考虑了所述第一操作的结果。通过表示对所述分布式数据结构的第一操作,在所述第一操作之后的操作取决于所述第一操作的结果(在一定程度上,后续操作取决于所述第一操作的结果)。
195.在操作2030中,传输通知消息。所述通知消息指示所述第一操作被应用于所述分布式数据结构的第一版本。在一些方面中,所述通知消息包括上文关于图2a所描述的字段中的一个或多个字段。所述字段的一个或多个值特定于所述第一操作。在利用针对操作的序列化的集中式服务的实施例中,可以将所述通知传输给同步服务106。在利用对等协议进行序列化的其他实施例中,可以将所述通知传输给参与所述协作的另一协作模块实例。
196.过程2000的一些方面包括接收多个通知。所述通知中的每个通知都针对对应操
作。如上文的通知,每个通知指示被分配给所述对应操作的独有序列号。每个通知还标识发起所述操作的协作模块实例。在一些方面中,在协作模块实例与客户端设备之间可能存在一对一的映射,并且因此,对协作模块实例的标识可以与运行所述协作模块的特定实例的特定物理上不同的计算设备的标识同义。被分配给所述操作中的每个操作的所述独有序列号指示所述操作被应用于所述分布式数据结构的次序。由过程2000接收的多个通知中的一个或多个通知可以被用于由所述执行设备发起的操作。例如,如上文所讨论的,当协作模块实例发起新操作时,其可以向参与所述协作的其他协作模块实例传送与上文关于消息200所描述的字段中的一个或多个字段相对应的值。由于序列号尚未被分配给所述操作,因此其可以发送指示其的预定值。一旦被分配了序列号,就会向最初发起所述新操作的协作模块实例提供通知。该通知将指示接收协作模块实例的标识符(例如,在字段202中)。
197.在一些实施例中,过程2000可以包括发起对所述分布式数据结构的第二操作,并且稍后接收额外操作的通知。所述通知还可以指示(例如,经由被分配给额外操作的序列号)额外操作将在第二操作之前被应用于所述分布式数据结构。替代地,如果所述执行设备接收到为第二操作分配序列号的通知,并且随后接收为额外操作分配第二序列号的第二通知,则在所述额外操作之前将第二操作应用于所述分布式数据结构。
198.过程2000的一些方面包括解决对所述分布式数据结构的两个操作之间的编辑冲突。基于两个序列号的相对次序来解决所述编辑冲突,所述两个序列号中的每个序列号被分配给冲突的两个操作之一。例如,在两个编辑操作之间的编辑冲突可能导致在所述分布式数据结构中较晚排序的插入出现在较早排序的插入之前。通过按照与其分配的序列号的次序一致的次序执行删除操作来解决两个删除操作之间的编辑冲突。
199.过程2000的一些方面包括接收对更新的协作窗口的指示,所述更新的协作窗口排除连续操作中的一些操作;并且基于所接收到的指示,对所排除的操作执行垃圾回收。
200.在操作2030之后,过程2000移动到结束操作2035。
201.图21是访问分布式数据结构的示例性过程的流程图。在一些方面中,过程2100可以由运行协作模块实例的设备来执行。例如,过程2100可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面中,协作模块实例也可以在实现方式的服务器侧运行,例如在也运行同步服务106的计算机上运行。在一些方面中,下文关于图21所讨论的过程2100可以由协作模块实例来执行,诸如协作模块实例105a-b中的任意协作模块实例。在一些方面中,被存储在存储器(例如下文的指令2324)中的指令(例如下文的指令2324)可以将硬件处理电路(例如下文的处理器2302)配置为执行下文所讨论的功能中的一项或多项功能。在下文的图21的讨论中,执行过程2100的设备可以被称为“执行设备”。注意,在各种实施例中,上文至少关于图15-20和/或图22所讨论的功能中的一个或多个功能可以被包含在过程2100中。
202.在开始操作2105之后,过程2100移动到操作2110。操作2110加入协作会话。所述协作会话提供对分布式数据结构的访问。加入协作会话可以包括打开到诸如同步服务106的服务的网络连接。加入所述协作会话还可以包括向服务标识所述协作会话将提供访问的分布式数据结构。在一些方面中,所述分布式数据结构可以是文件的形式。在一些方面中,所述文件可以被存储在可经由网络访问的稳定存储设备上。在一些方面中,可以经由统一资源定位符(url)来标识所述分布式数据结构。
203.在操作2120中,接收通知。在至少一些实施例中,所述通知可以是网络消息的形式。可以从同步服务106接收所述通知。在利用对等协议在所述协作会话的协作模块实例之间进行通信的一些其他实施例中,可以从参与所述协作会话的其他协作模块实例之一接收所述通知。
204.所述通知指示由远程设备执行的操作。换言之,所述操作由执行设备之外的设备来执行。所述操作例如可以是对诸如文本串、富测试串或流等的序列数据结构的插入、删除或注释操作。所述操作可以经由被分配给所述操作的序列号来指示。
205.所述通知还指示所述操作相对于所述分布式数据结构的位置。例如,所述位置可以包括从所述分布式数据结构的开始数据点或字节到所述分布式数据结构中要应用插入、删除或注释操作的位置的偏移量,在各个方面以字节或字为单位。在插入操作的情况下,所述位置指示将新数据插入所述分布式数据结构中的位置,其中,在所述位置之后的分布式数据结构的操作前版本的数据位于新插入的数据之后。在注释操作的情况下,所述位置指示要注释所述分布式数据结构的哪个部分。在移除操作的情况下,所述位置指示要移除的所述分布式数据结构的数据。例如,所述位置可以指示要通过移除操作从所述分布式数据结构中移除的数据位置的范围。
206.所述通知还可以指示应用所述操作的分布式数据结构的版本。例如,如上文所讨论的,被应用于特定分布式数据结构的最高操作序列号可以定义该特定分布式数据结构的版本。该版本或序列号信息可以经由如上文关于图2a所讨论的包括消息200的字段中的一个或多个字段的消息传送给参与所述协作的协作模块实例,诸如在所述执行设备上运行的协作模块实例。
207.在操作2130中,标识由树的第一节点表示的分布式数据结构的一部分的最小长度。所述树表示所述分布式数据结构。操作2130中所指代的第一节点可以是树的任意节点,包括根节点或者根节点下方的节点。在一些方面中,第一节点可以是所述树的叶子节点。
208.如上文所讨论的,在将所述分布式数据结构表示为树的实施例中,所述分布式数据结构的一些部分可以跨参与所述协作的所有协作模块实例同步。因此,这些部分针对所有这些协作模块实例是恒定的,并且可以确定这些部分的长度。该长度是操作2130中提到的最小长度,并且与贯穿本公开所讨论的最小长度的讨论一致。
209.在一些实施例中,所述通知还可以指示与参与所述协作的所有其他客户端确认或同步的操作的最小序列号。例如,如上文关于图2a所讨论的,所述通知可以包括字段214。
210.在操作2140中,确定特定于第二设备并且由第一节点表示的部分长度。如上文所讨论的,当参与所述协作的设备将操作应用于分布式数据结构时,所述分布式数据结构通过并入那些操作中的每个操作的顺序版本演进。因此,参与所述协作的两个协作模块实例可以具有稍微不同的分布式数据结构的版本,直到特定的编辑已经被传送给两个协作模块实例。在操作2140中确定的最小长度考虑了跨协作模块实例的分布式数据结构版本的这些差异。操作2140确定由应用第二设备操作的分布式数据结构的版本的第一节点表示的部分长度。如上文所讨论的,所述部分长度不仅可以特定于执行操作的协作模块实例,还可以特定于应用了特定操作的分布式数据结构的版本。在一些方面中,等式1可以被用于确定所述部分长度。在一些实施例中,在执行操作2140之前,所述部分长度可能已经被先前确定,并且第一节点被更新以反映所述部分长度。
211.在操作2145中,确定由所述第一节点表示的所述分布式数据结构的部分的尺寸。所述尺寸基于最小长度和部分长度。在一些方面中,所述尺寸是最小长度和部分长度的总和。
212.在操作2150中,确定所述部分的尺寸大于或等于所述操作在分布式数据结构内的位置。如上文所讨论的,在将所述分布式数据结构表示为树的实施例中,所述树的特定节点表示所述分布式数据结构的特定部分。过程2100描述了实施例如何基于由每个节点表示的所述分布式数据结构的长度,通过搜索所述树的节点来标识哪些特定节点表示正在对其应用操作的所述树的一部分。
213.尽管操作2150指示第二设备操作的位置在第一节点处或下方,但是在其他示例中,所述尺寸可以小于所述位置,指示需要搜索所述第一节点的其他子节点以标识表示所述分布式数据结构的包括所述位置的部分的节点。该过程可以跨第一节点的兄弟节点继续,直到标识出所述树的适当分支。所述过程然后可以在所述树中的较低处进行以逐渐缩小所述分布式数据结构的部分,直到标识出表示所述部分的叶子节点。
214.在操作2160中,基于操作2150的确定来确定叶子节点。由于操作2150确定所述分布式数据结构的包括所述位置的部分由所述第一节点表示,因此操作2160可以在树中更深地进行(到第一节点的子节点)以逐渐缩小搜索范围,直到标识出表示所述位置的叶子节点。
215.在操作2170中,基于所标识出的叶子节点在所述树中表示所述第二设备操作。表示所述操作可以包括各种项目。如果所述操作是插入或移除操作,则可以在必要时拆分所标识出的叶子节点以提供单个叶子节点以包括受所述操作影响的所述分布式数据结构的部分。例如,如果执行插入操作,则所述叶子节点可以在所述位置处被拆分为三个节点,第一节点表示在所插入的数据之前的所述分布式数据结构的一部分,第二叶子节点表示所插入的数据,以及第三叶子节点表示来自所标识出的叶子节点的任何剩余数据。对于移除操作,可以更新所述叶子节点以指示针对所述操作的序列号。所标识出的叶子节点也可以被拆分以进行移除操作,使得所移除的数据由单个叶子节点来表示,或者至少未删除的数据不与被删除的数据在同一叶子节点中表示。对于注释操作,可以更新所述叶子节点以包括所述注释信息。也可以在必要时对所述叶子节点进行适当的拆分以表示所述树中的操作。
216.在操作2170完成之后,过程2100移动到结束操作2175。
217.图22是访问分布式数据结构的示例性过程的流程图。在一些方面中,过程2200可以由运行协作模块实例的设备来执行。例如,过程2200可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面中,协作模块实例也可以在实现方式的服务器侧运行,例如在也运行同步服务106的计算机上运行。在一些方面中,下文关于图22所讨论的过程2200可以由协作模块实例来执行,诸如协作模块实例i05a-b中的任意协作模块实例。在一些方面中,被存储在存储器(例如下文的指令2324)中的指令(例如下文的指令2324)可以将硬件处理电路(例如下文的处理器2302)配置为执行下文所讨论的功能中的一项或多项功能。在下文的图22的讨论中,执行过程2200的设备可以被称为“执行设备”。
218.注意,在各种实施例中,上文至少关于15-19和/或图20和/或图21和/或图24所讨论的功能中的一项或多项功能可以被包含在过程2200中。
219.在开始操作2202之后,过程2200移动到操作2205。在操作2205中,所述执行设备加
入协作。所述协作提供了对分布式数据结构的访问。加入协作会话可以包括打开到诸如同步服务106的服务的网络连接。加入所述协作会话还可以包括向所述服务标识所述协作会话将提供访问的分布式数据结构。在一些方面中,所述分布式数据结构可以是文件的形式。在一些方面中,所述文件可以被存储在可经由网络访问的稳定存储设备上。在一些方面中,可以经由统一资源定位符(url)来标识所述分布式数据结构。
220.在操作2210中,接收对分布式数据结构的序列化的多个对应操作的指示。在一些方面中,所述指示中的每个指示可以是来自序列化服务的消息,包括上文关于消息200和图2a所讨论的字段中的一个或多个字段。所述指示还指示发起所述操作中的每个操作的设备(例如消息200的字段202)。代替指示设备,所述指示可以代替地指示协作模块实例,如上文所讨论的。
221.在操作2215中,在树的叶子节点中表示对分布式数据结构(例如,经由320)的多个操作和对所述分布式数据结构(例如,至少经由322)的操作的结果。如上文所讨论的,例如,关于图4-13,操作可以在树的叶子节点中表示,并且基于针对操作的起源设备(例如协作模块实例)、由起源设备应用操作的dds的版本以及被分配给操作的序列号,来选择性地将操作应用于所述分布式数据结构的数据。
222.在操作2220中,针对由非叶子节点下方的叶子节点表示的分布式数据结构的一部分来表示起源设备(或起源协作模块实例)特定长度。在各种实施例中,可以对所述树中的每个非叶子节点或者至少对所述树的叶子节点与根节点之间的非叶子节点执行操作2230。如上文所讨论的,部分长度信息被包含在所述树的非叶子节点中。还可以在所述非叶子节点中表示最小长度值,所述最小长度值表示由非叶子节点下方的叶子节点表示的dos的最小长度。
223.在操作2225中,接收由特定起源设备进行的额外操作的额外指示。还接收到所述分布式数据结构内应用所述操作的位置的指示(例如,要插入的位置,或者要移除的位置范围,或者要注释的位置)。在一些方面中,操作2225包括接收消息,所述消息包括上文关于图2a所讨论的字段中的一个或多个字段,其中,所述消息提供所述指示。
224.在操作2230中,标识表示应用所述额外操作的所述分布式数据结构的一部分的树的叶子节点。例如,如果所述操作是在偏移x处到字符串中的操作插入,则操作2230标识表示所述字符串中偏移x的叶子节点。为了标识所述叶子节点,操作2230依赖于上文所讨论的特定于发起所述操作的设备(或协作模块实例)的部分长度值中的一个或多个部分长度值。基于特定起源设备对其应用所述额外操作的分布式数据结构的版本,进一步标识所述叶子节点。
225.在操作2235中,基于所述额外操作来修改所述叶子节点。如上文所讨论的,一些示例性修改包括将所述叶子节点拆分为多个节点以促进对数据的插入。对于删除操作,可以通过记录被分配给所述删除操作的序列号来修改所述叶子节点。在一些实施例中,还可以拆分所述叶子节点以提供专用于所删除的数据的叶子节点。如果所述操作是注释操作,则可以将所述注释数据复制到所述叶子节点,或者以其他方式与所述叶子节点相关联。(用粗体指示字符串中的文本是注释的示例)。
226.如上文所讨论的,过程2200可以包括从序列化服务(或对等协议)接收消息,指示消息200的字段中的一个或多个字段,如上文关于图2a所讨论的。如上文关于图2b所讨论
的,这些消息定义了尚未被协作的所有参与者(协作模块实例或设备)确认的操作的协作窗口。过程2200还可以包括将维护过程应用于表示所述协作窗口下方的操作的树的叶子节点。如上文所讨论的,这些维护操作能够包括当那些叶子节点表示dds的连续数据时组合叶子节点,完全移除节点(例如,如果数据被协作窗口下方的操作删除,则表示所述数据的叶子节点被从所述树移除)。在操作2235之后,过程2200移动到结束操作2238。
227.图23图示了示例性机器2300的框图,可以在示例机器2300上执行在本文中所讨论的技术(例如,方法)中的一种或多种技术(例如,方法)。在替代实施例中,机器2300可以作为独立设备操作或者可以被连接(例如,联网)到其他机器。在联网部署中,机器2300可以在服务器-客户端网络环境中以服务器机器、客户端机器或者这两者的能力来操作。在示例中,机器2300可以充当对等(p2p)(或其他分布式)网络环境中的对等机器。机器2300可以是个人计算机(pc)、平板pc、机顶盒(stb)、个人数字助理(pda)、移动电话、智能电话、网络设备、网络路由器、交换机或桥、服务器计算机、数据库、会议室设备或者能够执行指定机器要采取的行动的指令(顺序或者以其他方式)的任何机器。在各种实施例中,机器2300可以执行上文关于图1-22或下文关于图24所描述的过程中的一个或多个过程。此外,尽管仅图示了单台机器,但是术语“机器”也应当被视为包括个体地或联合地执行一组(或多组)指令以执行在本文中所讨论的方法中的任意一种或多种方法的机器的任意集合,诸如云计算、软件即服务(saas)、其他计算机集群配置。
228.如在本文中所描述的,示例可以包括逻辑或多个组件、模块或机制(以下均称为“模块”)或者可以在其上进行操作。模块是能够执行所指定的操作并且以特定方式进行配置或布置的有形实体(例如,硬件)。在示例中,电路可以以所指定的方式被布置(例如,在内部或相对诸如其他电路的外部实体)为模块。在示例中,一个或多个计算机系统(例如,独立的、客户端或服务器计算机系统)或者一个或多个硬件处理器的全部或部分可以由固件或软件(例如,指令、应用部分或应用)配置为模块,所述模块操作用于执行所指定的操作。在示例中,所述软件可以驻留在机器可读介质上。在示例中,所述软件当由所述模块的底层硬件执行时,使得所述硬件执行所指定的操作。
229.因此,术语“模块”被理解为涵盖有形实体,是被物理构造、专门配置(例如,硬连线)或临时(例如,暂时)配置(例如,编程)以特定方式操作或者执行在本文中所描述的任何操作的部分或全部的实体。考虑其中临时配置模块的示例,不需要在任意时刻实例化所述模块中的每个模块。例如,在所述模块包括使用软件配置的通用硬件处理器的情况下,所述通用硬件处理器可以在不同时间被配置为各自不同的模块。软件可以相应地配置硬件处理器,例如,以在一个时刻构成特定模块并且在不同时刻构成不同模块。
230.机器(例如,计算机系统)2300可以包括硬件处理器2302(例如,中央处理单元(cpu)、图形处理单元(gpu)、硬件处理器核心或者其任意组合)、主存储器2304和静态存储器2306,其中的一些或全部可以经由互连2308(例如,总线)彼此通信。机器2300还可以包括显示单元2310、字母数字输入设备2312(例如,键盘)和用户界面(ui)导航设备2314(例如,鼠标)。在示例中,显示单元2310、输入设备2312和ui导航设备2314可以是触摸屏显示器。机器2300可以另外地包括存储设备(例如,驱动单元)2316、信号生成设备2318(例如,扬声器)、网络接口设备2320以及一个或多个传感器2321,诸如全球定位系统(gps)传感器、指南针、加速度计或者其他传感器。机器2300可以包括输出控制器2328,诸如串行(例如,通用串
行总线(usb)、并行或者其他有线或无线(例如,红外(ir)、近场通信(nfc)等)连接以通信或控制一个或多个外围设备(例如,打印机、读卡器等)。
231.存储设备2316可以包括机器可读介质2322,在其上存储有体现在本文中所描述的技术或功能中的任意一个或多个技术或功能或者由其利用的一组或多组数据结构或指令2324(例如,软件)。指令2324还可以在由机器2300执行期间完全或至少部分地驻留在主存储器2304内、在静态存储器2306内或者在硬件处理器2302内。在示例中,硬件处理器2303、主存储器2304、静态存储器2306或存储设备2316中的一个或任意组合可以构成机器可读介质。
232.尽管机器可读介质2322被图示为单个介质,但是术语“机器可读介质”可以包括单个介质或多个介质(例如,集中式或分布式数据库,和/或相关联的高速缓存和服务器),其被配置为存储一个或多个指令2324。
233.术语“机器可读介质”可以包括能够存储、编码或承载由机器2300执行的指令并且使得机器2300执行本公开的技术中的任意一种或多种技术的任何介质,或者能够存储、编码或承载由这样的指令使用或者与这样的指令相关联的数据结构。非限制性机器可读介质示例可以包括固态存储器以及光和磁介质。机器可读介质的具体示例可以包括:非易失性存储器,诸如半导体存储器设备(例如,电可编程只读存储器(eprom)、电可擦除可编程只读存储器(eeprom))和闪存设备;磁盘,诸如内置硬盘和可移动磁盘;磁光盘;随机存取存储器(ram);固态驱动器(ssd);以及cd-rom和dvd-rom磁盘。在一些示例中,机器可读介质可以包括非暂时性机器可读介质。在一些示例中,机器可读介质可以包括不是瞬时传播信号的机器可读介质。
234.指令2324还可以使用传输介质经由网络接口设备2320在通信网络2326上发送或接收。机器2300可以利用多种传输协议(例如,帧中继、互联网协议(ip)、传输控制协议(tcp)、用户数据报协议(udp)、超文本传输协议(http)等)中的任意一种与一台或多台其他机器进行通信。示例性通信网络可以包括局域网(lan)、广域网(wan)、分组数据网络(例如,互联网)、移动电话网络(例如,蜂窝网络)、普通老式电话(pots)网络、以及无线数据网络(例如,电气和电子工程师协会(ieee)802.11标准系列,被称为ieee 802.16标准系列,被称为)、ieee 802.15.4标准系列、长期演进(lte)标准系列、通用移动电信系统(umts)标准系列、对等(p2p)网络等。在示例中,网络接口设备2320可以包括一个或多个物理插孔(例如,以太网、同轴或电话插孔)或者一个或多个天线以连接到通信网络2326。在示例中,网络接口设备2320可以包括多个天线以使用单输入多输出(simo)、多输入多输出(mimo)或多输入单输出(miso)技术中的至少一种进行无线通信。在一些示例中,网络接口设备2320可以使用多用户mimo技术进行无线通信。
235.图24是可以由序列化服务实现的示例性过程的流程图。例如,过程2400可以由同步服务106来执行。在一些方面中,被存储在存储器(例如上文的指令2324)中的指令(例如上文的指令2324)可以将硬件处理电路(例如上文的处理器2302)配置为执行下文所讨论的功能中的一项或多项功能。在下文的图24的讨论中,执行过程2200的设备可以被称为“执行设备”。注意,在各种实施例中,上文至少关于图14-19和/或图20和/或图21和/或图22所讨论的功能中的一项或多项功能可以被包含在过程2400中。
236.在开始操作2402之后,过程2400移动到操作2405,其建立与多个设备的协作会话。
所述协作会话提供对分布式数据结构的访问。
237.在操作2410中,接收消息。所述消息请求为操作分配序列号。例如,操作2410可以接收包括上文关于图2a和消息200所讨论的字段中的一个或多个字段的消息。例如,所述消息可以指示发起所述操作的协作模块实例或设备(例如字段202),并且请求将序列号分配给在所述消息中所指示的操作(例如,可以由字段208、210、212中的一个或多个字段指示的操作)。在如上文所描述的一些方面中,可以经由被包含在操作序列号字段206中的预定值(例如-1)来指示所述请求。
238.在一些方面中,可以对所接收到的消息进行解码以标识在所述消息中所指示的序列号被设置为预定值,其中,所述预定值指示序列号需要被分配给操作(例如,操作序列号字段206可以被设置为预定值,诸如-1)。然后可以基于消息正在请求序列号分配的标识来做出确定。
239.在一些方面中,所接收到的消息指示与所述操作相关联的所述分布式数据结构的版本号(例如,经由字段204)。
240.在操作2415中,序列号被分配给所述操作。操作响应于在操作2410中接收到所述消息而执行。所述序列号可以例如如上文关于图2b和/或图2c中的任一个所描述的那样被分配。例如,可以分配所述序列号以定义由参与所述协作会话的各种协作模块实例或设备发起的操作的次序。
241.在操作2420中,向多个设备中的每个设备传输指示所述操作和分配的序列号的第一通知。例如,所述第一通知可以包括上文关于图2a和消息200所讨论的字段中的一个或多个字段。如上文所讨论的,所述执行设备可以经由单独传输给每个参与者的单个广播消息、多个多播消息或者个体的单播消息来通知协作参与者(设备和/或协作模块实例)中的每个协作参与者。由于所述第一通知可以包括图2a的字段中的任意字段,因此所述通知还可以向所述多个设备中的每个设备通知由所有设备已经确认的操作的当前最大序列号(例如,参考序列号)。
242.可以生成所述第一通知以进一步指示与所述操作相关联的版本。另外,与所述操作相关的任意信息也可以在所述第一通知中提供。例如,所述第一通知可以包括与在操作2410中接收到的所述消息中所包括的值一致的消息200的字段中的任意字段中的值。如上文参考图2d所描述的,在一些情况下,与从协作参与者接收到的第一操作相关联的版本号可以基于该参与者处的其他本地发起的操作进行调整。具体地,当执行所述第一操作时,在所述协作参与者处未分配序列号的操作数量与版本号如何被调整有关。调整所述版本号以考虑这些操作(具有未决的序列号分配)。如上文所讨论的,如果所述第一操作与第一版本相关联,但是发起参与者在发起所述第一操作之前还有n个其他操作未决,则可以在协作参与者处发起第一操作之前调整第一版本以反映这n个未决操作已经被应用于所述分布式数据结构。在利用编号更高的序列号来表示更高次序操作和版本的一些方面中,所述第一版本可以被调整为第一版本 n。在一些方面中,可以通过首先确定自操作2410的消息中所指定的分布式数据结构的版本起由参与者发起的操作的数量(不包括2410的消息的操作)来确定n。n可以被设置到操作的该数量。这在上文关于图2d进行了描述。
243.操作2425确定多个设备中的每个设备(协作的参与者是设备和/或协作模块实例)已经确认所述操作。操作2425可以通过监视从所述多个设备中的每个设备接收的消息来做
出该确定。具体地,可以监视上文关于图2a所讨论的消息200的最大序列号字段214的值。当来自特定设备(或协作模块实例)的特定消息中的该字段的值指示值在操作次序上等于或高于在操作2415中所分配的序列号时,操作2425确定特定设备已经确认所述操作。操作2425然后监视从多个设备(或协作模块实例)中的每个设备接收到的值。当所有设备指示相同时,操作2425的确定完成。
244.在操作2430中,向所述多个设备中的每个设备传输第二通知。所述第二通知指示操作2425的确定。所述第二通知可以是包括上文关于图2a中的消息200所讨论的字段中的一个或多个字段的消息。在一些方面中,通过将图2a的消息的字段214的值设置为在操作次序中至少与所分配的序列号一样高的值,来指示所述确定。
245.尽管过程2400在上文描述了将单个序列号分配给单个操作,但是本领域技术人员将理解过程2400可以迭代地操作以将多个序列号分配给多个操作。可以以交织的方式接收由各个协作参与者(设备和/或协作模块实例)发起的操作,并且过程2400可以按照与操作的接收次序一致的次序向这些交织的操作分配序列号。
246.过程2400还可以包括生成分布式数据结构的快照。如上文关于图2e所讨论的,快照可以合并对分布式数据结构的所有操作的结果,直到特定序列号。一旦那些结果被应用于分布式数据结构,所述快照就表示所述分布式数据结构的值。当新参与者加入所述协作时,可以向所述新参与者提供所述快照。另外,也可以向所述新参与者提供被分配有序列号但是未被包括在所述快照中的任意操作。这允许所述新参与者将那些操作应用于所述快照并且将其分布式数据结构的本地版本与所述协作的其他参与者的本地版本同步。在操作2430之后,过程2400移动到结束操作2435。
247.如在本文中所描述的,示例可以包括逻辑或多个组件、模块或机制,或者可以在其上操作。模块是能够执行所指定的操作并且以特定方式配置或布置的有形实体(例如,硬件)。在示例中,电路可以以所指代的方式被布置(例如,在内部或者相对于诸如其他电路的外部实体)为模块。在示例中,一个或多个计算机系统(例如,独立、客户端或服务器计算机系统)或者一个或多个硬件处理器的全部或部分可以由固件或软件(例如,指令、应用部分或应用)配置为模块,用于操作以执行所指定的操作。在示例中,软件可以驻留在机器可读介质上。在示例中,软件当由模块的底层硬件执行时,使得硬件执行所指定的操作。
248.示例1是一种由第一设备执行的方法,包括:接收对分布式数据结构的第二设备操作的通知,所述第二设备操作指示所述分布式数据结构内与所述第二设备操作相关联的位置;标识树的第一节点,所述第一节点表示所述分布式数据结构的一部分;基于所述第一节点来第一确定所表示的部分的最小长度;基于所述第一节点来标识所表示的部分的、特定于所述第二设备的部分长度;基于所述最小长度和所述部分长度来第二确定所表示的部分的尺寸;基于所述尺寸来第三确定所述分布式数据结构内的所述位置被包含在所表示的部分中;基于所述第三确定来标识所述树中的所述第一节点下方的叶子节点;以及基于所标识出的叶子节点来表示对所述分布式数据结构的所述第二设备操作。
249.在示例2中,示例1的主题可选地包括:接收对所述分布式数据结构的第三设备操作的通知,所述第三设备操作指示所述分布式数据结构内针对所述第三设备操作的第二位置;标识所表示的部分的、特定于所述第三设备的第二部分长度;基于所述最小长度和第二部分长度来第四确定所表示的部分的、特定于所述第三设备的第二尺寸;基于所述尺寸来
第五确定所述分布式数据结构内的所述第二位置未被包含在所表示的部分中;基于所述第五确定来标识第二叶子节点,所述表示所述分布式数据结构中的、包含所述第二位置的第二部分;以及基于所标识出的第二叶子节点来表示对所述分布式数据结构的所述第三设备操作。
250.在示例3中,示例2的主题可选地包括:响应于所述第五确定来标识所述第一节点的兄弟节点,其中,所述第二叶子节点是兄弟节点的子节点。
251.在示例4中,示例1-3中的任意一项或多项的主题可选地包括:其中,所述通知还指示所述分布式数据结构的与所述第二设备操作相关联的版本,其中,对所述部分长度的所述确定还基于所述版本。
252.在示例5中,示例1-4中的任意一项或多项的主题可选地包括:其中,表示所述第二设备操作包括将所标识出的叶子节点拆分为两个或更多个叶子节点,所述两个或更多个叶子节点中的每个叶子节点表示所述分布式数据结构的独有部分。
253.在示例6中,示例5的主题可选地包括:基于所述位置相对于所表示的部分的定位,将所述独有部分分配给所述两个或更多个叶子节点中的每个叶子节点。
254.在示例7中,示例4-6中的任意一项或多项的主题可选地包括:基于所述表示来更新在所述树的所标识出的叶子节点与根之间的、在所述树中的每个节点处针对所述第二设备的部分长度信息。
255.在示例8中,示例7的主题可选地包括:其中,对所述部分长度信息的所述更新包括:将经更新的部分长度与所述分布式数据结构的所述版本相关联。
256.在示例9中,示例8的主题可选地包括:其中,更新所述部分长度信息包括:将所述版本与所述分布式数据结构中的、由经修改的叶子节点表示的所述部分的经更新的长度之间的关联附接到经更新的节点处的部分长度信息。
257.在示例10中,示例1-9中的任意一项或多项的主题可选地包括:标识特定设备操作;标识所述分布式数据结构的与所述特定设备操作相关联的特定版本;通过修改所述树的叶子节点来表示所述树中的所述特定设备操作;以及更新在所述树的所述叶子节点与根节点之间的、在所述树中的每个节点处针对所述特定设备的部分长度信息,其中,在每个节点处对所述部分长度信息的所述更新基于在由所述节点表示的部分的最小长度与在所述特定设备处表示的所述部分的长度之间的差。
258.在示例11中,示例10的主题可选地包括:确定在所述树的特定节点下方的第一组叶子节点,其表示具有大于所述特定版本的分配的序列号的操作;确定所述特定节点下方的第二组叶子节点,其表示由所述特定设备发起的、具大于所述特定版本的操作序列号的操作;以及基于所述第一组叶子节点和所述第二组叶子节点的计数,来更新所述特定节点处特定于所述特定设备的部分长度信息。
259.示例12是一种包括指令的非瞬时计算机可读存储介质,所述指令当被运行时将硬件处理电路配置为执行包括以下的操作:接收对分布式数据结构的第二设备操作的通知,所述第二设备操作指示所述分布式数据结构内与所述第二设备操作相关联的位置;标识树的第一节点,所述第一节点表示所述分布式数据结构的一部分;基于所述第一节点来第一确定所表示的部分的最小长度;基于所述第一节点来标识所表示的部分的、特定于所述第二设备的部分长度;基于所述最小长度和所述部分长度来第二确定所表示的部分的尺寸;
基于所述尺寸来第三确定所述分布式数据结构内的所述位置被包含在所表示的部分中;基于所述第三确定来标识所述树中的所述第一节点下方的叶子节点;以及基于所标识出的叶子节点来表示对所述分布式数据结构的所述第二设备操作。
260.在示例13中,示例12的主题可选地包括:接收对所述分布式数据结构的第三设备操作的通知,所述第三设备操作指示所述分布式数据结构内针对所述第三设备操作的第二位置;标识所表示的部分的、特定于所述第三设备的第二部分长度;基于所述最小长度和第二部分长度来第四确定所表示的部分的、特定于所述第三设备的第二尺寸;基于所述尺寸来第五确定所述分布式数据结构内的所述第二位置未被包含在所表示的部分中;基于第五确定来标识第二叶子节点,所述第二叶子节点表示所述分布式数据结构中的、包含所述第二位置的第二部分;以及基于所标识出的第二叶子节点来表示对所述分布式数据结构的所述第三设备操作。
261.在示例14中,示例13的主题可选地包括:响应于所述第五确定来标识所述第一节点的兄弟节点,其中,所述第二叶子节点是所述兄弟节点的子节点。
262.在示例15中,示例12-14的任意一项或多项的主题可选地包括:其中,所述通知还指示所述分布式数据结构的与所述第二设备操作相关联的版本,其中,对所述部分长度的所述确定还基于所述版本。
263.在示例16中,示例12-15中的任意一项或多项的主题可选地包括:其中,表示所述第二设备操作包括将所标识出的叶子节点拆分为两个或更多个叶子节点,所述两个或更多个叶子节点中的每个叶子节点表示所述分布式数据结构的独有部分。
264.在示例17中,示例16的主题可选地包括:基于所述位置相对于所表示的部分的定位来将所述独有部分分配给所述两个或更多个叶子节点中的每个叶子节点。
265.在示例18中,示例12-17中的任意一项或多项的主题可选地包括:基于所述表示来更新在所述树的所标识出的叶子节点与根之间的、在所述树中的每个节点处针对所述第二设备的部分长度信息。
266.在示例19中,示例18的主题可选地包括:其中,对所述部分长度信息的所述更新包括:将经更新的部分长度与所述分布式数据结构的所述版本相关联。
267.在示例20中,示例19的主题可选地包括:其中,更新所述部分长度信息包括:将所述版本与所述分布式数据结构中的、由经修改的叶子节点表示的所述部分的经更新的长度之间的关联附接到经更新的节点处的部分长度信息。
268.在示例21中,示例12-20中的任意一项或多项的主题可选地包括:标识特定设备操作;标识所述分布式数据结构的与所述特定设备操作相关联的特定版本;通过修改所述树的叶子节点来表示所述树中的所述特定设备操作;以及更新在所述树的所述叶子节点与根节点之间的、在所述树中的每个节点处针对所述特定设备的部分长度信息,其中,在每个节点处对所述部分长度信息的所述更新基于在由所述节点表示的部分的最小长度与在所述特定设备处表示的所述部分的长度之间的差。
269.在示例22中,示例21的主题可选地包括:确定在所述树的特定节点下方的第一组叶子节点,其表示具有大于所述特定版本的分配的序列号的操作;确定所述特定节点下方的第二组叶子节点,其表示由所述特定设备发起的、具有大于所述特定版本的操作序列号的操作;以及基于所述第一组叶子节点和所述第二组叶子节点的计数来更新在所述特定节
点处特定于所述特定设备的部分长度信息。
270.示例23是一种装置,包括:用于接收对分布式数据结构的第二装置操作的通知的单元,所述第二装置操作指示所述分布式数据结构内与第二装置操作相关联的位置;用于标识树的第一节点的单元,所述第一节点表示所述分布式数据结构的一部分;用于基于所述第一节点来第一确定所表示的部分的最小长度的单元;用于基于所述第一节点来标识所表示的部分的、特定于所述第二装置的部分长度的单元;用于基于所述最小长度和所述部分长度来第二确定所表示的部分的尺寸的单元;用于基于所述尺寸来第三确定所述分布式数据结构内的所述位置被包含在所表示的部分中的单元;用于基于所述第三确定来标识所述树中的所述第一节点下方的叶子节点的单元;以及用于基于所标识出的叶子节点来表示对所述分布式数据结构的所述第二装置操作的单元。
271.在示例24中,示例23的主题可选地包括:用于接收对所述分布式数据结构的第三装置操作的通知的单元,所述第三装置操作指示所述分布式数据结构内针对所述第三装置操作的第二位置;用于标识所表示的部分的、特定于所述第三装置的第二部分长度的单元;用于基于所述最小长度和第二部分长度来第四确定所表示的部分的、特定于所述第三装置的第二尺寸的单元;用于基于所述尺寸来第五确定所述分布式数据结构内的所述第二位置未被包含在所表示的部分中的单元;用于基于所述第五确定来标识所述分布式数据结构中的包含所述第二位置的第二部分的第二叶子节点的单元;以及用于基于所标识出的第二叶子节点来表示对所述分布式数据结构的所述第三装置操作的单元。
272.在示例25中,示例24的主题可选地包括:用于响应于所述第五确定来标识所述第一节点的兄弟节点的单元,其中,所述第二叶子节点是所述兄弟节点的子节点。
273.在示例26中,示例23-25中的任意一项或多项的主题可选地包括:其中,所述通知还指示与所述第二装置操作相关联的所述分布式数据结构的版本,其中,用于确定所述部分长度的所述单元被配置为还使所述部分长度基于所述版本。
274.在示例27中,示例23-26中的任意一项或多项的主题可选地包括:其中,用于表示所述第二装置操作的单元被配置为将所标识出的叶子节点拆分为两个或更多个叶子节点,所述两个或更多个叶子节点中的每个叶子节点表示所述分布式数据结构的独有部分。
275.在示例28中,示例27的主题可选地包括:用于基于所述位置相对于所表示的部分的定位来将所述独有部分分配给所述两个或更多个叶子节点中的每个叶子节点的单元。
276.在示例29中,示例23-28中的任意一项或多项的主题可选地包括:用于基于所述表示来更新在所述树的所标识出的叶子节点与根之间的、在所述树中的每个节点处针对第二装置的部分长度信息的单元。
277.在示例30中,示例29的主题可选地包括:其中,用于更新所述部分长度信息的单元被配置为将经更新的部分长度与所述分布式数据结构的所述版本相关联。
278.在示例31中,示例30的主题可选地包括:其中,用于更新所述部分长度信息的单元被配置为:将所述版本与所述分布式数据结构中的、由经修改的叶子节点表示的所述部分的经更新的长度之间的关联附接到经更新的节点处的部分长度信息。
279.在示例32中,示例23-31中的任意一项或多项的主题可选地包括:用于标识特定装置操作的单元;用于标识所述分布式数据结构的与所述特定装置操作相关联的特定版本的单元;用于通过修改所述树的叶子节点来表示所述树中的所述特定装置操作的单元;以及
用于更新在所述树的所述叶子节点与根节点之间的、在所述树中的每个节点处针对所述特定装置的部分长度信息的单元,其中,用于对每个节点处所述部分长度信息的更新的单元被配置为使所述更新基于在由所述节点表示的部分的最小长度与在所述特定装置处表示的所述部分的长度之间的差。
280.在示例33中,示例32的主题可选地包括:用于确定在所述树的特定节点下方的第一组叶子节点的单元,其表示具有大于所述特定版本的分配的序列号的操作;用于确定所述特定节点下方的第二组叶子节点的单元,其表示由所述特定装置发起的操作序列号大于所述特定版本的操作;以及用于基于所述第一组叶子节点和所述第二组叶子节点的计数来更新所述特定节点处特定于所述特定装置的部分长度信息的单元。
281.示例34是一种第一设备,包括:硬件处理电路,存储指令的电子存储器,所述指令当被运行时将所述硬件处理电路配置为执行包括以下的操作:接收对分布式数据结构的第二设备操作的通知,所述第二设备操作指示所述分布式数据结构内与所述第二设备操作相关联的位置;标识树的第一节点,所述第一节点表示所述分布式数据结构的一部分;基于所述第一节点来第一确定所表示的部分的最小长度;基于所述第一节点来标识所表示的部分的、特定于所述第二设备的部分长度;基于所述最小长度和所述部分长度来第二确定所表示的部分的尺寸;基于所述尺寸来第三确定所述分布式数据结构内的所述位置被包含在所表示的部分中;基于所述第三确定来标识所述树中的所述第一节点下方的叶子节点;以及基于所标识出的叶子节点来表示对所述分布式数据结构的所述第二设备操作。
282.在示例35中,示例34的主题可选地包括还包括以下的操作:接收对所述分布式数据结构的第三设备操作的通知,所述第三设备操作指示所述分布式数据结构内针对所述第三设备操作的第二位置;标识所表示的部分的、特定于所述第三设备的第二部分长度;基于所述最小长度和第二部分长度来第四确定所表示的部分的、特定于所述第三设备的第二尺寸;基于所述尺寸来第五确定所述分布式数据结构内的所述第二位置未被包含在所表示的部分中;基于所述第五确定来标识第二叶子节点,所述第二叶子节点表示所述分布式数据结构中的、包含所述第二位置的第二部分;以及基于所标识出的第二叶子节点来表示对所述分布式数据结构的所述第三设备操作。
283.在示例36中,示例35的主题可选地包括还包括以下的操作:响应于所述第五确定来标识所述第一节点的兄弟节点,其中,所述第二叶子节点是所述兄弟节点的子节点。
284.在示例37中,示例34-36中的任意一项或多项的主题可选地包括:其中,所述通知还指示所述分布式数据结构的与所述第二设备操作相关联的版本,其中,对所述部分长度的所述确定还基于所述版本。
285.在示例38中,示例34-37中的任意一项或多项的主题可选地包括:其中,表示所述第二设备操作包括将所标识出的叶子节点拆分为两个或更多个叶子节点,所述两个或更多个叶子节点中的每个叶子节点表示所述分布式数据结构的独有部分。
286.在示例39中,示例38的主题可选地包括还包括以下的操作:基于所述位置相对于所表示的部分的定位来将所述独有部分分配给所述两个或更多个叶子节点中的每个叶子节点。
287.在示例40中,示例34-39中的任意一项或多项的主题可选地包括还包括以下的操作:基于所述表示来更新在所述树的所标识出的叶子节点与根之间的、在所述树中的每个
节点处针对所述第二设备的部分长度信息。
288.在示例41中,示例40的主题可选地包括:其中,对所述部分长度信息的所述更新包括:将经更新的部分长度与所述分布式数据结构的所述版本相关联。
289.在示例42中,示例41的主题可选地包括:其中,更新所述部分长度信息包括:将所述版本与所述分布式数据结构中的、由经修改的叶子节点表示的所述部分的经更新的长度之间的关联附接到经更新的节点处的部分长度信息。
290.在示例43中,示例34-42中的任意一项或多项的主题可选地包括还包括以下的操作:标识特定设备操作;标识所述分布式数据结构的与所述特定设备操作相关联的特定版本;通过修改所述树的叶子节点来表示所述树中的所述特定设备操作;以及更新在所述树的所述叶子节点与根节点之间的、在所述树中的每个节点处针对所述特定设备的部分长度信息,其中,对每个节点处的所述部分长度信息的所述更新基于在由所述节点表示的部分的最小长度与在所述特定设备处表示的所述部分的长度之间的差。
291.在示例44中,示例43的主题可选地包括还包括以下的操作:确定在所述树的特定节点下方的第一组叶子节点,其表示具有大于所述特定版本的分配的序列号的操作;确定所述特定节点下方的第二组叶子节点,其表示由所述特定设备发起的、具有大于所述特定版本的操作序列号的操作;以及基于所述第一组叶子节点和所述第二组叶子节点的计数来更新所述特定节点处特定所述于特定设备的部分长度信息。
292.示例45是一种由第一设备执行的方法,包括:加入协作,该协作提供对分布式数据结构的访问;接收对分布式数据结构的序列化的多个对应操作的多个指示,每个指示还指示与所述对应操作中的每个操作相关联的对应起源设备;在树数据结构的叶子节点中表示所述序列化的多个操作和所述分布式数据结构的所得到的对应部分;在所述树的非叶子节点中,并且基于所述序列化的多个操作的特定操作来表示由所述非叶子节点下方的叶子节点表示的所述分布式数据结构的一部分的起源设备特定长度;接收对所述分布式数据结构的额外操作的额外指示,以及对与所述额外操作相关联的特定起源设备的进一步指示,所述额外指示还指示所述分布式数据结构内与所述额外操作相关联的位置;基于所述部分的所述起源设备特定长度和与所述额外操作相关联的所述特定起源设备来确定与所述位置相关联的所述树的叶子节点;以及基于所述额外操作来修改所确定的叶子节点。
293.在示例46中,示例45的主题可选地包括:针对所述特定操作来接收与所述特定操作相关联的所述分布式数据结构的特定版本的指示,其中,所述部分的所述起源设备特定长度基于所述特定版本。
294.在示例47中,示例45-46中的任意一项或多项的主题可选地包括:接收由所述协作中的所有参与者确认的所述序列化的多个操作的操作的指示;以及基于所述指示对所述树执行维护。
295.在示例48中,示例45-47中的任意一项或多项的主题可选地包括:对所述分布式数据结构发起本地操作,表示所述树中的所述本地操作;以及将所述操作的指示传输到序列化服务。
296.在示例49中,示例45-48中的任意一项或多项的主题可选地包括:生成指示与所述本地操作相关联的序列号未被分配的消息,以及与所述本地操作相关联的所述分布式数据结构的版本。
297.在示例50中,示例49的主题可选地包括:接收指示向所述本地操作分配序列号的第二消息,并且基于所分配的序列号来更新所述树。
298.在示例51中,示例45-50中的任意一项或多项的主题可选地包括:接收与第二起源设备相关联的第二操作和与所述第二操作相关联的第二位置的指示;基于所述部分的第二起源设备特定长度来搜索所述树;以及基于所述搜索的结果来标识表示在所述分布式数据结构中的所述第二位置的所述树的第二部分;以及基于所述第二部分来表示所述树中的所述第二操作。
299.在示例52中,示例51的主题可选地包括:接收所述分布式数据结构的与所述第二操作相关联的第二版本的指示,其中,所述搜索还基于所述第二版本。
300.示例53是包括指令的非暂时计算机可读介质,所述指令当由设备的硬件处理电路运行时将所述设备配置为执行包括以下的操作:加入协作,所述协作提供对分布式数据结构的访问;接收对分布式数据结构的序列化的多个对应操作的多个指示,每个指示还指示与所述对应操作中的每个操作相关联的对应起源设备;在树数据结构的叶子节点中表示所述序列化的多个操作和所述分布式数据结构的所得到的对应部分;在所述树的非叶子节点中,并且基于所述序列化的多个操作的特定操作,来表示由所述非叶子节点下方的叶子节点表示的所述分布式数据结构的一部分的起源设备特定长度;接收所述分布式数据结构的额外操作的额外指示,以及与所述额外操作相关联的特定起源设备的进一步指示,所述额外指示还指示所述分布式数据结构内与所述额外操作相关联的位置;基于所述部分的所述起源设备特定长度和与所述额外操作相关联的所述特定起源设备,来确定与所述位置相关联的所述树的叶子节点;以及基于所述额外操作来修改所确定的叶子节点。
301.在示例54中,示例53的主题可选地包括:针对所述特定操作,接收与所述特定操作相关联的所述分布式数据结构的特定版本的指示,其中,所述部分的所述起源设备特定长度基于所述特定版本。
302.在示例55中,示例53-54中的任意一项或多项的主题可选地包括:接收由所述协作中的所有参与者确认的所述序列化的多个操作中的操作的指示;以及基于所述指示对所述树执行维护。
303.在示例56中,示例53-55中的任意一项或多项的主题可选地包括:对所述分布式数据结构发起本地操作,表示所述树中的所述本地操作;以及将所述操作的指示传输到序列化服务。
304.在示例57中,示例53-56中的任意一项或多项的主题可选地包括:生成指示与所述本地操作相关联的序列号未被分配的消息,以及与所述本地操作相关联的所述分布式数据结构的版本。
305.在示例58中,示例57的主题可选地包括:接收指示序列号被分配给所述本地操作的第二消息,并且基于所分配的序列号来更新所述树。
306.在示例59中,示例53-58中的任意一项或多项的主题可选地包括:接收与第二起源设备相关联的第二操作和与所述第二操作相关联的第二位置的指示;基于所述部分的第二起源设备特定长度来搜索所述树;以及基于所述搜索的结果来标识表示所述分布式数据结构中的所述第二位置的所述树的第二部分;以及基于所述第二部分来表示所述树中的所述第二操作。
307.在示例60中,示例59的主题可选地包括:接收所述分布式数据结构的与所述第二操作相关联的第二版本的指示,其中,所述搜索还基于所述第二版本。
308.示例61是一种装置,包括:用于加入协作的单元,所述协作提供对分布式数据结构的访问;用于接收对分布式数据结构的序列化的多个对应操作的多个指示的单元,每个指示还指示与所述对应操作中的每个操作相关联的对应起源设备;用于在树数据结构的叶子节点中表示所述序列化的多个操作和所述分布式数据结构的所得到的对应部分的单元;用于在所述树的非叶子节点中,并且基于所述序列化的多个操作的特定操作,来表示由所述非叶子节点下方的叶子节点表示的所述分布式数据结构的一部分的起源设备特定长度的单元;用于接收对所述分布式数据结构的额外操作的额外指示,以及与所述额外操作相关联的特定起源设备的进一步指示的单元,所述额外指示还指示所述分布式数据结构内与所述额外操作相关联的位置;用于基于所述部分的所述起源设备特定长度和与所述额外操作相关联的所述特定起源设备,来确定与所述位置相关联的所述树的叶子节点的单元;以及用于基于所述额外操作来修改所确定的叶子节点的单元。
309.在示例62中,示例61的主题可选地包括:用于针对所述特定操作来接收与所述特定操作相关联的所述分布式数据结构的特定版本的指示的单元,其中,所述部分的所述起源设备特定长度基于所述特定版本。
310.在示例63中,示例61-62中的任意一项或多项的主题可选地包括:用于接收由所述协作中的所有参与者确认的所述序列化的多个操作中的操作的指示的单元;以及用于基于所述指示对所述树执行维护的单元。
311.在示例64中,示例61-63中的任意一项或多项的主题可选地包括:用于对所述分布式数据结构发起本地操作、表示所述树中的所述本地操作的单元;以及用于将所述操作的指示传输到序列化服务的单元。
312.在示例65中,示例61-64中的任意一项或多项的主题可选地包括用于以下操作的单元:生成指示与所述本地操作相关联的序列号未被分配的消息、以及与所述本地操作相关联的所述分布式数据结构的版本。
313.在示例66中,示例65的主题可选地包括:用于接收指示序列号被分配给所述本地操作的第二消息的单元,以及用于基于所分配的序列号来更新所述树的单元。
314.在示例67中,示例61-66中的任意一项或多项的主题可选地包括:用于接收与第二起源设备相关联的第二操作和与所述第二操作相关联的第二位置的指示的单元;用于基于所述部分的第二起源设备特定长度来搜索所述树的单元;以及用于基于所述搜索的结果来标识表示在所述分布式数据结构中的所述第二位置的所述树的第二部分的单元;以及用于基于所述第二部分来表示所述树中的所述第二操作的单元。
315.在示例68中,示例67的主题可选地包括:用于接收所述分布式数据结构的与所述第二操作相关联的第二版本的指示的单元,其中,所述搜索还基于所述第二版本。
316.示例69是一种设备,包括:硬件处理电路;存储指令的电子硬件存储器,所述指令当被运行时将所述硬件处理电路配置为执行包括以下的操作:加入协作,所述协作提供对分布式数据结构的访问;接收分布式数据结构的序列化的多个对应操作的多个指示,每个指示还指示与所述对应操作中的每个对应操作相关联的对应起源设备;在树数据结构的叶子节点中表示所述序列化的多个操作和所述分布式数据结构的得到的对应部分;在所述树
的非叶子节点中,并且基于所述序列化的多个操作的特定操作,来表示由所述非叶子节点下方的叶子节点表示的所述分布式数据结构的一部分的起源设备特定长度;接收所述分布式数据结构的额外操作的额外指示,以及与所述额外操作相关联的特定起源设备的进一步指示,所述额外指示还指示所述分布式数据结构内与所述额外操作相关联的位置;基于所述部分的所述起源设备特定长度和与所述额外操作相关联的所述特定起源设备,来确定与所述位置相关联的所述树的叶子节点;以及基于所述额外操作来修改所确定的叶子节点。
317.在示例70中,示例69的主题可选地包括:针对所述特定操作来接收与所述特定操作相关联的所述分布式数据结构的特定版本的指示,其中,所述部分的所述起源设备特定长度基于所述特定版本。
318.在示例71中,示例69-70中的任意一项或多项的主题可选地包括:接收由所述协作中的所有参与者确认的所述序列化的多个操作中的操作的指示;以及基于所述指示对所述树执行维护。
319.在示例72中,示例69-71中的任意一项或多项的主题可选地包括:对分布式数据结构发起本地操作,表示所述树中的所述本地操作;以及将所述操作的指示传输到序列化服务。
320.在示例73中,示例69-72中的任意一项或多项的主题可选地包括:生成指示与所述本地操作相关联的序列号未被分配的消息,以及与所述本地操作相关联的所述分布式数据结构的版本。
321.在示例74中,示例73的主题可选地包括:接收指示序列号被分配给所述本地操作的第二消息,并且基于所分配的序列号来更新所述树。
322.在示例75中,示例69-74中的任意一项或多项的主题可选地包括:接收与第二起源设备相关联的第二操作和与所述第二操作相关联的第二位置的指示;基于所述部分的第二起源设备特定长度来搜索所述树;以及基于所述搜索的结果来标识表示所述分布式数据结构中的所述第二位置的所述树的第二部分;以及基于所述第二部分来表示所述树中的所述第二操作。
323.在示例76中,示例75的主题可选地包括:接收所述分布式数据结构的与所述第二操作相关联的第二版本的指示,其中,所述搜索还基于所述第二版本。
324.因此,术语“模块”被理解为涵盖有形实体,是被物理构造、专门配置(例如,硬连线)或临时(例如,暂时)配置(例如,编程)以特定方式操作或者执行在本文中所描述的任何操作的部分或全部的实体。考虑临时配置模块的示例,不需要在任何时刻实例化每个模块。例如,在模块包括使用软件配置的通用硬件处理器的情况下,通用硬件处理器可以在不同时间被配置为各自不同的模块。软件可以相应地配置硬件处理器,例如,以在一个时间实例构成特定模块且在不同时间实例构成不同模块。
325.各种实施例可以完全或部分地以软件和/或固件实现。该软件和/或固件可以采用包含在非暂时性计算机可读存储介质中或上的指令的形式。然后可以由一个或多个处理器读取和执行那些指令以实现在本文中所描述的操作的执行。指令可以是任何合适的形式,例如但不限于:源代码、编译代码、解释代码、可执行代码、静态代码、动态代码等。这种计算机可读介质可以包括用于以一台或多台计算机可读的形式存储信息的任何有形的非暂时性介质,例如但不限于只读存储器(rom);随机存取存储器(ram);磁盘存储介质;光存储介
质;闪存;等等。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献