ceph-common包分析.doc_第1页
ceph-common包分析.doc_第2页
ceph-common包分析.doc_第3页
ceph-common包分析.doc_第4页
ceph-common包分析.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Ceph 中common包分析概述具体分析Arch给出系统架构,i386或x86-64Static const char *get_arch()Armor对字符进行简单的编解码int ceph_armor(char *dst, const char *dst_end, const char *src, const char *end);int ceph_unarmor(char *dst, const char *dst_end, const char *src, const char *end);Assert定义了_ceph_assert_fail和_ceph_assert_warn两个函数,被assert和assert_warn调用。BackTrace封装函数调用栈,backtrace和backtrace_symbols。Buffer一个基类buffer:raw, 主要成员char *data;unsigned len;atomic_t nref;没有copying函数。子类包括raw_malloc: data=(char *)malloc(len);raw_mmap_pages = (char *): mmap (NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE| MAP_ANON, -1, 0)raw_posix_aligned : data= (char *)valloc(len); posix_memalign()raw_hack_aligned: data=new charlen+PAGE_SIZE-1;raw_char: data= new charlen;raw_static:评:定义了buffer的基本类型。ceph_argparse解析参数CephContext ceph上下文,主要是配置相关成员:配置文件_conf; 函数: start_service_thread() reopen_logs() join_service_thread()CephContextServiceThread类继承Thread类,使用sem_t作为锁。Start_service_thread和reopen_logs等对CephContextService的实例进行封装。评:v0.28引入,便于ceph配置,可响应服务结束。Ceph_crypto证书和摘要类 基类Digest,子类 MD5, SHA1, SHA256, HMACSHA1Clock封装clock类,提供now, recent_now等函数Code_environment获取进程名字、环境等Common_init 完成初始化、关闭等工作Cond封装pthread_cond_t, 函数wait, signal等Config所有的配置选项及其解析confUtils定义配置文件类ConfFileDebug定义调试输出流,注意使用了锁pthread_mutex_t _dout_lockDecayCounter定义DecayCounter类DoutStreambuf定义输出流缓冲Entity_name定义实体名称,包括auth, mon, osd, mds, clientFiemap定义了read_fiemap函数,do_import函数调用了,属于rbd范畴Finisher定义了一个线程类成员: Mutex finisher_lock; Cond finisher_cond, finisher_empty_cond, Vector finisher_queue; FinisherThread finisher_thread;函数:queue, start, stop, wait_for_empty,Finisher_thread_entry会遍历执行finisher_queue中元素的finish()函数。评:多线程学习典范Lockdep 定义实现了依赖锁机制,包含5个函数lockdep_register/ will_lock/ locked/ will_unlock/ 没有定义类,主要的全局变量有:thread_mutex_t lockdep_mutex;hash_map lock_ids;map lock_names;hash_mappthread_t, map held;BackTrace *followsMAX_LOCKSMAX_LOCKS;Lockdep_register填充lock_ids和lock_names。does_follow(a,b)判断followsab的有无,或者存在a-c-blockdep_will_lock(name, id) 检查依赖图,是否有回路等lockdep_locked 设置heldpid=new BackTrace(),其中p为当前线程。Lockdep_will_unlock删除heldpid.评:v0.28后引入,还删除了一些其它的锁机制代码,应该是以后锁机制的核心。但是对它的使用还不是很了解。LogClient定义了LogClient,主要属性:Messenger *messenger; MonMap *monmap; MonClient *monc; bool is_mon; Mutex log_lock; version_t last_log_sent; version_t last_log; std:deque log_queue;主要函数有:handle_log_ackdebuginfowarnerrorsecdo_log会发送系统日志和监控日志,前者直接调用syslog,后者会发送一个消息._get_mon_log_message把log_queue中的部分消息封装为MLog,并返回。Handle_log_ack 遍历log_queue,删除已确认的日志.ms_dispatch(Message *m)分发消息,如果是MSG_LOGACK则调用handle_log_ack.LogEntry定义了LogEntryKey、LogEntry和LogSummary三个结构体。struct LogEntryKey entity_inst_t who; utime_t stamp; uint64_t seq;struct LogEntry entity_inst_t who; utime_t stamp; uint64_t seq; clog_type type; string msg;struct LogSummary version_t version; list tail;MemoryModel定义了MemeryModel,主要包括snap结构体 struct snap int peak; int size; int hwm; int rss; int data; int lib; int heap, malloc, mmap; int get_total() return size; int get_rss() return rss; int get_heap() return heap; last;函数主要包括_sample(snap *psnap),分析/proc/self/status/和/proc/self/maps文件,填充psnap中size,rss等数值。Mutex封装锁,和lockdep有很多相似的地方,但是封装了一个Mutex类。评:下一步对比lockdep。Page声明了_page_size, _page_mask, _page_shift三个变量。Pidfile 定义了两个函数:/ 根据当前pid写一个pidfile,会使用配置文件int pidfile_write(const md_config_t *conf);/删除pid文件int pidfile_remove(void);Pidfile_write在实现中调用open,safe_write函数。Pidfile_remove会调用safe_read, close, unlink函数。ProfLogger主要属性:class ProfLogger protected: / my type std:string name, filename; ProfLogType *type; bool need_open; bool need_reset; bool need_close;主要函数包括inc, set, get, fset, finc, favg, reopen, reset, close.实现中最重要的函数是flush_all_loggers: 1)遍历logger_list,调用每个元素的_flush(); 2)生成logger_event并加入到logger_timer中。_flush函数。1)更新wrote_header_last;2)写日志,按行写;3)重置计数。ProfLogType对LogType进行封装,主要属性包括:class ProfLogType protected: int first_key, num_keys; vector key_name; vector inc_keys, avg_keys;;主要函数包括:lookup_key, add_key, add_inc, add_set, add_avg, validate.Run_cmd声明函数run_cmd(const char *cmd, );Run_cmd实现,1)调用fork();2)子进程调用execvp;3)父进程等待,调用waitpid().RWLock对读写锁进行封装。主要属性:class RWLock mutable pthread_rwlock_t L; const char *name; int id;函数有unlock, get_read, try_get_read, put_read, get_write, try_get_write, try_get_write, put_write. 调用pthread_rwlock_*(&L)前后调用了lockdep相关函数。评:lockdep对读写锁的作用?Safe_io声明了safe_read, safe_write, safe_pread, safe_pwrite, safe_read_exact, safe_pread_exact。 对read, write, pread, pwrite进行简单的封装。评:简单的对读写函数的封装。Sctp_crc32定义了一堆crc32加密用的数组。函数主要有:sctp_crc32c_sb8_64_bit();update_crc32();Secret声明了两个函数int read_secret_from_file(*filename, *secret, max_len);int get_secret_option(*secret, *key_name, *secret_option, secret_option_len);Read_secret_from_file只是简单的读取文件。Get_secret_option主要是调用add_secret_to_kernel, add_secret_to_kernel先后调用了ceph_unarmor和add_key.评:首次发现对ceph_unarmor的使用。Semaphore主要成员包括:class Semaphore Mutex m; Cond c; int count;函数主要是Put和Get. M互斥锁用在函数的前后端,Count和cond结合起来实现信号量。Signal对信号量进行封装。typedef void (*signal_handler_t)(int);/void install_sighandler(int signum, signal_handler_t handler, int flags);/处理SIGHUPvoid sighup_handler(int signum);/安装标准的ceph信号处理函数void install_standard_sighandlers(void);/返回调用线程当前被阻塞的信号string signal_mask_to_str();/阻塞一组信号量void block_signals(sigset_t *old_sigset, int *siglist);/恢复被阻塞的信号量,不会恢复无效的阻塞信号void restore_sigset(const sigset_t *old_sigset);/unblock所有的信号void unblock_all_signals(sigset_t *old_sigset);实现中封装了sigemptyset, sigismember, sigdelset, pthread_sigmask等函数。Strtol封装了以下函数:long long strict_strtoll(const char *str, int base, std:string *err);int strict_strtol(const char *str, int base, std:string *err);double strict_strtod(const char *str, std:string *err);float strict_strtof(const char *str, std:string *err);对strtoll, strtod, strtof进行了封装。Str_list对字符串的处理get_next_token();get_str_list();get_str_set();Token的区分字符包括:; , = t等。Thread封装的线程类。主要属性有:class Thread private: pthread_t thread_id;函数有:/返回当前的线程数get_num_threads();create(size_t stacksize=0)join(void *prval=0)Create函数1)可以初始化堆栈大小;2)阻塞信号量;3)调用pthread_create; 4)恢复信号量。Join函数:1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论