感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!

如果转载,请保留作者信息。
博客地址:http://blog.csdn.net/gaoxingnengjisuan
邮箱地址:dong.liu@siat.ac.cn

PS:最近没有登录博客,很多朋友的留言没有看见,这里道歉!还有就是本人较少上QQ,可以邮件交流。


概述部分:

账户下数据收割操作的守护进程;
账户收割操作的主要职责就是对于账户下状态标志为deleted的分区数据(容器和对象)实现删除操作;
具体的实现是调用了reap_account、reap_container和reap_object方法,实现递归删除账户下的相关数据;
对于分区的相关副本也要实现删除操作;
这里定义的once=True,说明系统默认调用守护进程类Daemon中的run_once方法;
从而最终实现调用AccountReaper类中的run_once方法;
如果调用的是AccountReaper类中的run_forever方法,则会实现循环实现对账户下状态标志为deleted的数据实现收割操作;

源码解析部分:

下面是这部分代码的主要执行流程,代码中较重要的部分已经进行了相关的注释;

from swift.account.reaper import AccountReaper
from swift.common.utils import parse_options
from swift.common.daemon import run_daemonif __name__ == '__main__':conf_file, options = parse_options(once=True)run_daemon(AccountReaper, conf_file, **options)
def run_once(self, *args, **kwargs):"""进行一次任务收割操作;对已经删除了的账户下的数据对象和容器进行删除操作;"""self.logger.debug(_('Begin devices pass: %s'), self.devices)begin = time()try:# self.devices = conf.get('devices', '/srv/node')# 循环获取/srv/node/目录下的device;# 删除所有遍历的device,实现收割所有device;for device in os.listdir(self.devices):if self.mount_check and not ismount(os.path.join(self.devices, device)):self.logger.increment('errors')self.logger.debug(_('Skipping %s as it is not mounted'), device)continue# 实现收割指定device操作;self.reap_device(device)except (Exception, Timeout):self.logger.exception(_("Exception in top-level account reaper ""loop"))elapsed = time() - beginself.logger.info(_('Devices pass completed: %.02fs'), elapsed)

循环获取/srv/node/目录下的device,调用方法reap_device实现收割指定device的操作;

def reap_device(self, device):"""实现收割device操作;这个方法将扫描设备的accounts目录;找到相应的数据库文件,然后对数据库文件内容进行判断;如果账户被标志为‘DELETE’,调用reap_account实现删除账户下的所有的containers相关数据;"""# self.devices = conf.get('devices', '/srv/node')# datadir = /srv/node/device/accountsdatadir = os.path.join(self.devices, device, DATADIR)if not os.path.exists(datadir):return# 循环获取/srv/node/device/accounts目录下的partition;for partition in os.listdir(datadir):# partition_path = /srv/node/device/accounts/partitionpartition_path = os.path.join(datadir, partition)if not partition.isdigit():continue# 获取一个分区partition所有副本相关的节点nodes;# get_account_ring:获取swift.common.ring.Ring对象,名称为'account';# get_part_nodes:获取一个分区所有副本相关的节点信息;nodes = self.get_account_ring().get_part_nodes(int(partition))if nodes[0]['ip'] not in self.myips or not os.path.isdir(partition_path):continuefor suffix in os.listdir(partition_path):# suffix_path = /srv/node/device/accounts/partition/suffixsuffix_path = os.path.join(partition_path, suffix)if not os.path.isdir(suffix_path):continuefor hsh in os.listdir(suffix_path):# hsh_path = /srv/node/device/accounts/partition/suffix/hshhsh_path = os.path.join(suffix_path, hsh)if not os.path.isdir(hsh_path):continue# 循环遍历hsh_path = /srv/node/device/accounts/partition/suffix/hsh/下所有的文件;# 针对后缀为.db的文件,执行收割操作,即如果其状态标志为‘DELETE’并且broker不为空,则执行删除对应账户数据操作;for fname in sorted(os.listdir(hsh_path), reverse=True):if fname.endswith('.ts'):breakelif fname.endswith('.db'):self.start_time = time()broker = AccountBroker(os.path.join(hsh_path, fname))# 如果broker状态标志为‘DELETE’并且broker不为空,则执行删除操作;# reap_account:删除要删除的account下的所有的containers相关数据;if broker.is_status_deleted() and not broker.empty():self.reap_account(broker, partition, nodes)

