Spread C API 简介 - mesadb/mesadb.github.io GitHub Wiki

SP 函数介绍

  • SP connect
include sp.h

 int SP connect( const char * spread name, const char * private name,
 int priority, int group membership, mailbox * mbox,
 char * private group );

SP connect 是一个初始化调用,一个应用必须用Spread daemon建立一个连接。所有其他的Spread调用必须引用一个有效的 mbox 集合(mbox 通过引用传递过来). 参数 spread name 是连接到Spread daemon的名称, 它是如下形式的字符串:

  1. 4803 — 使用 Unix Socket 连接到本地主机的Spread daemon,在/tmp/4803文件夹下. 此形式不能用于连接 Windows95/NT的主机.

  2. 4803@localhost — 通过loopback接口,在本地主机的4803端口上连接Spread daemon. 此形式可以用于连接 Windows95/NT的主机.

  3. [email protected] — 连接到域名“host.domain.edu”和端口4803的主机.

  4. [email protected] — 连接到 IP 地址“x.y.221.99” 和端口4803的主机.

SP connect函数的其他参数介绍如下:

private name 是连接想要对外宣称的名称.此名称在运行 spread daemon 的主机上必须是唯一的.此名称和 group name 有相同的字符限制(可能不会包含 ’#’ 字符).
priority 是一个 0/1 标识符, 判断连接是否是一个 ”Priority” 连接. 当前,这个是没有影响的.
group membership 是一个布尔整数. 如果设置为1, 然后应用将接受group membership消息, 如果设置为0, 然后应用不接受任何的成员关系的变化消息.
mbox 是一个mailbox变量的指针.在 SP 连接调用返回之后,此变量将为连接持有mbox.
private group 将是一个字符指针,足够大能够持有MAX GROUP NAME字符. 在 SP 连接调用返回之后, 它将包含连接的private group 名称. group 名称能够被用于发送单播消息到此连接,同时没有成员能够加入到这个特定的组.

此方法的返回值如下:

返回值 描述
ACCEPT SESSION 成功
ILLEGAL SPREAD 给定的spread name连接由于某种原因是非法的. 经常因为在 Windows95/NT 平台上创建一个 Unix 连接, 或者是一个主机或端口号的错误格式.
COULD NOT CONNECT 允许一个到特定 spread daemon 的底层 socket 调用失败.
CONNECTION CLOSED 在通信过程中, 建立连接发生错误或设置没有完成.
REJECT VERSION daemon 或 library 的版本不匹配.
REJECT NO NAME 没有提供用户的private name.
REJECT ILLEGAL NAME 提供的 name 没有满足某些需求 (长度或使用了非法字符)
REJECT NOT UNIQUE 提供的 name 在 daemon 中并不是唯一的. 推荐使用不同的 name.
  • SP disconnect
#include sp.h

 int SP disconnect( mailbox mbox );

SP disconnect 当应用结束与 spread daemon 的连接时,此函数将被调用. 应用由可能由其他的到 daemon 的连接,也可能在断开连接之后开启一个新的连接.

SP disconnect函数的参数介绍如下:

mbox 参数为你想要断开的连接.

此方法的返回值如下:

NORMAL 成功时,返回0.
ILLEGAL SESSION 当 session 给定的 mbox 不是一个有效连接时,返回.
  • SP join

#include sp.h
int SP join( mailbox mbox , const char * group );

SP join 此方法用于加入一个群组. 如果群组在创建的Spread daemons之中不存在,则重新创建一个, 如果存在,则加入现有的群组.

SP join函数的参数介绍如下:

mbox 参数为加入这个群组的连接.
group 参数为加入群组的名称.

此方法的返回值如下:

NORMAL 成功时,返回0.
ILLEGAL GROUP 给定加入的群组由于某种原因是非法的. 通常是由于length = 0 或 length > MAX GROUP NAME.
ILLEGAL SESSION 通过 mbox 指定的 session 是非法的. 通常是由于 seesion 没有激活.
CONNECTION CLOSED 在通信过程中发生错误. join 不能够被初始化.

*SP leave

#include sp.h
int SP leave( mailbox mbox, const char * group );

SP leave 离开所指定的群组. 如果此群组在 Spread daemons 之中不存在,则此操作会被忽略.

SP leave函数的参数介绍如下:

mbox 代表离开群组的连接.
group 代表所离开的群组.

此方法的返回值如下:

NORMAL 成功时,返回0.
ILLEGAL SSESION .
NORMAL 通过 mbox 指定的 session 是非法的. 通常是由于 seesion 没有激活.
CONNECTION CLOSED 在通信过程中发生错误. join 不能够被初始化.

*SP multicast and family


#include sp.h
int SP multicast(mailbox mbox, service service type, const char * group, int16 mess type, int mess len, const char * mess );
int SP scat multicast( mailbox mbox, service service type, const char * group, int16 mess type, const scatter scat mess );
int SP multigroup multicast(mailbox mbox , service service type, int num groups , const char groups[][MAX GROUP NAME], int16 mess type, int mess len, const char * mess );
int SP multigroup scat multicast(mailbox mbox, service service type, int num groups, const char groups[][MAX GROUP NAME], int16 mess type, const scatter scat mess );

SP multicast 及其变种都能够发送消息到一个或多个群组.消息在特定的连接上发送,同时被标记.服务类型是一个类型域,将被设置为消息所需要的服务类型. 消息的有效标识是:

• UNRELIABLE MESS
• RELIABLE MESS
• FIFO MESS
• CAUSAL MESS
• AGREED MESS
• SAFE MESS

此类型可以是带有其他标识,如SELF DISCARD的 bit ORed. 当前SELF DISCARD 是唯一的额外标识符.

如果SP multicast 或 SP scat multicast 版本正在被使用,而只有一个群组能够被发送. 因此 group string 将包含发送到的group name. 如果一个 multigroup 变种被使用, 然后群组将通过groups integer和group names的列表(消息发送到的所有群组)来指定. 群组名称列表的数量至少要和’num groups’的数量一样多.

Spread system一次只发送一个消息,但这个消息将发给所有的连接,这些连接至少加入了一个列表列出的群组.

消息类型是一个short int (16 bits),可以被应用任意地使用. 目的是它能够被用在不同消息类型的 NAME 上,这样它们是差异化的,不需要进入到消息体. 这个值被接收之前会进行乱序重排矫正.

如果使用 non-scatter 变体, 则一个 single buffer 被传递到多播调用,指定一个 full message 被发送出去. 消息的len field 给粗了消息的字节长度. 而消息域是一个到包含消息的 buffer 的指针. 对于一个 scatter 调用, 所有这些用一个pointer、scat mess来替换 到一个 scatter 结构, 这个结构类似于 iovec. 这个允许消息被发送,不需要支持scatter-gather的系统额外的拷贝开销.

此方法的返回值如下:

NORMAL 发送成功的 byte 数.
ILLEGAL SESSION 给定的mbox到多播是违法的.
ILLEGAL MESSAGE message 由一个违法的结构,例如一个 scatter 并没有正确填充.
CONNECTION CLOSED 在通信过程中,发送消息时出现错误,同时发送不能够完成.

*SP receive and SP scat receive


 #include sp.h
int SP receive( mailbox mbox, service * service type, char sender[MAX GROUP NAME], int max groups, int * num groups, char groups[][MAX GROUP NAME], int16 * mess type, int * endian mismatch, int max mess len, char * mess );

int SP scat receive( mailbox mbox, service * service type, char sender[MAX GROUP NAME], int max groups, int * num groups, char groups[][MAX GROUP NAME], int16 * mess type, int * endian mismatch, scatter * scat mess );

SP receive 在Spread toolkit中主要功能是接收函数. 此函数不仅接收数据消息, 也接收成员关系的消息. 加入群组的连接的消息将达到同一个 mailbox,而SP receive 的调用将获得一个来自于群组的单个消息.在接受完成之后,域的数量将被发送到此值, 关于消息的元信息(群组,消息类型,字节顺序).

此函数在Spread中是最复杂的,因为它是系统唯一的方法,返回信息到应用.很多域的变化依赖于消息是否是一个数据结构或一个成员关系消息.

SP receive 函数如果没有消息达到则被阻塞.mbox 给定哪个连接来接收一个消息. 服务类型是一个到不同服务类型的指针,这个服务将被设置为接收消息的消息类型. 消息类型是一个REG MESSAGE 或者 MEMBERSHIP MESS, 或某种指定的类型.

参数的剩下部分是不同的,依赖于服务的类型. 如果服务类型是 REG MESSAGE (i.e. 数据消息) 然后:

sender 一个到数组列表的指针,至少 MAX GROUP NAME 大小. 这将被设置为发送连接的名称(它的 private group 名称).
max groups 你已经分配空间的最大群组数.在群组中,数组被传递到receive 函数.
num groups 在群组列表中设置为群组数的指针.
groups 数组赋值为max groups 的组名,每个组名是一个MAX GROUP NAME的字符串. 如果数组不是太小,接收此消息的所有组将被列出,当你调用SP receive时,你已经通过在service type域中设置标识符,来选择DROP RECV语意.在这种情况下,尽可能多的合适群组名称将被列出,同时num groups 值将被设置为负数.例如,如果你的群组列表能够保存5个组名称,但是一个7个群组的消息到来,前5个群组名称将出现在群组列表中,同时num groups将被设置为7.
mess type 设置为消息类型域,应用带有原有消息发送,这只是一个short int (16bits).此值在应用接收之前,已经进行了正确排序.
endian mismatch 设置为true(1),如果发送主机的排序与接收主机的顺序不同.否则设置为 false(0).此值域以特定的方式来处理,当特定的错误被返回.
mess 接收的实际消息体,被保存在 buffer 中.
max mess len 消息 buffer 的字节长度. 如果消息较大, buffer 大小以通常的方式来处理.

如果SP_scat_receive函数被使用,而不是SP_receive函数,然后 mess 和 max_mess_len域通过单 scat_mess scatter 结构来替换. scatter将被初始化包含无论什么你想要接受的 buffer 和buffer 的长度.这些 buffers 必须是有效的内存区域.它们将通过receive调用,按照列表的顺序被填充,

如果这是一个MEMB MESSAGE (i.e. 成员消息) ,同时这是一个特殊的 TRANS MESS类型的 membership 消息:

sender 当群组中成员关系发生变化时,设置群组的名称.
max groups 不被使用.
max mess len 不被使用.
num groups 经常被设置为 0.
groups 为空,对于一个过渡的成员关系,没有正常的群组. 相反,使用sender域.
mess type 设置为 -1.
endian mismatch 设置为 0, 当转换没有任何排序问题时.
mess 为空.

因此,你获得唯一信息是 sender 域, 被设置成 group name ,此 group name 接受一个过渡的成员变化消息. TRANS_MEMB_MESS 告诉应用所有的消息在它之后和在REG MEMB MESS 之前将被接收, 这是一个 ’clean up’ 消息将消息置于一个一致状态, 在真正改变成员关系之前. 更多详细介绍请查看相关研究论文.

如果这是一个 MEMB_MESSAGE (i.e. membership message) 和是一个特殊的 REG_MEMB_MESS 类型 membership message:

sender 设置到群组名称,此群组正在发生成员关系变化.
max groups 与正常消息相同.
max mess len 与正常消息相同.
mess type 在群组成员的列表中,被设置为此进程的索引.
endian mismatch 设置为 0 ,带有正常成员关系, 没有排序的问题.
num groups 在成员关系变更之后,设置群组中成员的数量.
groups 包含private group names的排序列表,在成员关系发生变化之后.
mess 包含此群组成员关系的标识符,和所有 private group names的列表,这些进程将从老的成员列表更新为新的成员列表.

data buffer 将包括如下确定长度的域:


*group id;
*int num members;
*char trans members[][MAX GROUP NAME];

群组列表将有成员数量, 每个成员名称都是确定长度的字符. 群组数组的内容依赖于成员关系变化的类型:

*CAUSED BY JOIN: 过渡成员包含加入进程的私有群组.
*CAUSED BY LEAVE: 过渡成员包含离开进程的私有群组.
*CAUSED BY DISCONNECT: 过渡成员包含断开进程的私有群组.
*CAUSED BY NETWORK:过渡成员包含新成员关系的成员群组名.当然所有新的成员都与SP_receive 调用的群组参数来比较.

如果这是一个MEMB MESSAGE ,同时它既不是 REG MEMB MESS 也不是 TRANS MEMB MESS, 它准确地代表这种状态:接收此消息的成员离开群组,同时也是一个通告:当离开发生时,有时被称为”自离开”消息.TRANS MEMB MESS 也绝没有一个CAUSED BY类型,因为它们只服务于通信,直到SAFE 发送和 AGREED 发送 在完全的旧群组成员关系内得到保障.

这个成员离开的群组中的其他成员将接受TRANS MEMB MESS,REG MEMB MESS 消息对儿,来描述以上的成员关系变化.

在自离开的情况下SP_receive 函数域将为如下:

sender 设置群组名称,当成员关系发生变化时.
max groups 与正常的消息相同.
max mess len 与正常的消息相同.
mess type 设置为 0.
endian mismatch 设置为 0.
num groups 设置为 0.
groups 将要为空. 这是因为此进程不再是群组的一部分, 不需要再知道群组的信息.
mess 包含了新成员关系的group id,和留下来的成员 private group name.这个名称常常是接受此消息的连接的private group name.

data buffer 将包括如下确定长度的域:


* group id;
* int num members;
* char trans members[][MAX GROUP NAME];

过渡成员列表将有1个群组名称,包含了离开进程的private group name,这种情况只发生在CAUSED BY LEAVE成员关系变化的情况.

NORMAL 接收成功之后返回一个消息大小.
ILLEGAL SESSION 给定接收的mbox是非法的.
ILLEGAL MESSAGE 消息由一个非法的结构,如一个 scatter 没有正确地填充.
CONNECTION CLOSED 在通信过程中接收消息通信错误,同时接收没有完成.
BUFFER TOO SHORT 消息体 buffer 太短,不能放入接受的消息.
GROUPS TOO SHORT 群组 buffer 太短,不能放入群组列表或者接受的成员列表.
  • SP_equal_group_ids

#include sp.h
int SP equal group ids( group id g1, group id g2 );

SP equal group ids 提供了一种方式在成员关系消息上比较两个group ids. group id 通常被用于作为成员关系视图的标识符,与其他的group ids来进行比较.

⚠️ **GitHub.com Fallback** ⚠️