`
lancelotwjq
  • 浏览: 54782 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

glusterd中的状态机浅析

 
阅读更多

当RPC请求到达Glusterd守护进程后, 它会根据rpcsvc_actor_t gd_svc_cli_actors[] 数组来选择相应的处理函数。


一般函数名为glusterd_handle_XXX


这类函数一般负责从xdr中提取出请求数据,比如卷名,主机名等等。


然后调用glusterd_op_begin 或者其他函数 向请求队列里面注入事件(inject event)。


glusterd有两个状态机(state machine):  friend sm 和 operation sm ,

friend sm负责处理peer之间的事件

operation sm负责处理自身的事件


它们分别通过函数 glusterd_friend_sm ()和 glusterd_op_sm ()启动运行。两个队列 gd_friend_sm_queue和gd_op_sm_queue, 即为两个状态机的消息队列。


下面以glusterd_op_sm为例,介绍下状态机的原理,glusterd_friend_sm与之类似。

 

       
       //循环直到清空消息队列
       while (!list_empty (&gd_op_sm_queue)) {
                //遍历消息队列
                list_for_each_entry_safe (event, tmp, &gd_op_sm_queue, list) {
                        //先从队列中去掉当前要处理的消息
                        list_del_init (&event->list);

                        event_type = event->event;
                        ...
                        //获得当前状态的事件响应列表
                        state = glusterd_op_state_table[opinfo.state.state];
                        //根据事件响应表找到处理函数
                        handler = state[event_type].handler;
                        //执行处理函数
                        ret = handler (event, event->ctx);

                       //处理完毕后,进行状态转移
                       opinfo->state.state = state[event_type].next_state

                        //删除event以及其context
                        glusterd_destroy_op_event_ctx (event);
                        GF_FREE (event);
                }
        }

 

其中,各种状态的事件响应函数表定义在xlators/mgmt/glusterd/src/glusterd-op-sm.c,应该是状态机中比较繁琐的部分,状态如何处理以及转换,都是由这些表定义的。

 

 

 

下面以命令 volume status 为例,介绍状态机执行流程。


当命令请求到达glusterd时候,会触发glusterd_handle_status_volume函数,它将解析请求参数,并将事件GD_OP_EVENT_START_LOCK注入gd_op_sm_queue。

 

然后,friend sm开始运行。我们假设gd_friend_sm_queue为空,那么这个函数就跳过了。

接着,op sm开始运行, 它会从gd_op_sm_queue取出我们刚注入的事件,根据当前的状态和事件类型选择相应的事件处理函数。

初始状态是Default,发送流程如下:


先发start-lock请求,

待所有peer都回复后,开始发送stage op请求, 

待所有peer都回复后,开始brick op请求。

待所有peer都回复后,开始commit op请求。

待所有peer都回复后,开始unlock op请求。

待所有peer都回复后,状态回到default。

 

Transitioning from 'Lock sent' to 'Lock sent' due to event 'GD_OP_EVENT_RCVD_ACC'

Transitioning from 'Lock sent' to 'Stage op sent' due to event 'GD_OP_EVENT_ALL_ACC'
Transitioning from 'Stage op sent' to 'Stage op sent' due to event 'GD_OP_EVENT_RCVD_ACC'

Transitioning from 'Stage op sent' to 'Brick op sent' due to event 'GD_OP_EVENT_STAGE_ACC'

Transitioning from 'Brick op sent' to 'Commit op sent' due to event 'GD_OP_EVENT_ALL_ACK'

Transitioning from 'Commit op sent' to 'Commit op sent' due to event 'GD_OP_EVENT_RCVD_ACC'

Transitioning from 'Commit op sent' to 'Unlock sent' due to event 'GD_OP_EVENT_COMMIT_ACC'
Transitioning from 'Unlock sent' to 'Unlock sent' due to event 'GD_OP_EVENT_RCVD_ACC'
Transitioning from 'Unlock sent' to 'Default' due to event 'GD_OP_EVENT_ALL_ACC'

分享到:
评论

相关推荐

    浅析C# 状态机Stateless

    在上面的示例中,我们首先定义了状态和事件,然后创建了一个状态机,配置了状态机的行为。 Stateless 的特点 Stateless 有很多特点,例如: * 支持各种类型作为状态和触发事件 * 支持状态继承 * 支持状态进入/...

    通用有限状态机(FSM: Finite-state machine)自动代码生成器

    省去开发过程中手写状态机的麻烦。并且功能强大,支持大部分状态机,适用性强。且状态机提供了获取当前事件,获取当前状态,以及获取之前的状态,非常的容易去实现自己的逻辑。资源包包括:代码生成器*1, 配置文件*...

    简单状态机控制步进电机

    在这个项目中,“简单状态机控制步进电机”是利用状态机的设计思想来实现对步进电机的精确控制。状态机是一种用于描述系统行为的模型,它按照预定义的一系列状态进行转换,每个状态对应于特定的操作或行为。 首先,...

    单片机裸奔之状态机浅谈

    状态机在单片机编程中扮演着至关重要的角色,它是一种设计模式,广泛应用于各种编程语言,包括C语言。状态机的核心概念在于通过定义不同状态、条件、动作和次态来组织程序逻辑,使得程序执行更加高效、可读性强且...

    C# 状态机实现

    在编程领域,状态机是一种非常重要的设计模式,它被广泛应用于各种复杂的逻辑控制流程中。在C#中,我们可以利用面向对象的特性来实现状态机,以管理对象在不同状态之间的转换。本篇将深入探讨如何在C#中实现状态机,...

    C语言嵌入式状态机架构(含C源码)

    本资源“C语言嵌入式状态机架构(含C源码)”提供了一个关于如何在C语言环境中构建和应用状态机的详细指南。 首先,让我们深入理解状态机的概念。状态机是一种抽象的计算模型,它由一系列状态以及在这些状态之间...

    四种典型C语言状态机源代码

    通过深入研究这些示例,你不仅能掌握C语言状态机的基本原理,还能了解到如何在实际项目中灵活应用,从而提升你的C语言编程能力。对于后端开发和嵌入式系统的开发人员来说,理解和掌握状态机是十分重要的技能。

    标准状态机_状态机_

    5. 用户界面交互:UI设计中,按钮、菜单等组件的状态变化可以通过状态机管理。 五、状态机的实现方式 1. 代码实现:直接在编程语言中编写状态机的逻辑,如switch语句或if-else结构。 2. 表驱动:用数组或哈希表存储...

    FPGA VHDL 状态机设计讲座(附实例)\状态机设计讲座(附实例).rar

    VHDL中的状态机通常分为同步状态机和异步状态机,同步状态机基于时钟边沿触发状态转换,而异步状态机则不受时钟控制,适用于时序敏感的应用。 VHDL中的状态机设计一般包括以下几个关键部分: 1. **状态定义**:...

    使用vivado软件,状态机方法进行FPGA序列检测

    在本文中,我们将深入探讨如何使用Xilinx的Vivado软件设计一个基于状态机的FPGA序列检测器,特别关注10101序列的检测。首先,让我们了解FPGA、Vivado软件以及状态机的基本概念。 FPGA(Field-Programmable Gate ...

    层次状态机(HSM)用c语言的实现[收集].pdf

    在层次状态机中,状态处理器必须返回朝状态,这导致层次状态处理特征标记的递归定义。为了解决这个问题,定义了两个宏:`QPseudoState`和`QState`,它们都是函数指针,参数是`QEVENT const *pEvent`。`QPseudoState`...

    硬件设计中状态机资料

    状态机在硬件设计中扮演着核心角色,是数字系统中控制逻辑的核心实现方式。它能够有效地管理和转换系统在不同操作阶段的行为,确保系统的有序运行。本文将深入探讨状态机的概念、类型、设计方法以及在实际硬件设计中...

    高效状态机的写法及各自的优缺点

    在类层次结构状态机中,每个状态都作为一个单独的类,继承自一个基础状态类。基础类提供通用行为,而子类覆盖这些行为以实现特定状态的行为。 - **优点**:提供了良好的封装和多态性,每个状态可以拥有自己的数据...

    状态机的使用

    状态机在计算机科学中是一种建模工具,常用于描述系统的行为和状态转换。在TCP/IP协议栈中,状态机被广泛应用于理解网络连接的不同阶段,如TCP连接的三次握手和四次挥手过程。TCP(传输控制协议)是互联网协议的一...

    单片机状态机代码

    状态机在单片机编程中是一种非常重要的设计模式,它被广泛用于控制系统的流程管理和决策逻辑。51单片机,作为最常见的8位单片机之一,常常在教学和小型项目中使用。在这个“单片机状态机代码”中,我们可以深入理解...

    状态机思路在单片机程序设计中的应用

    ### 状态机思路在单片机程序设计中的应用 #### 一、状态机的基本概念及其在单片机程序设计中的重要性 状态机是软件工程领域的一个重要概念,尤其在单片机程序设计中扮演着核心角色。状态机能够帮助程序员以一种...

    嵌入式状态机的学习设计书籍

    嵌入式状态机是软件工程中的一个重要概念,特别是在嵌入式系统开发中,它被广泛应用于控制逻辑的设计和实现。状态机是一种模型,用于描述一个系统或对象在生命周期中的不同状态以及这些状态之间的转换。在嵌入式系统...

    VHDL状态机设计原理

    在VHDL中,状态机通常分为同步状态机和异步状态机,前者依赖于时钟边沿进行状态转换,后者则可能基于任何输入事件。 二、VHDL状态机设计步骤 1. 定义状态:首先,需要定义状态机的所有可能状态,这些状态可以用枚举...

    层次式状态机

    该向导支持在VC++等通用集成开发环境中创建层次状态机,使得开发者能够轻松地构建和维护复杂的状态机模型。 - **支持UML图生成**:允许开发者直观地绘制状态机结构,并自动生成相应的UML图。 - **正向工程**:支持...

Global site tag (gtag.js) - Google Analytics