gluster源码浅析

gluster的volume是由一系列的translator组成的,translator就像输入输出流的堆栈式结构一样,由一个translator调用另一个translator,每个translator在运行时作为shared-object,根据不同的文件操作调用不同的函数.

每个translator一般需要定义xlator_fops、xlator_cbks、init、fini、volume_options这几个结构体.结构体里是不同的函数指针

比较重要的是xlator_fops这个结构体,在这里,一般要定义规定好的文件操作,文件操作在xlator.h中都有严格的明确定义
比如
fop_readv_t          readv; 
fop_writev_t         writev; 
应该就是对文件内容写入和读出的操作

translator都是采用异步调用和callback的方式,上一个translator异步调用下一个translator的相应的函数,下一个translator完成后调用上一个translator的callback函数.调用和callback主要利用了两个宏,STACK_WIND和STACK_UNWIND

gluster的translator中,一般都能很容易找到文件操作和相应的回调函数,因为命名都很有规律
拿一个简单的rot 13的translator举例说明下

rot-13.c文件中定义了两个文件操作

struct xlator_fops fops = {
	.readv        = rot13_readv,
	.writev       = rot13_writev
};


即文件读取和文件写入操作

在上面可以找到
int32_t
rot13_writev_cbk (call_frame_t *frame,
                  void *cookie,
                  xlator_t *this,
                  int32_t op_ret,
                  int32_t op_errno,
                  struct iatt *prebuf,
		  struct iatt *postbuf, dict_t *xdata)
{
	STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, prebuf, postbuf,
                             xdata);
	return 0;
}

int32_t
rot13_writev (call_frame_t *frame,
              xlator_t *this,
              fd_t *fd,
              struct iovec *vector,
              int32_t count,
              off_t offset, uint32_t flags,
              struct iobref *iobref, dict_t *xdata)
{
	rot_13_private_t *priv = (rot_13_private_t *)this->private;
	if (priv->encrypt_write)
		rot13_iovec (vector, count);

	STACK_WIND (frame,
		    rot13_writev_cbk,
		    FIRST_CHILD (this),
		    FIRST_CHILD (this)->fops->writev,
		    fd, vector, count, offset, flags,
                    iobref, xdata);
	return 0;
}


rot13_writev是文件内容写入的函数指针,rot13_writev_cbk则是对应的callback
看到在rot13_writev函数中,调用宏STACK_WIND的时候,需要制定callback,当下一个translator同样的文件操作完成以后,callback就能被调用.在rot13_writev_cbk中,调用了STACK_UNWIND_STRICT这个宏来调用上层translator的callback.

在gluster源码中的xlators\cluster中的三个translator应该是我们研究的重点,尤其对于分布式文件系统来说,最重要的就是afr,即automatic file replication,自动文件复制.
通过阅读afr的源码可以看出,gluster的副本机制没有采用主从模型,而是所有节点都是主节点.在一次文件写入时,要调用afr的所有subvolume,而且要等待所有subvolume的回调.

推荐几篇好文章
http://hekafs.org/index.php/2011/11/translator-101-class-1-setting-the-stage/
http://hekafs.org/index.php/2011/11/translator-101-lesson-2-init-fini-and-private-context/
http://hekafs.org/index.php/2011/11/translator-101-lesson-3-this-time-for-real/
http://hekafs.org/index.php/2011/11/translator-101-lesson-4-debugging-a-translator/
让你更加深入了解gluster代码结构,还能自己构造translator,用GDB运行时debug gluster

你可能感兴趣的:(gluster)