1.嵌套循环遍历目录/srv/node/device/accounts/下的所有文件;
2.针对后缀为.db的文件,执行收割操作,即如果其状态标志为‘DELETE’且数据库文件不为空,则调用reap_account方法执行账户下所有容器数据的删除操作;

def reap_account(self, broker, partition, nodes):"""实现收割account操作;删除要删除的account下的所有的containers相关数据;"""begin = time()info = broker.get_info()if time() - float(info['delete_timestamp']) <= self.delay_reaping:return Falseaccount = info['account']self.logger.info(_('Beginning pass on account %s'), account)self.stats_return_codes = {}self.stats_containers_deleted = 0self.stats_objects_deleted = 0self.stats_containers_remaining = 0self.stats_objects_remaining = 0self.stats_containers_possibly_remaining = 0self.stats_objects_possibly_remaining = 0# 删除要删除的account下的所有的containers相关数据;try:marker = ''while True:# 获取要删除的account下的containers排序列表;# 返回列表(name, object_count, bytes_used, 0);containers = list(broker.list_containers_iter(1000, marker, None, None, None))if not containers:breaktry:for (container, _junk, _junk, _junk) in containers:# reap_container:实现删除容器container下数据和容器container本身;# 在一个绿色线程中运行方法reap_container,来实现删除container相关数据;self.container_pool.spawn(self.reap_container,account,partition,nodes,container)self.container_pool.waitall()except (Exception, Timeout):self.logger.exception(_('Exception with containers for account %s'), account)marker = containers[-1][0]if marker == '':breaklog = 'Completed pass on account %s' % accountexcept (Exception, Timeout):self.logger.exception(_('Exception with account %s'), account)log = _('Incomplete pass on account %s') % accountif self.stats_containers_deleted:log += _(', %s containers deleted') % self.stats_containers_deletedif self.stats_objects_deleted:log += _(', %s objects deleted') % self.stats_objects_deletedif self.stats_containers_remaining:log += _(', %s containers remaining') % self.stats_containers_remainingif self.stats_objects_remaining:log += _(', %s objects remaining') % self.stats_objects_remainingif self.stats_containers_possibly_remaining:log += _(', %s containers possibly remaining') % self.stats_containers_possibly_remainingif self.stats_objects_possibly_remaining:log += _(', %s objects possibly remaining') % self.stats_objects_possibly_remainingif self.stats_return_codes:log += _(', return codes: ')for code in sorted(self.stats_return_codes):log += '%s %sxxs, ' % (self.stats_return_codes[code], code)log = log[:-2]log += _(', elapsed: %.02fs') % (time() - begin)self.logger.info(log)self.logger.timing_since('timing', self.start_time)if self.stats_containers_remaining and begin - float(info['delete_timestamp']) >= self.reap_not_done_after:self.logger.warn(_('Account %s has not been reaped since %s') % (account, ctime(float(info['delete_timestamp']))))return True

1.实现获取要删除的account下的container排序列表;
2.循环遍历所有container,针对每一个container,在一个绿色线程中运行方法reap_container来实现删除container的相关数据;

下一篇博客将继续swift-account-reaper的分析工作。

