CN101770513B - 用于分布式命名空间中的确认和修正的方法和*** - Google Patents

用于分布式命名空间中的确认和修正的方法和*** Download PDF

Info

Publication number
CN101770513B
CN101770513B CN2010100023043A CN201010002304A CN101770513B CN 101770513 B CN101770513 B CN 101770513B CN 2010100023043 A CN2010100023043 A CN 2010100023043A CN 201010002304 A CN201010002304 A CN 201010002304A CN 101770513 B CN101770513 B CN 101770513B
Authority
CN
China
Prior art keywords
synthesis
namespace
attribute data
file system
inconsistent
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN2010100023043A
Other languages
English (en)
Other versions
CN101770513A (zh
Inventor
S·T·玛科特
J·M·肖瓦尔特
G·E·米勒
M·恩格
K·S·梅塔
S·M·基梅尔
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Publication of CN101770513A publication Critical patent/CN101770513A/zh
Application granted granted Critical
Publication of CN101770513B publication Critical patent/CN101770513B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/14Error detection or correction of the data by redundancy in operation
    • G06F11/1402Saving, restoring, recovering or retrying
    • G06F11/1415Saving, restoring, recovering or retrying at system level
    • G06F11/1435Saving, restoring, recovering or retrying at system level using file system or storage system metadata
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/10File systems; File servers
    • G06F16/17Details of further file system functions
    • G06F16/178Techniques for file synchronisation in file systems
    • G06F16/1787Details of non-transparently synchronising file systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/16Error detection or correction of the data by redundancy in hardware
    • G06F11/20Error detection or correction of the data by redundancy in hardware using active fault-masking, e.g. by switching out faulty elements or by switching in spare elements
    • G06F11/2053Error detection or correction of the data by redundancy in hardware using active fault-masking, e.g. by switching out faulty elements or by switching in spare elements where persistent mass storage functionality or persistent mass storage control functionality is redundant
    • G06F11/2089Redundant storage control functionality
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/82Solving problems relating to consistency

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Library & Information Science (AREA)
  • Quality & Reliability (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及用于分布式命名空间中的确认和修正的方法和***。具体地,公开了一种方法,包括:从综合体的确认者成员向综合体的第二成员发送指令,以阻止对综合体命名空间进行改变的操作;确定综合体的确认者成员是否与综合体的第二成员通信,以及综合体的成员是否保持当前的综合体状态信息;响应于确定综合体的确认者成员在与综合体的第二成员通信,以及综合体的成员保持当前的综合体状态信息,从确认者成员向第二成员发送指令,以向确认者成员发送与第二成员相关联的第一命名空间属性数据;确定与第二成员相关联的第一命名空间属性数据是否与第二命名空间属性数据一致;以及发送指令以修正第一命名空间属性数据。

Description

用于分布式命名空间中的确认和修正的方法和***
技术领域
实施例总体上涉及数据处理,更具体地,涉及在并行综合体复合***中访问和储存数据。
背景技术
并行综合体复合***(Parallel Sysplex multi-system)使用具有相互通信的***处理器的多个***,这些***读取和写入存储在数据存储***(如存储器设备、直接访问存储设备(DASD))中的数据。多个***提供了***冗余,这样,如果特定的***发生故障,其他的***可以执行类似的任务。
数据在***处理器可访问的文件***中分层次组织。在运行中,文件***与被指定为文件***所有者的***处理器相关联。该所有者执行对文件***进行维护、访问、读取和写入的相关任务。其他***处理器可以与文件***的客户端相关联。客户端可以与所有者通信,以读取、写入或执行其他文件***相关的任务。
为了适当地管理文件***,所有者和客户端***处理器应当具有与存储在并行综合体复合***中的文件***的所有权和客户端关系有关的准确的当前数据。
发明内容
根据一个实施例,一种方法,包括:从综合体的确认者成员向综合体的第二成员发送指令,以阻止对综合体命名空间进行改变的操作;确定综合体的确认者成员是否与综合体的第二成员通信,以及综合体的成员是否保持当前的综合体状态信息;响应于确定综合体的确认者成员在与综合体的第二成员通信以及综合体的成员保持当前的综合体状态信息,从确认者成员向第二成员发送指令,以便向确认者成员发送与第二成员相关联的第一命名空间属性数据;确定与第二成员相关联的第一命名空间属性数据是否与第二命名空间属性数据一致;以及发送指令以修正第一命名空间属性数据。
根据另一个实施例,一种方法,包括:接收修正与综合体的第二成员相关联的不一致的第一命名空间属性数据的指令;从确认者成员向综合体的第二成员发送指令,以便向确认者成员发送与综合体通信错误相关联的文件***的列表;确定不一致的第一命名空间属性数据是否对应于综合体通信错误;以及响应于确定第一命名空间属性数据对应于综合体通信错误,向综合体的第二成员发送包括修正的第一命名空间属性数据的指令。
根据又一个实施例,一种***,包括综合体的确认者成员,其可操作以用于:向综合体的第二成员发送指令,以阻止对综合体命名空间进行改变的操作;确定综合体的确认者成员是否与综合体的第二成员通信以及综合体的成员是否保持当前的综合体状态信息;响应于确定综合体的确认者成员与综合体的第二成员通信以及综合体的成员保持当前的综合体状态信息,向第二成员发送指令,以便向确认者成员发送与第二成员相关联的第一命名空间属性数据;确定与第二成员相关联的第一命名空间属性数据是否与第二命名空间属性数据一致;以及响应于与第二成员相关联的第一命名空间属性数据与第二命名空间属性数据不一致,发送指令以修正第一命名空间属性数据。
附图说明
图1示出了并行综合体复合***的一个示例。
图2A和2B示出了综合体中的文件***所有者设置的示例。
图3示出了综合体的缓存数据结构的一个示例的框图。
图4示出了确认算法的一个示例的高层框图。
图5示出了图2A所示***的命名空间查询中可以产生的散列表的一个示例。
图6示出了修正算法的高层结构图。
具体实施方式
提供了涉及并行综合体复合***的***和方法。描述了几个示例性的***和方法。
图1示出了并行综合体复合***(综合体)100的一个示例,该并行综合体复合***100具有包括处理器的综合体成员***1(S1)102、***2(S2)104、***3(S3)106和***4(S4)108。综合体100包括文件***树101,该文件***树101具有多个安装的文件***105。在运行中,当文件***105安装到文件***树101上时,文件***105与所有者***相关联,并且如果需要,还与一个或多个客户端***相关联。客户端在文件***安装时间“连接”到所有者以交换信息,这样客户端可以向所有者发送针对所需文件***的文件请求(read、write、mkdir等等)。***的所有者存储在全局资源串行化(GRS)中,该全局资源串行化(GRS)是分布式的***锁和资源管理器;文件***的所有者获取文件***名称的入队(enqueue)以指示其拥有相关的文件***。从而,可以查询GRS以找出来自任何***的文件***的所有者。Unix***一般包括逻辑文件***(LFS)层和物理文件***(PFS)层。实施例在国际商业机器(IBM)z/OS操作***中实现。z/OS中的逻辑文件***层称为Unix***服务(USS),并且物理文件***是z系列文件***(zFS)。
USS和管理员控制最初在哪些综合体成员上安装文件***。USS可以提供将相同的文件***安装在多个***上。对于综合体感知***,成员能够成功访问文件***所处的DASD,以用于成功安装。由此,如果成员从USS接收了对于文件***的安装请求,并且请求是成功的,则成员“缓存”文件***。当文件***不具有成功本地安装时,客户端***不缓存文件***,而且,当没有综合体成员具有用于文件***的本地安装时,所有者***不缓存文件***。
并行综合体***被设计用于从成员的故障中进行恢复;例如,如果文件***的所有者发生故障,则另一个成员获取文件***的所有权以保证访问不丢失。在一些示例中(如丢失的DASD访问),没有成员可以取得文件***所有权;在这样的情况下,文件***保留为无主的,直到某个***成员取得所有权。所有权可以根据使用统计而转移,以保证多数活动***拥有文件***。
图2A和图2B示出了4个成员综合体中的文件***所有权配置的示例。参考图2A,综合体包括3个文件***F、H和G,其一致地分布作为命名空间。***1(S1)拥有文件***F,并与作为客户端的***S2和S3相关联。S2和S3与作为F所有者的S1相关联。文件***H仅安装在S4上,因此S4是对与H相关联的信息进行缓存的仅有***。文件***G安装在所有***上,但它是无主的(U)。可能有多个原因造成G的所有权缺少,例如,作为G所有者的另一个综合体成员没有运行,并且所有权没有转移到另一个***。图2A的命名空间是一致的,因为***(S1、S2、S3和S4)同意S1是F的所有者,S1就S2和S3是客户端与S2和S3协商一致。对于G,所有的***同意G为无主的,并且H仅由S4所有而其他***没有对于H的冲突条目。
参考图2B,图2B示出了不一致命名空间的示例。在示出的示例中,S1将S2和S3关联为F的客户端,然而S2既没有F的本地安装,也没有与F相关联的信息。S2已将S3关联为G的所有者;然而S1、S3和S4将G关联为无主的。如果图2B中的不一致没有得到修正,则F不能全部从综合体上卸载,因为S1将不会卸载F。对于G,如果用户期望访问G,则***S1、S3和S4的用户将接收到错误。
如果在安装或卸载文件***时***之间发生通信故障或超时,则可能出现图2B的不一致。例如,对于G,如果S3拥有G并且处于转移G所有权的过程中,则S3首先向其他***发送消息以便将G移动到无主列表中。如果S2未接收到该消息,则其他***可以将G移动到无主列表,但是S2可能将G保持为由S3所有。结果是文件损坏和丢失文件***访问。
文件***的所有权协定和客户端关联是维持一致综合体的一个因素。其他因素包括关于文件***是否存在0个或多个克隆快照的协定、关于文件***状态的协定(例如,文件***是否是停顿的,这意味着暂时停止综合体范围内的用户活动,停顿的原因例如是整个文件***备份或所有权转移),以及关于文件***的处理属性的协定(例如,低空间监测和动态文件***扩展)。
图3是缓存数据结构的示例的框图,该缓存数据结构可以用于维护综合体成员***和文件***的状态。该数据结构可以用于维护存储器中的综合体命名空间。块301表示包括字段Local(本地)、Unowned(无主)和Remote(远程)的程序全局存储。Local寻址表示本地综合体成员的SYSTEM结构。Unowned寻址表示“无主”***的SYSTEM结构,并锚定(anchor)当前无主的文件***列表。Remote寻址表示曾经加入过群组的每个综合体成员的SYSTEM结构的列表,即使该成员当前不是群组的部分。其他字段包括sysLock、InternalErr、XmitProb和Xmit_list。sysLock字段是本地***锁,用以保护对结构的更新。如果本地***怀疑与其他成员可能的命名空间一致性错误,则可以将InternalErr置位。如果本地***与其他成员存在通信问题,则可以将XmitProb置位。Xmit_list是对于管理员命令遇到传输错误的文件***列表的锚,该管理员命令针对本地***的***而被处理。(即,本地***知道:由于通信问题,文件***可能具有命名空间不一致。)
块303表示综合体中的成员***,并包括字段as_state、as_level、as_name、as_nsquery_bit和as_fs。as_state字段表示***的状态,可以包括以下之一:如果成员停机,则为AS_DOWN;如果成员运行并且在综合体中是活跃的,则为AS_READY;如果成员停机,并且本地***已经接收到来自XCF(XCF是代码的z/OS层,其处理***停机通知和处于故障状态的成员的***划分)的成员停机的通知,并且本地***已经冻结了针对原来由停机成员拥有的文件***的用户活动,并将针对该成员的文件***移动到无主列表中,则为AS_PARTIALLY_DOWN。字段as_level指示所支持的软件层次(即,是否支持读写综合体文件***共享)。字段as_name指示***的名称。字段as_nsquery_bit是在确认的命名空间检索部分期间为***指定的编号。字段as_fs是综合体成员所拥有的文件***的列表的锚。
以下附录部分中的表1包括可以用在示例性方法的管理命令示例。
在修正文件***不一致之前,检测(确认)不一致。命名空间确认被整合为初始化过程的一部分;任何新成员都要执行确认以保证其在一致的命名空间开始。因为新成员是未损坏的(其命名空间为空),所以新成员是执行修正的优选***。当成员正常地或异常地离开综合体时,执行修正。每当在与其他综合体成员通信时发生意外错误时,便由***自动调度确认检查;例如,如果发生通信故障,或如果从远程成员接收到意外错误。确认检查还可以通过z/OS***操作命令F ZFS,NSV于任何时候在任何综合体成员上运行(不管哪个成员将指令发起为成员的完全综合体确认)。
对于串行化,GRS被用作综合体锁管理器。管理命令(表1中的)可以使用以下的示例GRS入队以用于串行化:IOEZNS和IOEZTM.filesysname。管理命令(如MOUNT、UNMOUNT、文件***所有权变化、备份停顿等等)以共享模式获得IOEZNS资源,并以独占模式获得文件***资源。确认以独占模式获得IOEZNS资源,从而当确认运行时,其他管理命令不可以运行。没有新***可以加入综合体,并且新***在尝试GRS入队到IOEZNS时进行等待。入队的超时用于防止无限的等待。初始化使用IOEZJPIN作为用于加入XCF群组的新***的串行化的GRS入队。所有新到来的成员在加入时获取锁,并且因为成员进行命名空间确认,所以成员在加入综合体时还获得IOEZNS。
虽然在确认和修正期间不可以运行新的管理命令,但是***可能在命名空间提取过程期间停机。在确认期间,对***停机时需要的工作进行处理。当成员停机时,XCF发送通知,并且每个活跃成员停止对停机成员所拥有的文件***的任何用户动作。(在以上的示例中(图2A),如果***S1停机,***S2和S3停止对文件***F的用户动作,并将F移动到无主列表,随后,***之一可以尝试取得所有权)。
初始化例程包括调用XCF来查询当前成员群组部分,以加入群组并执行命名空间确认。以下附录部分的表2中描述了初始化例程的一个示例。
当子程序接收到意外消息或消息回复返回代码,或经历了用于更新综合体命名空间的消息的通信故障时,针对F ZFS,NSV命令,在初始化期间调用称为NSValidate的确认例程。
图4是确认算法的一个示例的高层框图。在块402中,IOEZNS资源保持为独占模式,其阻止任何其他可能对命名空间进行改变的管理相关操作,包括其他的确认命令。由此,命名空间被“锁定”在操作上。在块404中,确认***向其他综合体成员提供确认***假定其就绪的***的列表,并与其他***进行同步,以保证所有***就综合体中哪些***是活跃的达成一致。在块406中,将Namespace Query(命名空间查询)(NSQUERY)消息广播到综合体成员,以获取并行的每个命名空间的视图。因为每个成员具有不同的命名空间视图,所以每个***在***的缓存命名空间中具有不同的信息(例如,文件***可以不安装在所有综合体成员上,并且所有者的文件***视图不同于文件***的客户端的视图)。在块408中,确认***创建并更新了由每个***报告的文件***的散列表。每个散列表具有相同的行数,因此对于具有该文件***的安装的每个成员多对应的每个散列表来说,文件***F在同一行被散列。对于每个成员已知的每个文件***,返回状态、所有者、哪些***是客户端(所有者***)、客户端是否连接(客户端***)以及属性。在块410中,确认***对散列表中的信息进行比较以用于一致性。在块412中,如果任何成员停机,或如果其他成员确定***停机,则过程重新启动,直到产生没有成员停机的干净查询(clean query)。在块414中,如果不一致,则确认***执行修正。
如果在任何确认或修正消息中存在任何通信故障,则确认从开始重新启动。确认***警告操作者并“ping”每个***,以保证确认***与该***通信,如果确认***不能通信,则确认***通知操作者哪个***遇到了通信问题。操作者可以调查或终止有问题的成员。NSValidate例程的一个示例在表3中示出。
图5示出了可以在图2A所示***的命名空间查询中产生的散列表的示例。如果确认创建例如具有3行的散列表,并且文件***F和H被散列到该表的第2行,而G被散列到该表的第0行,则图5中示出了得到的散列表,其是作为用于检查一致性的命名空间查询过程的一部分而在确认***存储中被创建的。散列表的每个条目包括文件***状态、属性和所有者标识(根据散列表所表示的***)。如果***认为自己是所有者,则该***将包括掩码,该掩码指示该***认为哪些***是文件***的客户端。为每个***指定掩码位置,并且可以简洁地表示已连接客户端的列表。
SynchronizeReadySystems例程与其他成员通信,以确保哪些***运行的协定。SynchronizeReadySystems例程的一个示例在表4中示出。
在SYNCREADY消息的目标***处调用rcv_syncready例程。该例程对发送者就绪***列表与接收者所保持的就绪***视图进行比较,并且在本地***不知道停机***时,等待针对发送者确认为停机的任何成员的***停机通知。rcv_syncready例程的一个示例在表5中示出。
Retrieve_namespace例程将来自调用者(NSValidate)的ready_systems列表作为输入,确认并修正命名空间。如果发生任何传输故障,则该例程向NSValidate返回发生传输故障的指示,NSValidate警告管理员,并启动等待/ping进程,重新启动例程。Retrieve_namespace例程的一个示例在表6中示出。
send_nsquery例程向在其命名空间中仍然具有尚未返回到确认***的条目的所有***广播NSQuery消息。因为每个***可以在***命名空间中具有不同的文件***数目,所以发送和应答的数目对于每个***可以不同。send_nsquery例程的一个示例在表7中示出。
sh_compare_tables例程在命名空间已经从所有综合体成员检索之后,由retrieve_namespace调用。该例程指示命名空间是否一致。sh_compare_tables例程的一个示例在表8中示出。对于不一致的命名空间的命名空间属性数据的一个示例在表9中以C编程语言示出。
一旦确认完成,便可以修正命名空间。如果损坏是由通信故障造成的,则具有预期的特定损坏类型。在修正过程期间,确认成员从包括具有损坏和通信错误的每个文件***的每个成员获取文件***列表。对损坏类型进行分析,以确定损坏是否符合由于通信故障或消息超时可以发生的损坏简档。如果损坏符合简档,则修正例程通过与对成员命名空间中具有不正确信息的任何成员交流适合的修正而解决该问题。
如果损坏不符合简档,则一个或多个成员具有成员没有检测到的损坏。在确认检测到损坏的情况下,一个或多个成员具有不是自己检测到的损坏。如果具有损坏的成员的数目小于或等于阈值MIN(2,活跃综合体成员的数目),则具有损坏的成员重新启动。如果具有不一致的成员的数目大于该阈值,则调用USS以内部重装文件***(重装的一个示例包括:停止用户对文件***的文件活动,综合体范围内卸载文件***,综合体范围内安装文件***,以及恢复用户活动)。
图6示出了修正算法的示例性的高层框图。在块602中,从每个成员获取具有通信故障的文件***的列表。确认者(进行确认的***)处理可能在综合体成员之间具有不一致的文件***的完整列表,其中该不一致不是由内部问题导致的。在块604中,对确认步骤期间提取出的命名空间进行复查,与GRS通信以保证zFS信息与GRS信息匹配。形成不一致的文件***的列表,向操作者发布描述该不一致的详细消息。在块606中,将不一致文件***的列表与具有通信故障的文件***列表进行比较,并且将任何具有通信故障的文件***、以及其不一致与对于通信故障所预期的相匹配的文件***标记为“通信故障一致”。通信故障的不一致的类型的示例包括:所有者具有针对其他***的连接,但是***没有注册该***具有连接;文件***的客户端可能注册文件***停顿,而所有者没有注册文件***停顿;一个或多个成员可能注册文件***是被拥有的,同时其他成员注册文件***是无主的;客户端可能注册文件***快照相关的错误信息。
在块608中,针对具有通信故障的任何文件***执行修正(在该步骤之后,内部错误所导致的文件***不一致保留),其中通信故障例如:连接问题——指示所有者为不具有连接的客户端移除所有者具有的任何额外连接;状态问题——指示具有停顿状态文件***的任何客户端激活文件***;所有权问题——指示任何不具有标记无主的文件***将文件***移动到无主列表;快照问题——向任何具有错误快照信息的客户端发送正确快照信息,以允许客户端保存正确快照信息。
在块610中,如果需要重新启动(基于发现的不一致)的综合体成员的数目小于或等于允许重新启动的最大成员(阈值),则受影响的成员重新启动。在***重新启动自己时,该***重新进行确认和修正。如果任何***重新启动(zFS在成员处重新启动。USS层将文件请求路由到其他***,直到zFS重新启动。一旦zFS重新启动,USS对重新启动的zFS进行安装),则进行新的确认。
在块612中,具有不一致的其余文件***不能通过重新启动进行修正(因为不一致***的数目大于重新启动阈值)。在这种情况下,获取不一致文件***通过文件***的重装而从所有zFS地址空间中被移除的证实,可以将以下处理示例用于每个文件***:与所有***进行通信,指示***检查USS是否注册***该***向本地zFS提出文件***的安装。如果成员注册了文件***的缓存条目,但是USS没有注册文件***被本地安装,则zFS成员对其所有缓存中与文件***相关的任何和全部结构执行强制删除;与仍然具有文件***的缓存条目的任何成员进行通信,以激活文件***(在其为停顿的情况下);发布osi_ctl(重装)指令,以指示USS卸载并重装相同模式的文件***。当每个zFS接收卸载时,zFS对文件***相关的每个内部结构执行强制删除。从而,当对于文件***的安装到达个体综合体成员时,综合体成员开始清除文件***的缓存。
如果期望修正,则编译具有通信故障的文件***的列表。列表包括来自综合体中所有***的文件***,并被用于确定适用什么修正。如果在编译列表时遇到通信故障,则重新启动确认过程。一旦确认完成,综合体中的每个***清除具有通信故障的文件***的列表。在sh_compare_tables例程完成之后,从retrieve_namespace调用send_getxmit_fail例程。send_getxmit_fail例程返回具有通信故障的文件***的更新列表;并返回发送GET_XMITFAIL消息是否遇到通信问题的指示。send_getxmit_fail例程的一个示例在表10中示出。
使用get_fs_list例程来处理临时散列表,以创建具有不一致的文件***的列表。根据所有的散列表每次分析一个文件***。对于参与确认的每个***具有一个散列表。如果关联的***包括针对文件***的缓存条目,即,如果文件***安装在该***上,则每个散列表包括针对文件***的NS_ITEM条目。NS_ITEM是包含关于特定文件***的文件***状态的结构。get_fs_list例程的输入是临时散列表数组和ready_systems数组。输出是不一致文件***的列表的地址,更新临时散列表从而仅包括不一致文件***条目;并且移除具有相关于坏克隆的信息的临时散列表条目。get_fs_list例程的一个示例在表11中示出。
对于具有xmit_fail设置的不一致文件***F,使用trim_xmit_failure例程对不一致进行分析,以保证没有内部错误导致的不一致。如果发现内部错误导致的不一致,则重置xmit_fail。trim_xmit_failure例程的输入是更新的临时散列表数组、ready_systems数组以及不一致文件***的列表L。如果不一致与通信故障不对应,则输出是针对L中任何文件***F而重置的xmit_fail标志。trim_xmit_failure例程的一个示例在表12中示出。
在开始修正之前,检查ready_systems列表中的所有***,以保证就绪的***仍然使用check_down_systems例程运行。check_down_systems例程的一个示例在表13中示出。
一旦编译了具有不一致的文件***列表,则临时散列表仅包括针对不一致文件***的条目,并且运行***被验证,可以使用correct_namespace例程修正不一致。correct_namespace例程的输入是临时散列表数组、ready_systems数组和不一致文件***的列表L。correct_namespace例程的输出是经过修正的文件***、重新启动的***和重装的文件***。correct_namespace例程的一个示例在表14中示出。
如果在以上例程之一中***确定为停机,则可以发送***停机通知。当接收到***停机通知时,可以运行***停机例程以适应***损失。system_down例程的一个示例在表15中示出。
上述***和方法的技术效果和有益效果提供了在分布式命名空间中确认和修正文件***的高效自动的方法,消除了人为干预修正问题或重新启动整个综合体的需要。该方法提供了良好的首次故障数据捕获,并提供了用于响应通信故障的有效方法,其不会使用户无限期挂起,并为出现问题的***操作者提供适合的通知。
此处使用的术语仅用于描述特定实施例的目的,不是为了对本发明进行限制。如此处所使用的,单数形式的“一”、“一个”和“该”旨在也包括复数形式,除非上下文另外明确指示。进一步需要理解的是,当术语“包括”和/或“包含”用于本说明书时,其指明存在所描述的特征、整体、步骤、操作、元素和/或组件,但是并不排除存在或添加一个或多个其他特征、整体、步骤、操作、元素、组件和/或其组合。
如具体要求的,以下的权利要求中相应的结构、材料、行为和所有方法或步骤加功能元素的等同物旨在包括用于完成与其他所要求的元素组合的功能的任何结构、材料或行为。本发明的说明书已经用于示例和描述的目的而提出,但是其并不旨在为穷举性的或限制于本发明公开的形式。不脱离本发明的范围和精神的很多改进和变化对于本领域技术人员是显而易见的。为了更好地解释本发明的原理和实际应用,并使得本领域技术人员能够理解本发明用于具有适合于特定预期使用的不同改进的不同实施例,选择和描述了实施例。
表1:
管理命令
1.MOUNT-在文件***树中安装文件***。如果对于一个成员(其成为所有者)第一次提出,则将追赶型(catchup)安装广播到CONNECT(连接)到所有者的其他成员,以通知它们是客户端。
2.UNMOUNT-在文件***树中卸载文件***。以任何顺序表示。客户端***将从所有者DISCONNECT(断开),当最后的***进行卸载时,所有者将关闭该文件***。
3.QUIESCE(用于备份)-停止综合体范围内对文件***的写活动。所有者通过向客户端发送QUIESCE(用于备份)消息来协调命令。
4.CLONE-创建原始文件***的克隆(磁盘上文件***的备份)。所有者通过告知客户端QUIESCE(用于克隆/删除)来协调命令,QUIESCE停止综合体范围内的所有用户活动。它创建克隆并将CLONE消息发送到客户端以指示目前具有文件***的新克隆。然后所有者发送UNQUIESCE消息,以告知客户端恢复用户活动。
5.DELETE-类似于克隆,然而克隆被删除。
6.UNQUIESCE(用于备份)-停顿的对立,所有者向客户端发送UNQUIESCE消息以恢复用户活动。(备份程序将调用zFS以QUIESCE文件***,制作备份,然后调用zFS以激活文件***)。
7.FSMOVE-将所有权从原始所有者转移到新所有者。原始所有者向客户端发送QUIESCE(用于转移),它们停止用户活动,然后原始所有者向客户端发送UNOWNED消息,这样它们将文件***改变到无主状态(没有所有者)。这时,文件***是无主的。然后,新所有者发送START_TAKEOVER消息以保证其他综合体成员同意新所有者可以真正进行,然后TAKEOVER消息告知客户端其真正恢复所有权,它们将文件***从无主列表转移到新所有者SYSTEM列表。然后发送无关命名空间的其他消息,最终将向客户端发送UNQUIESCE消息以允许恢复用户活动。
8.GROW-扩展文件***。与其他成员通信以使得文件***在扩展时不被卸载。所有者在其扩展文件***之前发送GROW_START消息,在扩展完成时发送GROW_STOP消息。在该过程中不停止用户活动(不需要)。
9.当文件***的所有者离线时,所有其他综合体成员将转移停机***无主列表的文件***,并停止对该文件***的用户活动。然后综合体成员通过尝试获取所需要的串行化(参见以下)而竞争成为文件***的所有者,然后进行START_TAKEOVER...用于FSMOVE所描述的序列。
表2
Initilization
1.以独占模式入队IOEZJOIN资源(保证综合体中一次最多初始化一个***)。
2.调用XCF以查询哪些***是zFS群组的活跃成员(示出综合体的哪些成员是运行的,并运行zFS软件,因为每次只有一个***(本***)可以被初始化或终止),所以***全部被初始化),为活跃成员提供***名字列表。
3.调用XCF以加入zFS群组。
4.对于XCF群组的部分的每个成员(列表在步骤2中提供):
a.在本地缓存中为成员创建SYSTEM结构,并将其添加到remote(远程)列表中。
b.调用XCF以与目标成员建立通信连接。
c.如果步骤4b成功,在成员的SYSTEM结构中将as_state标记为AS_READY,否则将其标记为AS_DOWN。
d.→向目标成员发送JOIN消息以交换协议信息和软件层信息。
i.←消息的接收方将进行:
1.锁定其本地sysLock。
2.为发送者创建SYSTEM结构(如果不存在)并将它们标记为AS_DOWN,并保存软件发布层。
3.释放本地sysLock。
4.返回接收方的软件支持/层。
e.如果目标停机然后继续下一个成员(停机成员意味着我们的任务变得更加简单,初始化更少的成员)。
f.保存目标成员软件支持/层。(软件支持指示例如读写综合体是否安装共享支持)。
5.调用NSValidate以进行命名空间确认,以完成初始化序列。
表3
NSValidate
1.如果还没有进行,则以独占模式入队IOEZJOIN资源。(需要注意的是,该步骤已经进行了初始化,所以其跳过初始化,但是该例程在需要确认的任何时间被调用)。
2.以独占模式入队IOEZNS资源。(这保证了综合体中每次仅进行一个确认,使得管理命令如MOUNT、UNMOUNT等等进行等待)。从而命名空间被冻结。
3.以写模式锁定sysLock。
4.计算远程列表中的项目数目,使得N=远程列表中的项目计数。
5.如果由初始化调用,获取N个项目(本地***还没有运行)的就绪***列表数组,或者获取N+1个项目的就绪***列表数组(本地***已经运行)。该列表仅是***名字的数组。在z/OS中,每个***名字最多为8个字符。
6.如果internalErr或XmitProb置位(本地***在综合体的一个或多个成员上检测到可能的zFS软件,或其在更新另外综合体成员的命名空间的消息中遇到传输故障),发布消息警告***操作者命名空间确认由于遇到错误而运行。
7.基于远程列表中的哪个SYSTEM结构被标记为就绪而填充ready_systems列表,使ready_count=激活***的当前数目。(需要注意,***在确认期间可能停机,所以列表可能收缩)
8.如果XmitProb,则进行:
a.向所有就绪综合体成员广播PING消息(这仅是“喂,你好消息”)。
b.如果任何***回复失败:
i.发布显示哪个***具有故障的消息
ii.暂停短暂的时间
iii.转到步骤6。
9.调用SynchronizeReadySystems以与其他成员通信,并保证关于***在运行的协定。ready_systems列表作为输入传递,输出为成功或失败(发生传输错误)的指示。
10.如果发生传输错误,将XmitProb置位并转到步骤6。
11.调用retrieve_namespace以获取综合体命名空间,对其进行确认并修正。ready_systems列表作为输入传递,输出为是否发生传输问题的指示。
12.如果发生传输错误,将XmitProb置位并转到步骤6。
13.清除InternalErr和XmitProb标志(命名空间已经被确认并修正)和Xmit_list。
14.向其他被请求成员发送NSV_Complete消息,它们将仅清除它们的InternalErr、XmitProb指示和它们的Xmit_list。
15.如果由初始化调用,则返回(初始化将进行更多无关本发明的工作)。
16.释放sysLock。
17.释放IOEZNS
18.释放IOEZJOIN
19.释放ready_systems列表存储。
20.返回。
表4
SynchronizeReadySystems
1.扫描远程***列表,并更新输入的ready_systems列表,因此它正确地反映本地***认为综合体的什么成员就绪。
2.在ready_systems列表中循环每个远程成员名字;
a.释放sysLock。
b.向成员传输SYNCREADY消息。本地***的ready_systems列表被发送到目标成员,所以它能够将它与其本地缓冲相比较。
i.←成员将使用任何其知道为DOWN、发送者不了解的成员的指示回复。
c.在写模式锁定sysLock。(锁定保护本地命名空间缓存在传输中正常地释放以防止死锁)。
d.如果目标***刚好停机,等待任何***停机处理该有待完成的成员(***停机处理意味着XCF调用具有群组-用户指示的zFS,zFS停止对该成员拥有的文件***的任何用户活动,将那些文件***移动到无主列表)。
e.如果目标***返回其知道的停机的***的名字,但是其名字在传递给它们的ready_systems列表中:
i.等待对于返回的成员名字的***停机处理。
3.再次扫描远程***列表,基于哪些***被视作就绪来创建新的ready_systems列表。
4.如果步骤3中的列表与步骤1中获取的列表不匹配,转到步骤1。
5.向调用者返回更新的ready_systems列表。(此时,所有其他成员就综合体中哪些***是活跃的达成一致)。
表5
rcv_syncready
1.以写模式锁定sysLock。
2.检查发送者仍然是活跃的,消息对于处理是有效的(发送者在其传输消息之后没有停机)。
3.扫描本地***上的远程列表中的***列表,如果不在由发送者提供的列表中的任何被标记为就绪:
a.等待来自XCF的***停机通知,以及与其相关联的处理(文件***转移到无主列表)。
4.扫描本地***上的远程列表中的***列表,如果存在于由发送者提供的列表中的任何被标记为未就绪:
a.返回向发送者的应答包中发现的第一个***的名字。
5.释放sysLock。
6.向发送者发送应答包。
表6
Retrieve_namespace
1.设置变量try_again=0。
2.获取散列表指针数组(以上所述,并在图4中示出),每个指针数组用于ready_systems列表中的每个就绪***。
3.获取8字节cookie数组,每个用于ready_systems列表中的每个就绪***。每个***具有不同的命名空间,如果命名空间大,可以对***进行多次调用以检索命名空间,NSQuery消息的接收方将返回cookie,该cookie将传递到随后的调用(其指示在哪里恢复到命名空间列表中)。
4.获取返回代码(qcode)的数组,一个用于每个追踪查询期间哪个***可能遇到错误的***。
5.获取reached_end标志数组,指示特定***何时返回其命名空间中的最后一项。基本上,因为每个***具有不同大小的命名空间,因为NSQuery广播到每个综合体成员,所以一些***可以已经完成查询,同时其他的将需要附加的NSQuery消息以获取更多命名空间。这用于保持哪个***已经完成以及哪个还没有的追踪,以了解将未来的NSQuery消息广播到哪个***。
6.创建SYSTEM指针(ready_sysp)数组,一个用于ready_systems列表中列出的每个***名字。
7.清除散列表指针数组。
8.循环:
a.确定ready_systems列表中列出的每个***仍然被本地***视作AS_READY。如果不是,则转到步骤8f。
b.为ready_systems列表中的每个***创建空的散列表(包括以上示出的NS_ITEMS)。
c.如果没有其他就绪***(本地***为综合体中仅有的***),设置ended=1,否则设置ended=0。
d.在(ended=0,以及具有就绪远程***)时:
i.调用send_nsquery,以向ready_systems列表中的所有成员广播具有更多条目返回的NSQuery包。输入为ready_systems列表。输入/输出参数为cookie数组和qcode数组,以及应答缓冲的数组,其中每个来自于它们的平的(flattened)命名空间的每个***。
ii.如果发生传输故障,转到步骤8f。
iii.对于ready_systems列表中具有相应的为0的reached_end[i]值的每个***ready_systems[i](***在其命名空间中具有更多条目):
1.如果相应的***在其应答中返回***停机错误代码(来自NSQuery的qcode[i]消息),转到步骤8f(目标***注意到成员停机)。
2.为***取得应答包中列出的文件***,并将其添加到用于该***的相应的散列表中。从而,NS_ITEM对于应答包中列出的每个文件***添加到适合的散列行中,应答包中的条目本质上是NS_ITEM结构本身,所以其正在从记录的平缓冲创建散列表。
3.如果对于该***返回的cookie[i]指示没有更多的条目(zFS使用-1的cookie表示),则设置reached_end[i]=1。
iv.如果对于每个就绪***的所有reached_end[]值都为1,则设置ended=1。
e.扫描ready_systems列表,确保每个***仍然就绪,如果它们仍然就绪,则从主循环跳出(BREAK)。
f.删除在前步骤中创建的任何散列表和散列表中的所有条目。
g.调用synchronize_ready_systems来串行化其他***,并更新ready_systems列表,以反映确认过程中哪个成员(或哪些成员)停机。
h.如果在synchronize_ready_systems期间发生传输故障,返回(因此NSValidate能够将问题通知操作者)。
9.填充ready_sysp数组,因此ready_systems列表中的名字和ready_sysp数组中的SYSTEM指针之间具有1-1对应。另外,因为命名空间中的一些文件***可能是无主的,所以具有用于“无主”***的特殊条目,从而将用于无主文件***的SYSTEM结构添加到列表中。
10.调用sh_compare_tables,针对一致性而比较每个***所知的命名空间。该功能本质上返回命名空间是否一致的指示。它将从发现一致的散列表中移除文件***,并且其一旦在命名空间中发现不一致文件***时就停止处理。
11.如果sh_compare_tables指示命名空间不一致;
a.调用send_get_xmitfail以从每个成员获取文件***的列表,并将那些名字添加到本地Xmit_list。从而在该步骤之后,本地Xmit_list包括具有在其处理期间遇到通信故障的管理命令的所有(ALL)文件***的列表。这些文件***在命名空间中预期可能为不一致的,不需要表示zFS软件错误。
b.调用get_fs_list以从sh_compare_tables停止的地方继续。其本质上创建不一致的文件***的列表。
c.调用trim_xmit_failure,以取得坏文件***列表,并指示哪个文件***具有通信故障类型不一致。
d.如果任何具有不一致的***与通信故障不(NOT)相符,转存(dump)所有综合体成员上的zFS存储,因此问题能够报告给IBM服务。
e.PING_ready_systems列表中的每个***,以确保与***的通信。因为在消息传输中不保持sysLock,所以PING期间能够提出***停机通知。从而如果***停机或具有通信问题,需要返回调用者(NSValidate),因此其能够重试确认。
f.如果PING对于一个或多个成员失败或***停机,设置try_again=1,并转到步骤12。
g.调用correct_namespace以修正命名空间。
h.设置try_again=1。
12.释放散列表存储和坏文件***列表存储。
13.释放get_fs_list所列出的任何坏文件***。
14.如果try_again,则转到步骤16
15.(此时,命名空间是一致的)。如果用于初始化调用:
a.向ready_systems列表中的每个***发送READY消息。
i.←每个接收方将发送者SYSTEM状态标记为AS_READY。
b.(从而,此时,新***在综合体中视作就绪,其确认命名空间并正式加入综合体)。
16.释放步骤2-5中获取的任何剩余存储。
17.如果try_again=1,则跳转(GOTO)步骤1。
表7
send_nsquery
该例程的输入/输出为:
1.将要发送到的***的ready_systems列表。
2.对于每个***的应答缓冲的数组。
3.更新的qcode数组,其指示来自每个***的应答的返回代码。
4.以及cookie数组,其为每个成员返回的恢复cookie。
算法:
1.格式化广播到每个综合体成员的包。该包包括:
a.ready_systems数组,其列出发送者认为在综合体中就绪的所有***。
b.cookie数组,虽然每个***具有其自己唯一的cookie,但是cookie的完整数组也将广播到每个成员(以基本上允许单独广播,每个***在接收到公共包之后定位其cookie)。
2.释放sysLock
3.向综合体中还没有返回值为-1的cookie的所有***广播NSQuery消息。等待来自成员的所有应答。
4.以写模式锁定sysLock。
5.基于每个***做出的应答更新cookie和qcode数组。
NSQuery消息的接收方进行以下步骤:
1.扫描到来的包中的输入ready_systems列表,用于与接收方***相匹配的名字,并保存位置p。
2.使用输入包中的cookie数组的位置p中的相应cookie。
3.检查以保证就绪***的接收方视图匹配调用者列出的输入ready_systems列表。如果其确定具有失配,其返回错误,因此确认***将知道它将需要调用synchronize_ready_systems以保证综合体成员同意综合体中哪个***就绪。
4.然后调用者使用输入cookie确定从哪里继续其命名空间查询。Cookie为8字节值,第一个4字节指示在其命名空间缓存中哪个SYSTEM结构停止,第二个4字节指示哪个文件***由SYSTEM开始的指示被所有。<0,,0>意味着从起点开始,并返回值<-1,,-1>(或如果使用64比特机器语言为-1)指示扫描完成。
5.获取90K缓冲以容纳文件***列表。
6.循环,从由cookie指示的第一个SYSTEM开始:
a.从cookie所指示的每个文件***开始循环,该cookie由指示的SYSTEM所有:
i.将来自FILESYS结构的信息转换为平的NS_ITEM类型表示。
ii.如果缓冲中没有更多空间,则从BOTH循环跳出。
7.将输出cookie更新到停止的地方,或如果处理其余的文字空间则更新为<-1,,-1>。
8.向发送者回传应答。
9.释放应答缓冲存储。
表8
sh_compare_tables
1.如果由于初始化而没有被调用,则为本地***创建NS_ITEM散列表(本地***被初始化,从而也具有命名空间缓存)。
2.获取用于ready_item数组的存储,其条目与ready_systems列表中的***1-1对应。该数组显示***在查询过程中报告的对应的NS_ITEM,表示文件***的***视图。
3.对于每个***s,在ready_systems列表(包括UNOWNED***)中,循环:
a.对于对应于***s的散列表的每行r,循环:
i.循环处理散列行r中的每个文件***F:
1.查找表示文件***所有者的SYSTEM结构,然后查找拥有该集合的文件***的ready_systems列表中的相应索引o。这是数组中的所有者索引。
2.对于每个其他散列表(不是s)循环:
a.在它们相应的散列行r中搜索相同的文件***F,如果存在则保存与ready_systems列表1-1对应的ready_item数组中相应的NS_ITEM地址。
b.确认所有***同意所有者,如果不是则返回错误。
3.如果所有者索引o没有表示无主***(从而文件***确实被所有):
a.保证所有者***实际认为它们拥有该文件***,如果不是则返回错误。
4.如果文件***安装R/W,所有者***不支持复合***读写安装,保证只有一个***在其本地命名空间中具有文件***F的条目。
5.如果文件***仅安装在一个综合体成员上:
a.如果所有者认为任何其他***已经安装,则返回错误(从而所有者在其NS_ITEM中具有非零连接位掩码)。
b.转到步骤9。
6.对于在其命名空间中具有文件***F的每个***:
a.确定它们的misc.attributes和文件***状态是相同的。(如果***在克隆期间停机,并且文件***当前是无主的,则其他***可能克隆了过期的信息。当***恢复文件***的所有权时得到纠正)。如果不一致,返回错误。
7.如果文件***F为无主的:
a.保证没有***认为其是所有者,或是已连接的,因此,它是一些所有者***的客户端。如果不一致则返回错误。
b.转到步骤9。
8.对于不是文件***所有者的每个***:
a.确定所有者是否认为客户端连接到客户端***认为它们自身是连接的文件***(或其克隆)。如果不一致,则返回错误。
9.从所有散列表中移除对于文件***F的NS_ITEM,其现在被视作一致的。
4.释放ready_item数组存储。
5.返回成功,命名空间是一致的。
表9
typedef struct badfs_t  {
   struct badfs_t*next;
   int owner_index;    /*所有者的ready_systems
数组中的索引*/
   NS_ITEM*owner_itemp;
   int first_index;    /*具有对于本***的条目的第一个***的ready_systems数组中的索引*/
   NS_ITEM*first_itemp;/*具有对于其命名空间中的文件***的条目的第一个***的NS_ITEM的地址*/
int slotnum;
int errflag;
#define OWNER_MISMATCH        0x80000000  /*客
户端上的所有者不匹配所有者上的所有者*/
#define BAD_OWNER             0x40000000  /*所有
者上的缓存条目丢失或具有坏的所有者指针*/
#define SYSADMIN_MULTIPLE_FS  0x20000000  /*对
于综合体admin拥有的fs的多个缓存条目*/
#define UNOWNED_GROWING       0x10000000  /*对
于无主的fs设置扩展标志*/
#define RW_MISMATCH           0x08000000  /*所
有者和客户端的RW标志不匹配*/
#define HASBAK_MISMATCH       0x04000000  /*所
有者和客户端的hasbak标志不匹配*/
#define GROWING_MISMATCH      0x02000000  /*所
有者和客户端的扩展标志不匹配*/
#define DYNMOVE_MISMATCH      0x00800000  /*所
有者和客户端的dynmove标志不匹配*/
#define NODYNMOVE_MISMATCH          0x00400000  /*
所有者和客户端的nofynmove标志不匹配*/
#define MONITOR_MISMATCH            0x00200000  /*所
有者和客户端的monitor标志不匹配*/
#define GROW_MISMATCH               0x00100000  /*所
有者和客户端的grow标志不匹配*/
#define NBS_MISMATCH                0x00080000  /*所有
者和客户端的nbs标志不匹配*/
#define CURSTATE_MISMATCH           0x00040000  /*所
有者和客户端的curstate不匹配*/
#define FSSTATE_MISMATCH            0x00020000  /*所
有者和客户端的fsstate不匹配*/
#define BAKSTATE_MISMATCH           0x00010000  /*所
有者和客户端的bakstate不匹配*/
#define THRESHOLD_MISMATCH          0x00008000  /*所
有者和客户端的threshold不匹配*/
#define INCREMENT_MISMATCH          0x00004000  /*所
有者和客户端的increment不匹配*/
#define MOVEPCT_MISMATCH            0x00002000  /*所
有者和客户端的movepct不匹配*/
#define MOVEINT_MISMATCH            0x00001000  /*所
有者和客户端的moveint不匹配*/
#define MOVEMIN_MISMATCH            0x00000800  /*所
有者和客户端的movemin不匹配*/
#define FSTOKID_MISMATCH            0x00000400  /*所
有者和客户端的fstokid不匹配*/
#define BAKTOKID_MISMATCH           0x00000200  /*所
有者和客户端的baktokid不匹配*/
#define FSID_MISMATCH               0x00000100  /*所有
者和客户端的fsid不匹配*/
#define BAKID_MISMATCH               0x00000080  /*所有
者和客户端的bakid不匹配*/
#define FSDEVNO_MISMATCH             0x00000040  /*所
有者和客户端的fsdevno不匹配*/
#define BAKDEVNO_MISMATCH            0x00000020  /*所
有者和客户端的bakdevno不匹配*/
#define FS_OWNERCONN_CLIENTNOCONN    0x00000010  /*
所有者连接比特置位但是客户端标志复位*/
#define FS_OWNERNOCONN_CLIENTCONN    0x00000008  /*
所有者连接比特复位但是客户端标志置位*/
#define BAK_OWNERCONN_CLIENTNOCONN   0x00000004  /*
所有者连接比特置位但是客户端标志复位*/
#define BAK_OWNERNOCONN_CLIENTCONN   0x00000002  /*
所有者连接比特复位但是客户端标志置位*/
#define FS_OWNERCONN_NOCLIENT        0x00000001  /*所
有者连接比特置位但是没有客户端缓存条目或客户端停机*/
int errflag2;
#define BAK_OWNERCONN_NOCLIENT       0x80000000  /*
所有者连接比特置位但是没有客户端缓存条目或客户端停机*/
#define FS_UNOWNED_CONNECTS          0x40000000  /*具
有非零连接掩码的无主*/
#define FS_SINGLE_CONNECTS           0x20000000  /*具有
非零连接掩码的单个条目*/
#define BAK_UNOWNED_CONNECTS         0x10000000  /*
具有非零连接掩码的无主*/
#define BAK_SINGLE_CONNECTS          0x08000000  /*具
有非零连接掩码的单个条目*/
#define UNOWNED_CONNECTFLAG          0x04000000  /*
具有非零连接标志的无主*/
#define SINGLE_CONNECTFLAG                   0x02000000  /*具
有非零连接标志的单个条目*/
    int reserved;
    int flag;                               /*非错误
标志*/
#define HAD_XMITFAIL                         0x80000000
#define FS_UNOWNED                           0x40000000
#define ERROR_XMITFAIL_CONSISTENT            0x20000000
   unsigned int cache_entry_count;          /*具有缓存条目的***计数*/
   short cache_entry_mask[16];              /*具有缓存条目的***列表*/
   unsigned int attach_count;               /*附加filesys的***计数*/
   short attach_mask[16];                   /*附加filesys的***列表*/
   unsigned int quiesce_count;              /*filesys停顿的***计数*/
   short quiesce_mask[16];                  /*filesys停顿的***列表*/
   unsigned int otherstate_count;           /*具有处于另外的curstate的filesys
的***计数*/
   short otherstate_mask[16];               /*具有处于另外的curstate的
filesys的***列表*/
   unsigned int owner_mismatch_count;       /*具有所有者失配的***计
数*/
   short owner_mismatch_mask[16];           /*具有所有者失配的***列表*/
   unsigned int sysadmin_multiple_FSs_count;/*具有对于filesys的缓存条目的***计数,所有者为sysadmin*/
short sysadmin_multiple_FSs_mask[16];/*具有缓存条目的***列表,所有者为sysadmin*/
unsigned int unowned_growing_mismatch_count;/*filesys无主但是filesys在扩展的***计数*/
short unowned_growing_mismatch_mask[16];/*FS无主但是filesys在扩展的***列表*/
unsigned int rw_mismatch_count;/*RW标志不匹配的***计数*/
short rw_mismatch_mask[16];/*RW标志不匹配的***列表*/
unsigned int hasbak_mismatch_count;/*HAS_BAK标志不匹配的***计数*/
short hasbak_mismatch_mask[16];/*HAS_BAK标志不匹配的***列表*/
unsigned int growing_mismatch_count;/*GROWING标志不匹配的***计数*/
short growing_mismatch_mask[16];/*GROWING标志不匹配的***列表*/
unsigned int dynmove_mismatch_count;/*DYNMOVE标志不匹配的***计数*/
short dynmove_mismatch_mask[16];/*DYNMOVE标志不匹配的***列表*/
unsigned int nodynmove_mismatch_count;/*NODYNMOVE标志不匹配的***计数*/
short nodynmove_mismatch_mask[16];/*NODYNMOVE标志不匹配的***列表*/
unsigned int monitor_mismatch_count;/*MONITOR标志不匹配的***计数*/
short monitor_mismatch_mask[16];/*MONITOR标志不匹配的***列表*/
unsigned int grow_mismatch_count;/*GROW标志不匹配的***计数*/
short grow_mismatch_mask[16];/*GROW标志不匹配的***列表*/
unsigned int nbs_mismatch_count;/*NBS标志不匹配的***计数*/
short nbs_mismatch_mask[16];/*NBS标志不匹配的***列表*/
unsigned int curstate_mismatch_count;/*CURSTATE标志不匹配的***计数*/
short curstate_mismatch_mask[16];/*CURSTATE标志不匹配的***列表*/
unsigned int fsstate_mismatch_count;/*FSSTATE标志不匹配的***计数*/
short fsstate_mismatch_mask[16];/*FSSTATE标志不匹配的***列表*/
unsigned int bakstate_mismatch_count;/*BAKSTATE标志不匹配的***计数*/
short bakstate_mismatch_mask[16];/*BAKSTATE标志不匹配的***列表*/
unsigned int threshold_mismatch_count;/*THRESHOLD标志不匹配的***计数*/
short threshold_mismatch_mask[16];/*THRESHOLD标志不匹配的***列表*/
unsigned int increment_mismatch_count;/*INCREMENT标志不匹配的***计数*/
short increment_mismatch_mask[16];/*INCREMENT标志不匹配的***列表*/
unsigned int movepct_mismatch_count;/*MOVEPCT标志不匹配的***计数*/
short movepct_mismatch_mask[16];/*MOVEPCT标志不匹配的***列表*/
unsigned int moveint_mismatch_count;/*MOVEINT标志不匹配的***计数*/
short moveint_mismatch_mask[16];/*MOVEINT标志不匹配的***列表*/
unsigned int movemin_mismatch_count;/*MOVEMIN标志不匹配的***计数*/
short movemin_mismatch_mask[16];/*MOVEMIN标志不匹配的***列表*/
unsigned int fstokid_mismatch_count;/*FSTOKID标志不匹配的***计数*/
short fstokid_mismatch_mask[16];/*FSTOKID标志不匹配的***列表*/
unsigned int baktokid_mismatch_count;/*BAKTOKID标志不匹配的***计数*/
short baktokid_mismatch_mask[16];/*BAKTOKID标志不匹配的***列表*/
unsigned int fsid_mismatch_count;/*FSID标志不匹配的***计数*/
short fsid_mismatch_mask[16];/*FSID标志不匹配的***列表*/
unsigned int bakid_mismatch_count;/*BAKID标志不匹配的***计数*/
short bakid_mismatch_mask[16];/*BAKID标志不匹配的***列表*/
unsigned int fs_ownerconn_clientnoconn_count;/*所有者连接比特置位但是客户端标志复位的***计数*/
short fs_ownerconn_clientnoconn_mask[16];/*所有者连接比特置位但是客户端标志复位的***列表*/
unsigned int fs_ownernoconn_clientconn_count;/*所有者连接比特复位但是客户端标志置位的***计数*/
short fs_ownernoconn_clientconn_mask[16];/*所有者连接比特复位但是客户端标志置位的***列表*/
unsigned int bak_ownerconn_clientnoconn_count;/*所有者连接比特置位但是客户端标志复位的***计数*/
short bak_ownerconn_clientnoconn_mask[16];/*所有者连接比特置位但是客户端标志复位的***列表*/
unsigned int bak_ownernoconn_clientconn_count;/*所有者连接比特复位但是客户端标志置位的***计数*/
short bak_ownernoconn_clientconn_mask[16];/*所有者连接比特复位但是客户端标志置位的***列表*/
unsigned int fs_ownerconn_noclient_count;/*所有者连接比特置位但是没有客户端条目或客户端停机的***计数*/
short fs_ownerconn_noclient_mask[16];/*所有者连接比特置位但是没有客户端条目或客户端停机的***列表*/
unsigned int bak_ownerconn_noclient_count;/*所有者连接比特置位但是没有客户端条目或客户端停机的***计数*/
short bak_ownerconn_noclient_mask[16];/*所有者连接比特置位但是没有客户端条目或客户端停机的***列表*/
unsigned int fs_unowned_connects_count;/*具有非零连接掩码的无主filesys的***计数*/
short fs_unowned_connects_mask[16];/*具有非零连接掩码的无主filesys的***列表*/
unsigned int bak_unowned_connects_count;/*具有非零连接掩码的无主FS的***计数*/
short bak_unowned_connects_mask[16];/*具有非零连接掩码的无主FS的***列表*/
    unsigned int unowned_connectflag_count;/*具有连接标志置位的无主FS的***计数*/
    short unowned_connectflag_mask[16];/*具有连接标志置位的无主FS的***列表*/
    unsigned int single_connectflag_count;/*具有连接标志置位的单个FS的***计数*/
    short single_connectflag_mask[16];/*具有连接标志置位的单个FS的***列表*/
    unsigned int fsdevno_mismatch_count;/*fs devno不匹配的***计数*/
    short fsdevno_mismatch_mask[16];/*fs devno不匹配的***列表*/
    unsigned int bakdevno_mismatch_count;/*bak devno不匹配的***计数*/
    short bakdevno_mismatch_mask[16];/*bak devno不匹配的***列表*/
    unsigned int had_xmitfail_count;/*具有XMIT故障的***计数*/
    short had_xmitfail_mask[16];/*具有XMIT故障的***列表*/
    unsigned int growing_count; /*growing比特置位的***计数*/
    short growing_mask[16];     /*growing比特置位的***列表*/
    unsigned int nobak_count;   /*对filesys没有.bak的***计数*/
    short nobak_mask[16];       /*对filesys没有.bak的***列表*/
}BADFS;
版权2009IBM
表10
send_getxmit_fail
1.对于每个远程***,发送GET_XMITFAIL消息。
2.在接收到GET_XMITFAIL消息之后,每个远程***返回管理命令中遇到影响文件***的通信故障的文件***名字数组。
3.在接收到应答之后,确认者添加返回到具有通信故障的文件***的本地列表的文件***,保证没有重复的条目。(此时,确认者***具有所有具有某些XCF通信故障的文件***的完整列表,同时在综合体中为其处理管理命令)。
表11
get_fs_list
1.获取用于ready_item数组的存储,其条目与ready_systems列表1-1对应。该数组显示查询过程期间***报告的相应的NS_ITEM,并提出文件***的***视图。
2.对于每个***s,ready_systems列表(包括UNOWNED***),循环:
a.对于相应于***s的散列表的每一行r,循环:
i.循环处理散列行r中的每个文件***F:
1.如果F已经在L中,循环处理下一个文件***。
2.对F初始化ready_item数组,通过遍历每个散列表的行r,在ready_item数组的相应位置(slot)保存相应的NS_ITEM地址(如果存在)。
3.遍历ready_item数组,如果任何***指示存在坏克隆,保证在进行一致性检查时没有考虑该克隆。从ready_item数组中的所有条目移除关于克隆的信息。
4.查找表示文件***所有者的SYSTEM结构,然后查找拥有该文件***的***的ready_systems列表中相应的索引o。这是进入数组的所有者索引。
5.初始化BADFS结构I,其用于表示不一致文件***,如果F确定是不一致的,则将其添加到不一致列表L中。
6.如果F在具有通信故障的文件***列表中,在I中将HAD_XMITFAIL置位。
7.通过遍历ready_item数组递增cache_entry_count,并在结构I中设置cache_entry位掩码。该掩码将包括1比特用于具有对于F的本地安装的每个***。
8.通过遍历ready_item数组确认所有***对于所有者达成一致。如果存在所有者失配,在I中设置OWNER_MISMATCH标志,然后使用GRS帮助确定真正所有者,或确定没有所有者。必要时更新所有者索引o。
9.如果所有者索引o没有表示无主***(从而文件***确实被所有):
a.保证拥有***具有F的本地安装,如果没有,则:
i.更新I
1.设置BAD_OWNER标志
2.递增restart_system_count
3.设置表示restart_system_mask中的所有者的比特
ii.将I添加至L
iii.循环处理下一个文件***(步骤2.a.i)。该不一致仅能通过重新启动所有者而修正。不需要确定对于F的所有不一致。
b.保证拥有***实际认为它们拥有该文件***,如果不是
i.更新I
1.设置BAD_OWNER标志
2.递增restart_system_count
3.设置表示restart_system_mask中的所有者的比特
ii.将I添加至L
iii.循环处理下一个文件***(步骤2.a.i)。该不一致仅能通过重新启动所有者而修正。不需要确定该文件***的所有不一致。
c.如果F安装R/W,所有者***不支持复合***读写安装,保证只有一个***在其本地命名空间中具有针对F的条目,如果不是:
i.更新I
1.设置SYSADMIN_MULTIPLE_FSS标志
2.递增sysadmin_mulitple_FSs_count
3.在sysadmin_mulitple_FSs_mask位掩码中设置表示具有意外安装的***的比特
ii.注意,具有本地安装的客户端***在I中的cache_entry_mask标记,并且标记为ready_item数组中的非空条目。
10.如果文件***仅安装在一个综合体成员上(ready_item数组中仅有一个针对文件***的条目):
a.如果所有者认为任何其他***已经安装(从而所有者在其NS_ITEM中具有非零connected_mask位掩码),在I中设置FS_SINGLE_CONNECTS标志,指示连接不一致。发布消息,指示该所有者认为存在具有本地安装的客户端。
11.如果文件***是无主的
a.确认所有***具有零connected_mask位掩码和零NS_FS_CONNECTED以及NS_BAK_CONNECTED标志。如果这不为真:
i.基于NS_FS_CONNECTED和
NS_BAK_CONNECTED标志,在I中更新以下标志:
1.相应地设置FS_UNOWNED_CONNECTS和/或BAK_UNONWED_CONNECTS标志。
2.递增fs_unowned_connects_count和/或bak_unowned_connects_count
3.在fs_unowned_connects_mask和/或
bak_unowned_connects_mask位掩码中设置表示具有非零连接的***的比特
ii.发布消息指示存在认为具有到无主文件***连接的***。
iii.继续检查不一致
b.确认NS_FS_GROWING标志在所有***中为0。如果这不为真:
i.更新I
1.设置UNOWNED_GROWING标志
2.递增unowned_growing_mismatch_count
3.在I中的unowned_growing_mismatch_mask位掩码中设置比特表示具有扩展标志的***。
ii.发布消息指示存在认为无主文件***在扩展的***。
iii.继续检查不一致。
12.对于每个在其本地命名空间中具有文件F的***(ready_item数组中的F)。(通过修正以快速确定哪个***需要被告知激活文件***或对特定***需要进行什么其他类型的修正,而使用以下掩码。):
a.如果文件***在本***中停顿,则递增/设置I中的quiesce_count/mask
b.如果文件***在本***中缓存,则递增/设置I中的attach_count/mask
c.如果文件***在本***中位任何其他状态,则递增/设置I中的other_count/mask
d.如果本***中NS_FS_GROWING比特置位,则递增/设置I中的growing_count/mask
e.如果本***中NS_FS_HAS_BAK比特没有置位,则递增/设置I中的nobak_count/mask
f.确定它们的misc.attributes和文件***状态相同。对于与所有者不相同的每个***,更新I:
i.如果NS_FS_RW不匹配,设置RW_MISMATCH、rw_mismatch_count/mask
ii.如果NS_FS_HAS_BAK不匹配,设置HASBAK_MISMA_TCH,
hasbak_mismatch_count/mask
iii.如果NS_FS_GROWING不匹配,设置GROWING_MISMATCH、
growing_mismatch_count/mask
iv.如果NS_DYNMOVE不匹配,设置DYNMOVE_MISMATCH、dynmove_mismatch_count/mask
v.如果NS_NODYNMOVE不匹配,设置NODYNMOVE_MISMATCH、nodynmove_mismatch_count/mask
vi.如果NS_MONITOR不匹配,设置MONITOR_MISMATCH、
monitor_mismatch_count/mask
vii.如果NS_GROW不匹配,设置GROW_MISMATCH、grow_mismatch_count/mask
viii.如果NS_NBS不匹配,设置NBS_MISMATCH、nbs_mismatch_count/mask
ix.如果curstate不匹配,设置CURSTATE_MISMATCH,curstate_mismatch_count/mask
x.如果state不匹配,设置FSSTATE_MISMATCH、fsstate_mismatch_count/mask
xi.如果bak_state不匹配,设置BAKSTATE_MISMATCH、bakstate_mismatch_count/mask
xii.如果threshold不匹配,设置THRESHOLD_MISMATCH、threshold_mismatch_count/mask
xiii.如果increment不匹配,设置INCREMENT_MISMATCH、increment_mismatch_count/mask
xiv.如果movepct不匹配,设置MOVEPCT_MISMATCH、movepct_mismatch_count/mask
xv.如果moveint不匹配,设置MOVEINT_MISMATCH、moveint_mismatch_count/mask
xvi.如果movemin不匹配,设置MOVEMIN_MISMATCH、movemin_mismatch_count/mask
xvii.如果fs_tokid不匹配,设置FSTOKID_MISMATCH、fstokid_mismatch_count/mask
xviii.如果bak_tokid不匹配,设置BAKTOKID_MISMATCH、baktokid_mismatch_count/mask
xix.如果fs_id不匹配,设置FSID_MISMATCH、fsid_mismatch_count/mask
xx.如果bak_id不匹配,设置BAKID_MISMATCH、bakid_mismatch_count/mask
g.如果存在失配,发布消息命名与所有者不匹配的第一个***。消息可能包括文件***的名字、拥有***的名字、客户端***的名字以及每个***上的2字节标志域(来自NS_ITEM)或每个***上的不一致状态域。
13.对于不是文件***所有者的每个***:
a.确定所有者是否认为客户端连接到客户端***认为其自身是连接的文件***(或其克隆)。如果所有者和客户端信息不匹配,则在I中设置以下不一致标志,并在I的位掩码中记录攻击(offending)客户端。
i.对于每个NS_FS_CONNECTED和/或NS_BAK_CONNECTED标志复位的客户端***
1.如果所有者的connected_mask位掩码中用于本***的比特为置位
a.更新I中的FS_OWNERCONN_CLIENTNOCONN、fs_ownerconn_clientnoconn_count/mask或BAK_OWNERCONN_CLIENTNOCONN、bak_ownerconn_clientnoconn
ii.对于每个NS_FS_CONNECTED和/或NS_BAK_CONNECTED标志置位的客户端***
1.如果在所有者的connected_mask位掩码中用于本***的比特为复位
a.更新I中的
FS_OWNERNOCONN_CLIENTCONN、fs_ownernoconn_clientconn_count/mask或BAK_OWNERNOCONN_CLIENTCONN、bak_ownernoconn_clientconn
b.发布用于发现的第一个不一致的消息。该消息将指示所有者认为客户端具有安装,但是客户端没有,或特定客户端报告安装,但是所有者不认为其安装在该客户端上。
14.如果I中的标志指示文件***是不一致的,则通过将I添加到链表中而将文件***添加到不一致文件***列表中。否则,从所有的散列表中移除针对文件***F的NS_ITEM,其现在视为一致的。循环(到步骤2.a.i)以处理下一个文件***。
3.释放ready_item数组存储。
4.向调用者返回不一致文件***的列表L。
表12
trim_xmit_failure
1.对L中的每个不一致文件***F进行循环:
a.如果F中的xmit_fail比特置位:
i.确认唯一的不一致为:
1.由于发送UNOWNED、TAKEOVER或CLONE消息的通信问题导致的涉及所有权
2.由于发送CONNECT和DISCONNECT消息的通信问题导致的涉及连接
3.由于发送QUIESCE和UNQUIESCE消息的通信问题导致的涉及停顿
ii.如果存在其他不一致,复位对于F的xmit_fail状态标志。F将不适合使用通信故障算法进行修正。
表13
check_down_systems
1.向所有就绪的综合体成员广播PING消息
2.如果任何***应答失败,返回错误。该例程的调用者,(retrieve_namespace),将重新启动确认。
表14
correct_namespace
1.如果存在由通信故障造成的不一致,首先对它们进行修正。在进行这些修正活动之后,返回调用者并重新启动确认。
a.对于L中具有状态不一致(state inconsistency)以及HAD_XMITFAIL标志置位的每个文件***F(不一致仅由通信故障造成):
i.如果确认者(进行本修正的本地***)报告文件***停顿,则本地激活文件***。
ii.对于报告文件***停顿的每个远程***,发送UNQUIESCE消息。
1.远程接收方将激活该文件***。
iii.如果因为远程***停机或发送UNQUIESCE消息存在通信故障而不能发送消息,返回调用者并启动新的确认。
iv.复位F中的状态不一致(state inconsistency)标志
b.对于L中具有GROWING不一致和HAD_XMITFAIL标志置位的每个文件***F:
i.如果确认者报告GROWING属性置位,则对本地***的命名空间FILESYS结构中的文件***复位GROWING属性。
ii.对于每个报告GROWING属性置位的远程***,发送GROW_STOP消息。
1.←远程接收方将从其本地FILESYS结构中清除其GROWING指示
iii.如果发送GROW_STOP存在通信故障,或者如果远程***停机,返回调用者,并启动新的确认。
iv.复位F中的GROWING_MISMATCH标志。
c.对于L中具有OWNER_MISMATCH不一致和HAD_XMITFAIL标志置位的每个文件***F(没有***应当保持对于文件***的GRS入队)
i.如果确认者相信文件***具有所有者,本地停顿并将文件***移动到无主列表
ii.对于报告所有者的每个远程***,发送TAKEOVERFAIL消息。
1.远程***将停顿文件***并将文件***移动到无主列表。
iii.如果由于通信故障,或因为远程***停机而不能发送消息,则返回调用者并启动新的确认。
d.对于L中具有克隆(HASBAK_MISMATCH)不一致和HAD_XMITFAIL置位的每个文件***F:
i.如果确认者不具有克隆,则为本地***的命名空间中的克隆创建命名空间条目(更新FILESYS)。
ii.对于没有报告克隆的每个远程***,发送CLONE消息。
1.远程接收方将使用表示克隆的FILESYS结构更新其命名空间。
iii.如果由于通信故障,或因为远程***停机而不能发送消息,返回调用者并启动新的确认。
iv.复位F中的HASBAK_MISMATCH标志。
e.对于L中具有连接不一致(connection inconsistency)和HAD_XMITFAIL置位的每个文件***F(所有者报告不连接的***连接):
i.对于每个客户端***,其中相应的connected_mask位掩码为置位,但是客户端NS_FS_CONNECTED和/或
NS_BAK_CONNECTED标志复位,或客户端没有安装(没有NS_ITEM条目)
1.如果确认者为所有者,为不应当具有连接的远程客户端,为本地***上的文件***处理断开。
2.否则像远程所有者发送DISCONNECT,指示哪个***需要从文件***断开。
1.远程接收方将为指定的远程客户端***处理断开。
3.如果因为通信故障或因为远程***停机而不能发送消息,则返回调用者并启动新的确认。
4.复位F中的不同连接不一致标志。
2.如果不存在仅由通信故障造成的不一致,则尝试通过重新启动***来修复文件***。当***重新启动时,一般所有不一致都消除了。将重新启动的***数目限制为:NumRestart=MIN(2,丛成员数目/2)。如果确认***必须重新启动,则其最后重新启动(并且当其重新启动时,其进行确认,保证程序得到继续)。远程启动通过给它们发送ABORT消息而重新启动,这些***将终止然后重新启动zFS。在重新启动***之后(在确认者没有重新启动的情况下),返回调用者(retrieve_namespace)并启动新的确认。
a.制作具有不一致文件***的***列表。位掩码描述不一致以及它们发生的***。例如,对于状态不一致具有位掩码,curstate_mismatch_mask。如果所有者认为文件***停顿,该状态位掩码将具有1比特用于不认为文件***停顿的每个客户端。查看L中的所有文件***的所有位掩码消息如果用于***的任何比特为置位,则将其添加到需要重新启动的***列表中。
b.如果具有不一致文件***的***数目<=NumRestart,则通过向它们发送ABORT消息而重新启动它们,最后重新启动确认者。
c.否则,仅看具有所有权不一致的***,具体地为OWNER_MISMATCH置位的***。如果这些***的数目<=NumRestart,则重新启动它们。
d.否则,重新启动所有不同意针对任何文件***的GRS的拥有***。这些***记录在restart_system_mask中。它们或者没有安装它们应该安装的文件***,或者它们认为不拥有。这些***必须重新启动,所以忽略NumRestart限制。注意,此时,如果没有包括GRS的不一致,则没有***将重新启动。(注意,如果GRS没有用在确定正确所有者的过程中,则该步骤不是必需的,GRS对于算法和本步骤是可选的)。
3.如果不一致不能通过重新启动***而修复,则尝试在文件***的基础上修复不一致。对于列表L中留下的每个不一致文件***F:
a.为每个具有USS的不一致***确认安装状态。最后确认所有者的安装状态。注意,所有者可以是与确认者***相关的远程***。
i.对于认为其具有安装的每个远程***,即,具有对于文件***的NS_ITEM的每个***
1.向该***发送CHECK_MOUNT消息,以保证如果USS没有安装记录,将文件***从远程命名空间中移除。
1.远程接收方将调用USS osi_ctl(getmntstatus)以确定USS是否认为本地文件***已安装。如果不是,则本地***将卸载该文件***(FILESYS),从其命名空间进行所有必要的清理。(注意,osi_ctl只是USS本地缓存;从而其命名空间的查询)。
2.如果因为远程***停机,或者因为通信故障而不能发送消息,则返回调用者,指示确认需要重新启动。
ii.如果确认者认为其具有安装,即,确认者具有对文件***的NS_ITEM
1.通过调用osi_ctl(getmntstatus)来查询USS,以保证USS认为文件***被本地安装。
2.如果USS指示文件***没有本地安装,则从本地命名空间卸载文件***(FILESYS),进行所有必要的清理以保证文件***不再存在于本地命名空间中
iii.如果上述行动导致文件***F从所有综合体成员上的命名空间中移除,则F不再存在于命名空间中,从而从L中移除了F。
b.对于L中仅具有状态不一致的每个文件***F:(CURSTATE_MISMATCH,FSSTATE_MISMATCH,BAKSTATE_MISMATCH)
i.如果确认者报告文件***停顿,本地激活文件***。
ii.对于报告文件***(原始或其克隆)停顿的每个远程***:
1.向***发送UNQUIESCE消息,指示要激活的文件***的名字。
1.远程接收方将激活该文件***。
2.如果由于通信故障或因为远程***停机而不能发送消息,则返回调用之,指示确认需要重新启动
iii.复位F中的CURSTATE_MISMATCH、FSSTATE_MISMATCHBAKSTATE_MISMATCH标志
c.对于停机***一次或多次检查本地SYSTEM结构。如果ready_systems列表中的任何***现在停机,则返回调用者并启动新的确认。
d.对于保留在L中的每个文件***F,尝试通过重装来修复。基本上,前面的三个步骤保证了zFS综合体成员如果其没有本地安装,则在其命名空间中不具有文件***。另外,文件***状态在综合体中是一致的。通过保证USS和zFS命名空间关于F是一致的,卸载然后重装文件***以修正该问题。本文档中之前描述的卸载顺序将向所有综合体成员发送卸载,以保证文件***F不在任何zFS命名空间中。因此后续的安装开始“清除”,并应当保证适合的一致性。在该过程中,文件***及其克隆都必须卸载并重装。
i.如果F停顿,保证综合体中的所有文件***都激活。
1.如果确认者具有对它的安装,本地激活该文件***。
2.对于安装文件***的每个远程***(由不一致文件***列表L中的条目F中的connect位掩码指示):
1.向指示需要激活的文件***的名字的***发送UNQUIESCE消息。
1.远程接收方将激活该文件***。
2.如果因为通信故障,或因为远程***停机而不能发送消息,则返回调用者并启动新的确认。
ii.在综合体范围内广播REMOUNT_START消息,指示正在进行对文件***的重装。当正在进行重装时,拒绝任何安装文件***的手动尝试,以及以该文件***为目标的任何其他命令。从而仅允许正在开始的内部重装。这是为了处理一些用户在修正运行的同时刚好决定卸载或安装文件***或其克隆的情况,用户的安装或卸载尝试被拒绝。
iii.查找能够从其发布重装的***。重装仅能够从具有本地安装的***发布。对确认者给定优选的。
1.放弃综合体串行化。释放sysLock和IOEZNS资源。
2.如果重装必须从远程***发布,则向远程***发送具有需要重装的文件***名字的REMOUNT消息。
1.远程接收方将发布osi_ctl(remountsamemode)以发起对克隆(如果安装)进而原始文件***的重装过程。
3.否则(确认者将发布重装):
1.通过osi_ctl(remountsamemode)调用USS,如果安装了克隆,则重装克隆,然后重装原始文件***。(因为重装的目的是为了保证文件***在将其再次添加到命名空间之前,从命名空间中移除,用于克隆的关联安装将被拒绝直到原始文件***被卸载。这意味着,如果文件***及其克隆都在修正之前安装,则仅原始文件***将在修正之后通过重装而安装。)
4.重新获取综合体串行化:
1.独占地入队IOEZNS资源
2.在写模式锁定sysLock。
4.返回调用者并启动新的确认。本例程的调用者造成释放用于临时散列表和不一致文件***列表L的存储。
表15
system_down
1.锁定sysLock
2.在SYSTEM结构将as_state标志设置为AS_PARTIALLY_DOWN,以指示***停机,对本地***上的该***进行system-down处理。
3.发布消息,示出停机的***的名字。
4.唤醒等待来自XCF的system-down通知的任务。
5.对于之前由停机***所拥有的每个文件***:
a.停顿(或接管)对于该文件***的所有用户活动
b.将文件***移动到无主列表
6.调度任务以继续system-down处理——这将进行接管处理,并激活由本地***所拥有的、由停机的***停顿的文件***(停机***已经发起文件***的备份)。
7.释放sysLock。

Claims (20)

1.一种用于综合体命名空间中的确认的方法,包括:
从综合体的确认者成员向所述综合体的第二成员发送指令,以阻止对综合体命名空间进行改变的操作;
确定所述综合体的所述确认者成员是否与所述综合体的所述第二成员通信,以及所述综合体的成员是否保持当前的综合体状态信息;
响应于确定所述综合体的所述确认者成员在与所述综合体的所述第二成员通信,以及所述综合体的成员保持当前的综合体状态信息,从所述确认者成员向所述第二成员发送指令以向所述确认者成员发送与所述第二成员相关联的第一命名空间属性数据;
确定与所述第二成员相关联的所述第一命名空间属性数据是否与第二命名空间属性数据一致;以及
响应于确定与所述第二成员相关联的所述第一命名空间属性数据与所述第二命名空间属性数据不一致,发送指令以修正所述第一命名空间属性数据。
2.如权利要求1的方法,其中所述方法包括:
响应于确定与所述第二成员相关联的所述第一命名空间属性数据与所述第二命名空间属性数据一致,从所述综合体的所述确认者成员向所述综合体的所述第二成员发送指令,以允许对所述综合体命名空间进行改变的操作。
3.如权利要求1的方法,其中确定与所述第二成员相关联的所述第一命名空间属性数据与所述第二命名空间属性数据是否一致包括:
生成所述第一命名空间属性数据的第一散列表;
生成所述第二命名空间属性数据的第二散列表;以及
比较所述第一散列表与所述第二散列表。
4.如权利要求1的方法,其中所述第一命名空间属性数据包括文件***的就绪状态。
5.如权利要求1的方法,其中所述第一命名空间属性数据包括与文件***相关联的克隆的指示。
6.如权利要求1的方法,其中所述第一命名空间属性数据包括文件***的处理属性。
7.如权利要求1的方法,其中所述方法包括:
确定综合体成员是否与所述综合体失去通信;
响应于确定综合体成员与所述综合体失去通信,确定所述综合体的所述确认者成员是否与所述综合体的所述第二成员通信,以及所述综合体的成员是否保持当前的综合体状态信息;以及
响应于确定所述综合体的所述确认者成员未与所述综合体的所述第二成员通信以及所述综合体的成员未保持当前的综合体状态信息,重新从所述确认者成员向所述第二成员发送所述指令,以向所述确认者成员发送与所述第二成员相关联的所述第一命名空间属性数据。
8.一种用于综合体命名空间中的确认的方法,包括:
接收指令,以修正与综合体的第二成员相关联的、不一致的第一命名空间属性数据;
从确认者成员向所述综合体的所述第二成员发送指令,以向所述确认者成员发送与综合体通信错误相关联的文件***列表;
确定所述不一致的第一命名空间属性数据是否对应于所述综合体通信错误;以及
响应于确定所述第一命名空间属性数据对应于所述综合体通信错误,向所述综合体的所述第二成员发送包括经修正的第一命名空间属性数据的指令。
9.如权利要求8的方法,其中所述方法还包括:
将所述不一致的第一命名空间属性数据替换为所述经修正的第一命名空间属性数据。
10.如权利要求9的方法,其中所述方法包括:
响应于将所述不一致的第一命名空间属性数据替换为所述经修正的第一命名空间属性数据,从所述确认者成员向所述综合体的所述第二成员发送指令,以允许对所述综合体命名空间进行改变的操作。
11.如权利要求8的方法,其中所述方法还包括:
响应于确定所述不一致的第一命名空间属性数据不对应于综合体通信错误,确定具有不一致命名空间的综合体成员的数目是否大于阈值;
响应于确定所述具有不一致命名空间的综合体成员的数目小于所述阈值,关闭所述综合体的所述第二成员;以及
重新启动所述综合体的所述第二成员。
12.如权利要求8的方法,其中所述方法还包括:
响应于确定所述不一致的第一命名空间属性数据不对应于综合体通信错误,确定具有不一致命名空间的综合体成员的数目是否大于阈值;以及
响应于确定所述具有不一致命名空间的综合体成员的数目大于所述阈值,修正所述不一致的第一命名空间属性数据。
13.如权利要求12的方法,其中修正所述不一致的第一命名空间属性数据包括:
发送指令以卸载与所述不一致的第一命名空间属性数据相关联的第一文件***;
发送指令以清除与所述第一文件***相关联的所有数据结构;以及
向所述综合体的所述第二成员发送指令以安装所述第一文件***。
14.如权利要求8的方法,其中所述第一命名空间属性数据包括文件***的就绪状态。
15.如权利要求8的方法,其中所述第一命名空间属性数据包括与文件***相关联的克隆指示。
16.如权利要求8的方法,其中所述第一命名空间属性数据包括文件***的处理属性。
17.如权利要求8的方法,其中所述方法包括:
确定综合体成员是否失去与所述综合体的通信;
响应于确定综合体成员失去与所述综合体的通信,确定所述综合体的确认者成员是否与所述综合体的第二成员通信,以及所述综合体的成员是否保持当前的综合体状态信息;以及
响应于确定所述综合体的确认者成员未与所述综合体的第二成员通信并且所述综合体的成员不保持当前的综合体状态信息,发送指令以修正与综合体的第二成员相关联的、不一致的第一命名空间属性数据。
18.一种用于综合体命名空间中的确认的***,包括:
被配置为从综合体的确认者成员向所述综合体的第二成员发送指令以阻止对综合体命名空间进行改变的操作的装置;
被配置为确定所述综合体的所述确认者成员是否与所述综合体的所述第二成员通信,以及所述综合体的成员是否保持当前的综合体状态信息的装置;
被配置为响应于确定所述综合体的所述确认者成员在与所述综合体的所述第二成员通信以及所述综合体的成员保持当前的综合体状态信息,从所述确认者成员向所述第二成员发送指令以向所述确认者成员发送与所述第二成员相关联的第一命名空间属性数据的装置;
被配置为确定与所述第二成员相关联的所述第一命名空间属性数据是否与第二命名空间属性数据一致的装置;以及
被配置为响应于确定与所述第二成员相关联的所述第一命名空间属性数据与所述第二命名空间属性数据不一致,发送指令以修正所述第一命名空间属性数据的装置。
19.如权利要求18的***,还包括:
被配置为响应于确定与所述第二成员相关联的所述第一命名空间属性数据与所述第二命名空间属性数据一致,从所述综合体的所述确认者成员向所述综合体的所述第二成员发送指令,以允许对所述综合体命名空间进行改变的操作的装置。
20.如权利要求18的***,其中被配置为确定与所述第二成员相关联的所述第一命名空间属性数据与所述第二命名空间属性数据是否一致的装置包括:
被配置为生成所述第一命名空间属性数据的第一散列表的装置;
被配置为生成所述第二命名空间属性数据的第二散列表的装置;以及
被配置为比较所述第一散列表与所述第二散列表的装置。
CN2010100023043A 2009-01-06 2010-01-05 用于分布式命名空间中的确认和修正的方法和*** Expired - Fee Related CN101770513B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US12/349,261 US8195704B2 (en) 2009-01-06 2009-01-06 Validation and correction in a distributed namespace
US12/349,261 2009-01-06

Publications (2)

Publication Number Publication Date
CN101770513A CN101770513A (zh) 2010-07-07
CN101770513B true CN101770513B (zh) 2012-10-03

Family

ID=42312380

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2010100023043A Expired - Fee Related CN101770513B (zh) 2009-01-06 2010-01-05 用于分布式命名空间中的确认和修正的方法和***

Country Status (2)

Country Link
US (1) US8195704B2 (zh)
CN (1) CN101770513B (zh)

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8782635B2 (en) * 2011-01-19 2014-07-15 International Business Machines Corporation Reconfiguration of computer system to allow application installation
US9037901B2 (en) * 2011-08-19 2015-05-19 International Business Machines Corporation Data set autorecovery
US8924644B2 (en) * 2011-12-28 2014-12-30 Lenovo Enterprise Solutions (Singapore) Pte. Ltd. Extending cache in a multi-processor computer
US9852026B2 (en) 2014-08-06 2017-12-26 Commvault Systems, Inc. Efficient application recovery in an information management system based on a pseudo-storage-device driver
US11249858B2 (en) 2014-08-06 2022-02-15 Commvault Systems, Inc. Point-in-time backups of a production application made accessible over fibre channel and/or ISCSI as data sources to a remote application by representing the backups as pseudo-disks operating apart from the production application and its host
US20160124990A1 (en) * 2014-11-05 2016-05-05 Netapp, Inc. System and method for determining occurrences of data corruption in a file system under active use
US10747747B2 (en) * 2014-12-11 2020-08-18 International Business Machines Corporation Interpreting invalid data as valid data
US9471409B2 (en) * 2015-01-24 2016-10-18 International Business Machines Corporation Processing of PDSE extended sharing violations among sysplexes with a shared DASD
US9766825B2 (en) 2015-07-22 2017-09-19 Commvault Systems, Inc. Browse and restore for block-level backups
US10296368B2 (en) 2016-03-09 2019-05-21 Commvault Systems, Inc. Hypervisor-independent block-level live browse for access to backed up virtual machine (VM) data and hypervisor-free file-level recovery (block-level pseudo-mount)
US10740193B2 (en) 2017-02-27 2020-08-11 Commvault Systems, Inc. Hypervisor-independent reference copies of virtual machine payload data based on block-level pseudo-mount
US10664352B2 (en) 2017-06-14 2020-05-26 Commvault Systems, Inc. Live browsing of backed up data residing on cloned disks
US10423505B2 (en) 2017-10-18 2019-09-24 Hewlett Packard Enterprise Development Lp Agents to autonomously detect corruption or failure of network namespaces
US10671370B2 (en) * 2018-05-30 2020-06-02 Red Hat, Inc. Distributing file system states
US10831571B2 (en) 2018-09-27 2020-11-10 International Business Machines Corporation Communicating between systems using a coupling facility list structure
US11921698B2 (en) 2021-04-12 2024-03-05 Torana Inc. System and method for data quality assessment
US11880350B2 (en) 2021-06-08 2024-01-23 International Business Machines Corporation Identifying resource lock ownership across a clustered computing environment

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1168195A2 (en) * 2000-06-23 2002-01-02 NTT DoCoMo, Inc. Information search system
CN101243372A (zh) * 2005-08-19 2008-08-13 国际商业机器公司 互斥地激活微处理器资源以控制最大功率的***和方法

Family Cites Families (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0472861B1 (en) * 1990-08-31 1995-09-20 International Business Machines Corporation Method and apparatus for cross-partition control in a partitioned process environment
US5537574A (en) * 1990-12-14 1996-07-16 International Business Machines Corporation Sysplex shared data coherency method
US5692180A (en) * 1995-01-31 1997-11-25 International Business Machines Corporation Object-oriented cell directory database for a distributed computing environment
US5758339A (en) * 1996-05-31 1998-05-26 International Business Machines Corporation Method of identifying shared and unshared information using system chapters, a sysplex chapter, a table of contents, and a header
US5940841A (en) * 1997-07-11 1999-08-17 International Business Machines Corporation Parallel file system with extended file attributes
US6032216A (en) * 1997-07-11 2000-02-29 International Business Machines Corporation Parallel file system with method using tokens for locking modes
US6647508B2 (en) * 1997-11-04 2003-11-11 Hewlett-Packard Development Company, L.P. Multiprocessor computer architecture with multiple operating system instances and software controlled resource allocation
US6088697A (en) * 1997-12-18 2000-07-11 International Business Machines Corporation Dynamic change management in an extended remote copy operation
US6675175B2 (en) * 1999-02-19 2004-01-06 International Business Machines Corporation Method and system for sharing catalogs in a multiprocessing system utilizing a shared processor
US6339793B1 (en) * 1999-04-06 2002-01-15 International Business Machines Corporation Read/write data sharing of DASD data, including byte file system data, in a cluster of multiple data processing systems
US6408298B1 (en) * 1999-12-15 2002-06-18 Microsoft Corporation Methods and systems for copying and moving across virtual namespaces
US20030126199A1 (en) * 2002-01-02 2003-07-03 Kadri Seemab Aslam Peer-to-peer namespace directory and discovery
US7120704B2 (en) * 2002-01-31 2006-10-10 International Business Machines Corporation Method and system for workload balancing in a network of computer systems
US6947925B2 (en) * 2002-04-15 2005-09-20 International Business Machines Corporation System and method for performing lookups across namespace domains using universal resource locators
US8311980B2 (en) * 2002-12-09 2012-11-13 Hewlett-Packard Development Company, L.P. Namespace consistency for a wide-area file system
US20050091226A1 (en) * 2003-10-23 2005-04-28 Yun Lin Persistent caching directory level support
US7620630B2 (en) * 2003-11-12 2009-11-17 Oliver Lloyd Pty Ltd Directory system
US7496565B2 (en) * 2004-11-30 2009-02-24 Microsoft Corporation Method and system for maintaining namespace consistency with a file system
US7610307B2 (en) * 2004-11-30 2009-10-27 Microsoft Corporation Method and system of detecting file system namespace changes and restoring consistency
US7860908B2 (en) * 2005-10-20 2010-12-28 International Business Machines Corporation Computer method for handling private process state in a stacking file system
US7912195B2 (en) * 2006-06-07 2011-03-22 Comcast Cable Holdings, Llc Method for provisioning subscribers, products, and services in a broadband network
US8010973B2 (en) * 2007-05-31 2011-08-30 Calix, Inc. Class loader for managing a network

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1168195A2 (en) * 2000-06-23 2002-01-02 NTT DoCoMo, Inc. Information search system
CN101243372A (zh) * 2005-08-19 2008-08-13 国际商业机器公司 互斥地激活微处理器资源以控制最大功率的***和方法

Also Published As

Publication number Publication date
US8195704B2 (en) 2012-06-05
CN101770513A (zh) 2010-07-07
US20100174752A1 (en) 2010-07-08

Similar Documents

Publication Publication Date Title
CN101770513B (zh) 用于分布式命名空间中的确认和修正的方法和***
US6256634B1 (en) Method and system for purging tombstones for deleted data items in a replicated database
AU752846B2 (en) Method and apparatus for providing failure detection and recovery with predetermined degree of replication for distributed applications in a network
CN106716360B (zh) 支持多租户应用服务器环境中的补丁修补的***和方法
AU752844B2 (en) Method and apparatus for providing failure detection and recovery with predetermined replication style for distributed applications in a network
CN103036717B (zh) 分布式数据的一致性维护***和方法
US8375363B2 (en) Mechanism to change firmware in a high availability single processor system
CN103297268B (zh) 基于p2p技术的分布式数据一致性维护***和方法
US7194652B2 (en) High availability synchronization architecture
AU2015241457B2 (en) Geographically-distributed file system using coordinated namespace replication
US7188237B2 (en) Reboot manager usable to change firmware in a high availability single processor system
US7516361B2 (en) Method for automatic checkpoint of system and application software
US5740433A (en) Remote duplicate database facility with improved throughput and fault tolerance
CN105830033B (zh) 用于在分布式数据网格中支持持久存储装置版本化和完整性的***和方法
JP2020527264A (ja) 異種ターゲットに対して使用するために分散型データソースからの変更データをキャプチャするためのシステムおよび方法
US20050289414A1 (en) Lossless recovery for computer systems with remotely dependent data recovery
AU2014312103A1 (en) Distributed file system using consensus nodes
US7065673B2 (en) Staged startup after failover or reboot
US8612799B2 (en) Method and apparatus of backing up subversion repository
US7315959B2 (en) Real-time remote backup system and related method
CN101877655A (zh) 网络管理***、网管服务器和方法
CN111917588A (zh) 边缘设备管理方法、装置、边缘网关设备和存储介质
CN113326251B (zh) 数据管理方法、***、设备和存储介质
CN101751292A (zh) Atc***中一种实现多机关键数据一致性功能的方法
WO2007028249A1 (en) Method and apparatus for sequencing transactions globally in a distributed database cluster with collision monitoring

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20121003

Termination date: 20190105

CF01 Termination of patent right due to non-payment of annual fee