一. BufferStore
BufferStore,它包含两个Store, 笔者这里primaryStore是hdfsFileStore,secondaryStore是stdFileStore。
整个BufferStore工作的时候是一个有限状态自动机,有以下几个状态:
DISCONNECTED, SENDING_BUFFER, STREAMING,
三个状态的含义是主store挂球, 主store恢复并从次store 恢复数据,主store正常工作
有两种事件会可能改变状态
1. handleMessage
if(STREAMING) primaryStore->handleMessage, if fail ,从STREAMING跳到DISCONNECT
if(!STREAMING), secondaryStore->handleMessage(这时候出问题数据丢失)
2. periodCheck(定期检查)
if(DISCONNECTED && ts-lastTs>period) primaryStore->open, if success&&replayBuffer 从STREAMING跳到SENDING_BUFFER, if success&&!replayBuffer,从STREAMING跳到STREAMING, if !success,保持DISCONNECTED
if(SENDING_BUFFER), 将secondaryStore积累的消息flush到primaryStore,如果成功了跳到STREAMING, 如果失败或者报异常跳到DISCONNECTED
changeStore做的事情, 如果前状态是STREAMING, secondaryStore->open
如果后状态是DISCONNECTED, 增加retrytimes,重新设置retryinterval, 如果secondaryStore没open, open
如果后状态是STREAMING, sencondaryStore->close
如果后状态是SENDING_BUFFER, try secondaryStore->open if not
二. 与hadoop-1.0.4工作时候的问题
HdfsFile.cpp 在创建hdfsFileSystem时候使用的是hdfsConnectNewInstance,对每次创建返回一个new的对象,但是hadoop-1.0.4的libhdfs 中没有这个接口
,所以笔者先将其改为hdfsConnect, 但是这样会出现一个问题, 这个connect返回的是一个全局的singleton, 这样第一个categoryA的消息来了建立一次,正常工作,第二个categoryB来了再调用一次,正常工作,但是再来一次第一个categoryA的消息时,其HdfsFile对象的fileSys已经没有了hdfsfilesystem的句柄了(假装自己是c++大牛, 其实就是不work了,不知道是不是它的句柄被释放了),这样问题就来了,处在STREAMING状态,但是写不进去东西,这样就会跳到DISCONNECTED,这样两个category的消息交错进入scribed,两个category的自动机就会不停的跳状态,然后交错使用primary 和 secondary两个store,然后还要将secondary 的数据buffer进primary,这样其实是个不正常的状态
限于笔者屎一般的c++能力,笔者将HdfsFile的fileSys做成了这个类的静态成员变量,所有category的primaryStore 的HdfsFile对象都共用一个hdfsFileSystem,就不贴代码了,
笔者觉得正经的做法是在libhdfs里面仿照 hadoop-0.21添加一个hdfsConnectNewInsance的接口重新生成一个库,供Scribed调用,不过如前文所说限于笔者屎一般的c++能力,还是交给大牛去做吧