Swift源码分析----swift-account-reaper(1)相关推荐

  1. OpenStack Swift源码安装

    1.安装拓扑 2.准备环境(所有节点) 2.1 由于本次安装选择的Ubuntu Server 12.04,需要安装以下必需软件包: apt-get install build-essential gi ...

  2. Swift源码简单解读-Map与FlatMap

    Swift源码下载地址:GitHub - apple/swift: The Swift Programming Language swift源码里面这四个是比较常见的 docs 听名字也知道是文档(简 ...

  3. 深入理解GO语言:GC原理及源码分析

    Go 中的runtime 类似 Java的虚拟机,它负责管理包括内存分配.垃圾回收.栈处理.goroutine.channel.切片(slice).map 和反射(reflection)等.Go 的可 ...

  4. 技术社区分享|添加FUSD源码分析

    本文由Flow的技术大使FOU编写.他在学习Flow链上稳定币FUSD的过程中总结得出,希望能够给学习FUSD代码的小伙伴一定的启发和帮助.​ 摘要     1. FUSD基础源码分析 2. 重点分析 ...

  5. 《Ceph源码分析》——第1章,第5节RADOS

    本节书摘来自华章出版社<Ceph源码分析>一书中的第1章,第1.5节RADOS,作者常涛,更多章节内容可以访问云栖社区"华章计算机"公众号查看 1.5 RADOS RA ...

  6. Alamofire源码分析

    源码分析 (test工程+源码注释工程)https://www.dropbox.com/sh/v7poaxekotxlaf1/AADQb7NbrrfHXJLrBt1Q51vVa?dl=0 整体的流程图 ...

  7. 开源项目源码分析(Kickstarter-iOS )(一)

    开源项目源码分析(Kickstarter-iOS )(一) 1.Kickstarter开源项目简介 2. Kickstarter项目结构 2.1 Makefile 文件 2.2 Git submodu ...

  8. EOS智能合约:system系统合约源码分析

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. eosio.system 概览 笔者使用的IDE是VScode,首先来看eosio.system的源码结构.如下图所示. ...

  9. Django源码分析8:单元测试test命令浅析

    django源码分析 本文环境python3.5.2,django1.10.x系列 django源码分析-test命令分析 Django项目中提供了,test命令行命令来执行django的单元测试,该 ...

最新文章

  1. Redlock——Redis集群分布式锁
  2. SPOJ problem 42: Adding Reversed Numbers
  3. Apache Kylin权威指南1.3 Apache Kylin的工作原理
  4. mybatis入门(四)----输入映射和输出映射
  5. redis中的五种基本的数据结构
  6. elk 第二篇 , 为elk加入redis, 替换下beats(个人感觉不错2)
  7. HDU ACM Steps攻略 ACM Steps的全部内容
  8. IIS内部错误:500之解决方案
  9. mysql数据库中_截取数据_mysql数据库的字符串截取方法
  10. Qt工作笔记-信号与槽参数匹配问题
  11. 勒索软件损失2年增15倍 2017年可达50亿美元
  12. android中Canvas使用drawBitmap绘制图片
  13. 使用FragmentTabHost+Fragment+viewpager 实现滑动分页
  14. ubuntu-常用命令汇总
  15. 网站限制IP访问应该怎么办
  16. es if语法 script_Elasticsear7.x DSL语法之文档管理
  17. 复制整个文件夹下的文件(无限递归复制子文件夹)
  18. 买木头 (二分)题解
  19. Android主界面退出再次进入略过欢迎面
  20. Multisim应用举例实验

热门文章

  1. 异物卡喉应如何正确诊疗
  2. python xlsxwriter_python模块之XlsxWriter 详解
  3. UVM设计模式 ( 一 ) OOP特性、设计原则、规范与单元测试
  4. SpringBoot 入门---摘抄自【纯洁的微笑】大哥的文章,不胜感激!
  5. Adobe国际认证-寻找食物背后的故事、历史和价值观
  6. 微信客户端打开网页慢或出现“网络出错,轻触屏幕重新加载,错误码:-1005”
  7. 一博科技通过注册:年营收7亿拟募资8亿 汤昌茂等人控制85%股权
  8. 青龙面板 苹果iOS抓包工具
  9. 【第一弹】Python题库刷题---完事开头难,从基础题开始
  10. JS页面刷新的方法总结