1.Class MetaLog:: Entity
一个metalog entity能关联到一个 应用程序,并能被持久化到metalog中。metalog entity对象能在metalog的读写API中传入和传出。
应用程序对象能包含一个继承自该类的成员对象,用于持久化应用程序的专题。应用程序对象也能直接继承该类,这样应用程序对象就可以直接将自己传入到metalog的API了。
2.Class Metalog::Definition
定义一个服务器上一组有效的metalog entity。
Hypertable中的metalog框架能持久化服务器的状态变化。继承自该类的子类定义了一个特定服务器上一组有效的metalog entity。它由名称和create方法构成,名称例如:mml或rsml,metalog框架从被持久化的metalog文件中串行的获取数据,并使用create方法构造得到entity。
3.class RangeSpec
标识一个range,主要标识了range的start row、end row和类型(ROOT、METADATA、SYSTEM、USER、UNKNOWN)。
4.class CommitLogFileInfo
表示一个commit log文件,可能是一个 fragment,也可能是一个transfer log文件。主要成员变量如下:
log_dir:日志路径,与CommitLogBase类的成员变量m_log_dir一般表示同样含义;成
parent:一般用于transfer log的场景,即对象本身为一个transfer log文件,其parent为一个fragment文件;
references:引用数,当对象为其它commit log文件的parent时,该值加1。如果一个commit log文件被清理后,其parent的引用数减1;
purge_dirs:该对象链接的commit log的路径,可在清理该对象时也对这些路径进行清理。
5.class CommitLogBase
commit log基类,包含了commit log的基本信息,表示主要信息的成员变量如下:
m_log_dir:日志路径,例如:/hypertable/tables/2/6/_xfer/PQM6R7RwsZuLfZrl/1394814644 或者/hypertable/ servers/rs29/log/user;
m_log_name:commit log全名,例如:/hypertable/ servers/rs29/log/user/2344;
m_fragment_queue:顺序编号的commit log文件的集合,即CommitLogFileInfo对象指针集合;
m_last_revision:commit log中cell的最新revision;
m_range_reference_required:如果fragment是transfer log的一部分,而后者正被range引用,如果该变量为true,将在commit log清理时只删除fragment,否则transfer log也将被删除。此变量默认为true,可通过配置项Hypertable.RangeServer.CommitLog.FragmentRemoval.RangeReferenceRequired改变此值。
6.class CommitLogReader : public CommitLogBase
读取指定commit log目录下的所有fragment文件,为每个文件创建一个CommitLogFileInfo对象,并将指针对象加入m_fragment_queue。注意:每个文件对象的parent都强制为空。
7.class CommitLog : public CommitLogBase
commit log就是持久化的range的更新数据。它是一个目录,包含了一组按序号递增的文件,每个文件包含了一组被提交的数据块,并且压缩后存储。文件名称从0开始,将会周期性的回滚,即当一个trailer写入到文件结尾时,旧的文件将关闭,新的文件名称将会在旧文件名称上加1,然后被打开。commit log过时的内容会被周期性的清理。每个commit log文件的大小由属性 Hypertable.RangeServer.CommitLog.RollLimit决定。
成员变量m_reap_set表示引用数不为0的fragment或者transfer log文件集合,该集合内的文件将会下轮清理时被考虑。
该对象构造时,需要指定一个基类类型的指针init_log。如果此指针为空,表示commit log的fragment从0开始,即全新的开端。否则将延续init_log中的fragment编号,并将init_log中的fragment加入当前的m_fragment_queue,然后清除init_log中的m_fragment_queue。构造函数最终会创建并打开一个最新的fragment文件,以接收之后的commit log写入。
7.1.成员函数
7.1.1.roll
声明:int roll(CommitLogFileInfo **clfip);
功能:终结当前fragment的写入,并创建和打开下一个fragment对象.创建一个CommitLogFIleInfo对象记录当前fragment的信息,并将其加入到m_fragment_queue中。置标记m_needs_roll为false.
参数:clfip输出参数,记录当前fragment信息的对象指针。
返回值:如果成功返回Error::OK,否则返回其余错误代码。
7.1.2.link_log
声明:int CommitLog::link_log(CommitLogBase *log_base);
功能:将transfer log链接到fragment。
transfer log的基本信息将被编码到一个数据块,然后写入到当前的fragment,再终结当前fragment,即当前的fragment就是transfer log的parent。遍历transfer log的m_fragment_queue,将每个元素加入当前的m_fragment_queue中。如果元素的parent为空,则置其parent为当前fragment,并且fragment的引用数(references)加1.然后清除transfer log的m_fragment_queue,并对当前m_fragment_queue排序。
参数:log_base 需要被链接的transfer log。
7.1.3.purge
声明:int purge(int64_t revision, StringSet &remove_ok_logs, StringSet &removed_logs, String *trace);
功能:清理commit log,移除所有的revision小于给定值的fragment文件。
Commit log文件被移除必须满足三个条件:1)文件的revision小于参数中指定的revision;;2)文件的引用数为0;3)m_range_reference_required 为false或者文件的log_dir被包含在可被安全移除的路径集合以内。将对m_reap_set和m_fragment_queue进行遍历,判断每个元素能否被清除。后者如果发现一个不能被清除的元素,后续元素将不再进行操作。
参数:revision: 给定的revision;remove_ok_logs:能被安全移除的一组log路径; removed_logs:输出参数,本次调用中产生的能被删除的log路径。
7.1.4.load_cumulative_sizse_map
声明:void load_cumulative_size_map( CumulativeSizeMap&cumulative_size_map);
功能:CumulativeSizeMap的key是一个commit log的fragment中的最大的revision,value是一个CumulaltiveFragmentData对象。该对象表示fragment的基本信息和累积信息,共有四个字段:size表示一个fragment的大小;fragno表示fragment编号;cumulative_size表示多个fragment的累积大小;distance表示该元素在map中的反序的次序。即在一个 CumulativeSizeMap中,key越小的元素,其value的distance和cumulative_size越大。
1)将当前最新的fragment添加到cumulative_size_map,key为m_lastest_revision,value中只记录fragment的size和no;
2)反序遍历m_fragment_queue,将其中的每个fragment添加到cumulative_size_map,key为fragment的revision,value中只记录fragment的size和no;
3)反序遍历cumulative_size_map,对每个元素的value的distance从0开始顺序编号,累加每个元素的value的size,并将累积结果赋予当前元素的value的cumulative_size成员。
参数:cumulative_size_map: 统计的得到的 fragment信息。