1 Object-auditor 的启动

Object-auditor的启动和object-replicator的启动过程是一样的,首先是运行启动脚本

  1. swift-init object-auditor start

启动脚本会执行swift源代码bin文件夹下的swift-ojbect-auditor

  1. if __name__ == '__main__':
  2. parser = OptionParser("%prog CONFIG [options]")
  3. parser.add_option('-z', '--zero_byte_fps',
  4. help='Audit only zero byte files at specified files/sec')
  5. parser.add_option('-d', '--devices',
  6. help='Audit only given devices. Comma-separated list')
  7. conf_file, options = parse_options(parser=parser, once=True)
  8. run_daemon(ObjectAuditor, conf_file, **options)

这里是传入的ObjectAuditor类。并且ObjectorAuditor相同继承Daemon类,其的过程和 Replicator类似,以下看Auditor类中runforever方法。其代码为:

  1. def run_forever(self, *args, **kwargs):
  2. """Run the object audit until stopped."""
  3. # zero byte only command line option
  4. zbo_fps = kwargs.get('zero_byte_fps', 0)
  5. parent = False
  6. if zbo_fps:
  7. # only start parent
  8. parent = True
  9. kwargs = {'mode': 'forever'}
  10.  
  11. while True:
  12. try:
  13. #循环审计
  14. self.audit_loop(parent, zbo_fps, **kwargs)
  15. except (Exception, Timeout) as err:
  16. self.logger.exception(_('ERROR auditing: %s' % err))
  17. #每隔30秒运行一次
  18. self._sleep()

while循环在运行完audit_loop方法后会睡眠30秒,让后继续运行。

重点看循环审计方法aduit_loop方法

  1. def audit_loop(self, parent, zbo_fps, override_devices=None, **kwargs):
  2. """Audit loop"""
  3. self.clear_recon_cache('ALL')
  4. self.clear_recon_cache('ZBF')
  5. kwargs['device_dirs'] = override_devices #获得须要重写的设备
  6. #第一次启动 parent 为false
  7. if parent:
  8. kwargs['zero_byte_fps'] = zbo_fps
  9. #执行 run_audit方法
  10. self.run_audit(**kwargs)
  11. else:
  12. pids = []
  13. # self.conf_zero_byte_fps = int(conf.get('zero_byte_files_per_second', 50))
  14. if self.conf_zero_byte_fps:
  15. zbf_pid = self.fork_child(zero_byte_fps=True, **kwargs)
  16. #将子进程增加到pids中
  17. pids.append(zbf_pid)
  18. pids.append(self.fork_child(**kwargs))
  19. #
  20. while pids:
  21. pid = os.wait()[0]
  22. # ZBF scanner must be restarted as soon as it finishes
  23. if self.conf_zero_byte_fps and pid == zbf_pid and \
  24. len(pids) > 1:
  25. kwargs['device_dirs'] = override_devices
  26. zbf_pid = self.fork_child(zero_byte_fps=True, **kwargs)
  27. pids.append(zbf_pid)
  28. pids.remove(pid)

在audit_loop中主要是执行fork_child方法。其返还子进程的pid。以下为fork_child的详细实现

  1. def fork_child(self, zero_byte_fps=False, **kwargs):
  2. """Child execution"""
  3. #返回子进程的进程号
  4. pid = os.fork()
  5. if pid:
  6. return pid
  7. else:
  8. signal.signal(signal.SIGTERM, signal.SIG_DFL)
  9. if zero_byte_fps:
  10. kwargs['zero_byte_fps'] = self.conf_zero_byte_fps
  11. #执行审计
  12. self.run_audit(**kwargs)
  13. sys.exit()

首先是获得子进程的pid,并返回,若果没有此进程pid这须要创建子进程。子进程的创建是是执行run_audit方法。当中run_audit方法的实现代码例如以下:

  1. def run_audit(self, **kwargs):
  2. """Run the object audit"""
  3. mode = kwargs.get('mode')
  4. zero_byte_only_at_fps = kwargs.get('zero_byte_fps', 0)
  5. device_dirs = kwargs.get('device_dirs')
  6.  
  7. worker = AuditorWorker(self.conf, self.logger, self.rcache,
  8. self.devices,
  9. zero_byte_only_at_fps=zero_byte_only_at_fps)
  10. #审计全部的对象
  11. worker.audit_all_objects(mode=mode, device_dirs=device_dirs)

首先是获得mode。此时的mode为 forever然后是获得设备中之前挂载的存储文件的设备。创建AuditorWorker类的实例,并运行audit_all_objects。审计器是不停的扫描当前server存储设备下的全部对象,并将损坏的文件放入隔离区,等待replicate用完善的来替代。

