`
coderplay
  • 浏览: 578008 次
  • 性别: Icon_minigender_1
  • 来自: 广州杭州
社区版块
存档分类
最新评论

epmd源码学习

阅读更多
注: 此处节点是指分布式中分布在各终端的点, 而结点是指存在数据结构中的元素.

各结点组成一个链表

c 代码
 
  1. typedef struct {  
  2.   Node *reg;            /*已注册的结点链表*/  
  3.   Node *unreg;          /*注销的结点链表*/  
  4.   Node *unreg_tail;     /*注销链表尾*/  
  5.   int unreg_count;      /*注销结点个数*/  
  6. } Nodes;  

节点注册过程

1. 先看看注销链表中有没有些结点已经用过, 如果有则复用此结点,但结点的creation要改变, 范围从1到3.
cpp 代码
 
  1. for (node = g->nodes.unreg; node; prev = node, node = node->next)  
  2.     if (strcmp(node->symname, name) == 0)  
  3.     {  
  4.         dbg_tty_printf(g,1,"reusing slot with same name '%s'", node->symname);  
  5.   
  6.         if (prev == NULL)   /* 链表第一个结点就匹配 */  
  7.         {  
  8.             if (node->next == NULL) /* 链表只有一个元素 */  
  9.                 g->nodes.unreg = g->nodes.unreg_tail = NULL;  
  10.             else  
  11.                 g->nodes.unreg = node->next;  
  12.         }  
  13.         else  
  14.         {  
  15.             if (node->next == NULL) /*  链表的最后元素匹配 */  
  16.             {  
  17.                 g->nodes.unreg_tail = prev; /* Point to new last */  
  18.                 prev->next = NULL; /* New last has no next */  
  19.             }  
  20.             else  
  21.                 prev->next = node->next; /* 从链表去除 */  
  22.         }  
  23.   
  24.         g->nodes.unreg_count--; /* 注销结点个数减一 */  
  25.   
  26.         /* 当复用时,我们改变结点的creation值1..3 */ 
  27.         node->creation = node->creation % 3 + 1;  
  28.   
  29.         break;  
  30.     }  


2. 如果没有,看看注销结点链表是否过长.
    如果过长则使用最老的那个注销结点
    否则新建一个结点

cpp 代码
 
  1. if (node == NULL)  
  2. {  
  3.     /* A new name. If the "unreg" list is too long we steal the 
  4.     oldest node structure and use it for the new node, else 
  5.     we allocate a new node structure */  
  6.   
  7.     if ((g->nodes.unreg_count > MAX_UNREG_COUNT) ||  
  8.     (g->debug && (g->nodes.unreg_count > DEBUG_MAX_UNREG_COUNT)))  
  9.     {  
  10.         /* MAX_UNREG_COUNT > 1 so no need to check unreg_tail */  
  11.         node = g->nodes.unreg;  /* Take first == oldest */  
  12.         g->nodes.unreg = node->next; /* Link out */  
  13.         g->nodes.unreg_count--;  
  14.     }  
  15.     else  
  16.     {  
  17.         if ((node = (Node *)malloc(sizeof(Node))) == NULL)  
  18.         {  
  19.             dbg_printf(g,0,"empd: Insufficient memory");  
  20.             exit(1);  
  21.         }  
  22.   
  23.         node->creation = (current_time(g) % 3) + 1; /* "random" 1-3 */  
  24.     }  
  25. }  
分享到:
评论

相关推荐

    epmd:电子预制材料设计

    电子预制材料设计演示这是有关如何使用PreactJS和Material Design创建电子应用程序的博客文章的演示仓库。 在阅读博客文章CLI命令 # install dependenciesnpm install# serve with hot reload at localhost:8080npm ...

    erlang程序设计(第二版)随书源码

    在学习Erlang时,源码是极其宝贵的资源。通过阅读和分析这些代码,我们可以了解Erlang的语法特性,如模式匹配、函数式编程思想、进程通信等核心概念。Erlang的并发模型基于轻量级进程(Lightweight Processes, LPs)...

    epmdpxy:使用 Erlang Port Mapper Deamon 模拟 Netsplits

    EPMDPXY 模拟了 EPMD 的基本功能,足以让本地 Erlang 集群工作。 但有一个例外,它在处理PORT_PLEASE2_REQ时不是回复侦听器端口,而是生成一个内部侦听器并回复新的(随机)端口号。 新生成的侦听器进程接受一个...

    pm2-rabbitmq:RabbitMQ监控模块

    pm2-rabbitmq 用于Keymetrics的RabbitMQ模块描述PM2模块,用于监视关键的RabbitMQ服务器指标:连接/队列/通道/使用者/交换的数量消息总数/就绪消息/未确认消息的总数发布率/投放率要求该模块需要安装RabbitMQ(已...

    erlang-haskell-interface:制作 RPC

    erlang-haskell-interface 最初是从找到的 0.1 tarball 中复制的。 感谢 Eric Sessoms (@...runghc Test将启动一个 haskell erlang 节点,该节点将自身注册到 EPMD 并将响应 Erlang 分发协议定义的“SEND_NAME”

    erlang节点连通测试

    Erlang Port Mapper Daemon (epmd) 是Erlang节点发现和连接的底层服务。每个Erlang节点启动时,都会向epmd注册自己的节点名和端口。确保所有机器上epmd服务运行正常,以便节点间能正确发现彼此。 ### 5. 分布式模块...

    erlang-amqp_dist:基于amqp的erlang分发协议

    在config / sys.config中编辑amqp uris运行:erl -pa _build / default / lib / * / ebin -proto_dist amqp -no_epmd -name -setcookie change_me -config ./config/sys。配置 测试 启动2个或更多节点,2/3秒后在...

    微处理器实验报告1

    此例程中,定时器的计数值被用来控制LED亮度和产生特定事件(例如,每100次中断更新EPMD引脚状态)。同时,检测PE2(down Key)的按下状态,以便触发不同的输出。 实验原理: 1. 启动相关外设的时钟,如TIM3,通过...

    mule-erlang-transport:一个 Mule 传输器,可以向 Erlang 节点发送消息和从 Erlang 节点接收消息

    如果你有一个 Erlang 应用程序已经在运行 Mule 的主机上运行, epmd将已经运行。 否则,您需要手动启动它。 为此,请使用适合您环境的启动命令(例如, )。用法发行版可在 Central 上获得。 快照构建在 Sonatype ...

    offline.zip

    在离线环境下,你需要提前下载适用于CentOS 7.2.1511的Erlang OTP源码包或二进制包。你可以从Erlang Solutions官网获取适合的版本,例如`esl-erlang_20.3-1_centos_linux_x86_64.rpm`。 安装Erlang的命令通常是: ...

    coe-rabbitmq

    RabbitMQ集群集群意味着连接多个系统以形成单个逻辑代理。 由于不同节点中的rabbitmq通过Erlang(以下称为...1.港口4369-由epmd,RabbitMQ节点和CLI工具使用客户端使用的5672、5671-AMQP 0-9-1和1.0端口(根据TLS应用更

    Erlang的高级特性和应用

    节点间的通信高效、安全,通过epmd实现类似DNS的名称解析。OTP(Open Telecom Platform)提供了诸如gen_server这样的行为模式,简化了分布式系统中的位置透明性和容错机制。 **Mnesia 分布数据库** Mnesia 是Erlang...

    RabbitMQ集群 所需的erlang和rabbitmq的rpm包

    4369,用于epmd服务)实现。 4. **RPM包安装**:在Linux系统中,可以使用`yum`或`dnf`命令安装这两个RPM包。例如,对于`yum`,可以运行: ``` sudo yum localinstall erlang-21.3.8.21-1.el7.x86_64.rpm rabbitmq...

    CFP MSA 100G布线和应用.pdf

    文件中提到的Appendix部分可能包含了针对下一代100G EPMD(增强型多模光纤)和CFP2&CFP4在40GE应用方面的一些附加信息,尽管这部分内容在提供的摘要中没有详细说明。 最后,CFP MSA还在研究CFP4作为一种替代25G ...

    谈谈erlang网络环境下的几种数据流转形式(PPT)

    分布式Erlang利用EPMD(Erlang Port Mapper Daemon)服务来发现和连接到其他节点。 5. **TCP/IP协议栈**:在底层,Erlang使用TCP/IP协议栈进行网络通信,确保数据的可靠传输。它提供了一套标准的套接字接口,可以...

    Spring Cloud Ubuntu环境部署的步骤与注意事项

    安装Redis时,从其官网下载最新版本的源码包,解压后移到`/usr/local`目录下,然后在解压后的`bin`目录中启动`redis-server`以运行服务端。同时,还需要启动`redis-client`来测试连接。在更改Redis密码时,可以使用`...

    erlang-deploy:Sqor 如何部署 Erlang 代码

    节点间通过 EPMD(Erlang Port Mapper Daemon)进行发现和连接,实现数据和状态的共享。 8. **错误处理与容错** Erlang 提供了强健的错误处理机制,如进程间异常传播和恢复,以及 crash log 用于定位问题。通过...

    RabbitMq 集群搭建linux

    - **4369 (EPMD)**:用于节点间发现和通信。 - **5672, 5671 (AMQP 0-9-1 and 1.0 without and with TLS)**:标准的AMQP协议端口,分别对应非加密和加密传输。 - **25672**:Erlang分布式的内部通信端口,默认计算...

    inside Erlang VM3

    - **Net_kernel和EPMD**:这两个组件构成了Erlang集群的核心部分,负责节点间的通信和管理。 - **传输层**:Erlang集群支持多种传输方式,如TCP/IP、SSL等。 - **Group Leader**:用于统一管理和协调多个节点之间的...

    RabbitMQ:安装、配置与使用初探

    如果启动时出现 `epmd error for host “demo”: timeout` 错误,需要编辑 `/etc/hosts` 文件,添加主机名记录: ```bash echo "127.0.0.1 demo" >> /etc/hosts ``` #### 二、配置 ##### 2.1 创建用户 默认情况...

Global site tag (gtag.js) - Google Analytics