下一篇博客中重点介绍详细运行审计的AuditorWorker类的实现以及对于损坏的文件是怎样创建隔离区的。

因为本人水平有限。文中难免出现理解错误,敬请指正、交流,谢谢!

OpenStack_Swift源代码分析——Object-auditor源代码分析(1)的更多相关文章

  1. 分析 JUnit 框架源代码

    本文转载至http://www.ibm.com/developerworks/cn/java/j-lo-junit-src/ 分析 JUnit 框架源代码 理解 JUnit 测试框架实现原理和设计模式 ...

  2. 【Java收集的源代码分析】Hashtable源代码分析

    Hashtable简单介绍 Hashtable相同是基于哈希表实现的,相同每一个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时.相同会自己主动增长. Has ...

  3. 【Java集合源代码剖析】HashMap源代码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 您好,我正在參加CSDN博文大赛,假设您喜欢我的文章.希望您能帮我投一票.谢 ...

  4. nodejs的Express框架源码分析、工作流程分析

    nodejs的Express框架源码分析.工作流程分析 1.Express的编写流程 2.Express关键api的使用及其作用分析 app.use(middleware); connect pack ...

  5. 一、SDWebImage分析--库处理流程分析

    二.SDWebImage分析--源码具体分析 这阵子看了SDWebImage的实现跟源代码.也看了下网上的一些总结. 这里我自己画了个流程图来辅助理解下SDWebImage这个库的实现流程.相信也是有 ...

  6. SVN-项目 XXX 受源代码管理。向源代码管理注册此项目时出错。建议不要对此项目进行任何修改

    错误描述:  项目 XXX 受源代码管理.向源代码管理注册此项目时出错.建议不要对此项目进行任何修改 解决办法: 使用记事本打开,项目csproj文件删除图中几行,重新打开解决方案就可以了 原因分析: ...

  7. 手机自动化测试:Appium源码分析之跟踪代码分析六

    手机自动化测试:Appium源码分析之跟踪代码分析六   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...

  8. 【Java集合源代码剖析】ArrayList源代码剖析

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/35568011 转载请注明出处:http:// ...

  9. 【Java集合源代码剖析】Hashtable源代码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36191279 Hashtable简单介绍 Hashtable相同是基于哈希表实现的,相同每 ...

  10. 【Java集合源代码剖析】LinkedList源代码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/35787253 您好.我正在參加CSDN博文大赛.假设您喜欢我的文章,希望您能帮我投一票,谢 ...

随机推荐

  1. Servlet基础知识(四)——Servlet过滤器Filter

    一.什么是过滤器: 政府大楼的安检保安,它既能对进入政府大楼的人员进行检查,只允许检查符合要求的进入:同时他也负责对出大楼的人进行检查,看他带出的东西是否符合要求. 同样的,Servlet中的过滤器既 ...

  2. 保存属性至xml并读取

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  3. ZOJ 3209 Treasure Map 精确覆盖

    题目链接 精确覆盖的模板题, 把每一个格子当成一列就可以. S忘记初始化TLE N次, 哭晕在厕所...... #include<bits/stdc++.h> using namespac ...

  4. iOS开发的准备

    一.程序设计语言 上一讲已经说到:要想开发一款软件,首先得学习一些相应的程序设计语言.至于iOS开发,需要学习的语言主要有:C.C++.Objective-C. 二.是否需要计算机专业知识 可能很多人 ...

  5. 《转》使用JAVA如何对图片进行格式检查以及安全检查处理

    本文出自冯立彬的博客,原地址:http://www.fenglibin.com/use_java_to_check_images_type_and_security.html 一.通常情况下,验证一个 ...

  6. mysql null值问题

    mysql> create table test( sn int, -> `createdTime` datetime NOT NULL COMMENT '创建时间', -> `up ...

  7. [PHP] PHP初学者想了解"伪静态",必须看这个贴 [复制链接] [推荐]

    一.何为“伪静态”? 以传智播客bbs论坛为例,这篇帖子的链接地址原本应该是“http://bbs.itcast.cn/forum.php?mod=post&action=newthread& ...

  8. HDU 4464 Browsing History(最大ASCII的和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4464 Problem Description One day when you are going t ...

  9. CD key 生成

    题目描述如下: 某欧软件需要实现简易的CD-KEY算法,输入3个正整数,以空格隔开,根据者3个正整数生成的cd-key字符串.输出格式:xxxx-xxxx-xxxx-xxyy. 包含16个字符,以短划 ...

  10. 使用PHP实现用户登录和注册的功能

    登陆界面 login.php <form action="logincheck.php" method="post"> 用户名:<input ...