Swiftソース分析------swift-container-auditor
友达がこのブログを支持することに感谢して、共に交流を探求することを歓迎して、能力と时间が限られているため、间违ったところは避けられないで、指摘を歓迎します!
転載する場合は、作者情報を保持してください.ブログアドレス:http://blog.csdn.net/gaoxingnengjisuan メールアドレス:[email protected]
PS:最近ブログに登录していないで、多くの友达の伝言は见ていないで、ここは谢ります!また、私はQQに行くことが少なく、メールで交流することができます.
概要:
コンテナ監査デーモンプロセス; 監査の主な職責は、コンテナデータが削除されたかどうかを確認することです(アカウントディレクトリの.dbファイルを解析することによって).ここで定義したonce=Trueは、システムがデーモンクラスDaemonのrun_をデフォルトで呼び出すことを示しています.onceメソッド、run_と言う人がいますonceは主にテストに応用され、これは検証されていない.最終的にContainerAuditorクラスのrun_を呼び出すonceメソッド;ContainerAuditorクラスのrun_を呼び出した場合foreverメソッドでは、指定したコンテナデータが削除されたかどうかを確認するループインプリメンテーションが実現されます.
ソース解析:
1.呼び出し方法audit_location_generatorは、所与のデバイスパス(self.devices,DATADIR=containers)とファイル接尾辞(.db)に基づいて、このデータディレクトリ内の.dbを接尾辞とするすべてのファイルに対してメタグループ(path,device,partition)を生成することを実現する.生成パスの例は、path=/devices/device/containers/partition/asuffix/hsh/****.db device:self.devicesの下の特定のデバイス名です.partition:/devices/device/containers/次の具体的なパーティション名;2.メタグループ(path,device,partition)の各マッチングペアを巡回し、メソッドcontainer_を呼び出すauditは、特定のコンテナを監査し、削除されたかどうかを確認し、削除されていない場合は、アカウントのグローバルデータを取得します.
2に移動して、方法containerを見てみましょう.audit:
この方法の実現は比較的簡単で,ここではさらに解析を行わない.
転載する場合は、作者情報を保持してください.ブログアドレス:http://blog.csdn.net/gaoxingnengjisuan メールアドレス:[email protected]
PS:最近ブログに登录していないで、多くの友达の伝言は见ていないで、ここは谢ります!また、私はQQに行くことが少なく、メールで交流することができます.
概要:
コンテナ監査デーモンプロセス; 監査の主な職責は、コンテナデータが削除されたかどうかを確認することです(アカウントディレクトリの.dbファイルを解析することによって).ここで定義したonce=Trueは、システムがデーモンクラスDaemonのrun_をデフォルトで呼び出すことを示しています.onceメソッド、run_と言う人がいますonceは主にテストに応用され、これは検証されていない.最終的にContainerAuditorクラスのrun_を呼び出すonceメソッド;ContainerAuditorクラスのrun_を呼び出した場合foreverメソッドでは、指定したコンテナデータが削除されたかどうかを確認するループインプリメンテーションが実現されます.
ソース解析:
from swift.container.auditor import ContainerAuditor
from swift.common.utils import parse_options
from swift.common.daemon import run_daemon
if __name__ == '__main__':
conf_file, options = parse_options(once=True)
run_daemon(ContainerAuditor, conf_file, **options)
def run_daemon(klass, conf_file, section_name='', once=False, **kwargs):
"""
, “klass” kwarg;
"""
......
try:
klass(conf).run(once=once, **kwargs)
except KeyboardInterrupt:
logger.info('User quit')
logger.info('Exited')
def run(self, once=False, **kwargs):
"""
Run the daemon
;
run_once, run_forever;
"""
# ;
utils.validate_configuration()
utils.drop_privileges(self.conf.get('user', 'swift'))
# ;
utils.capture_stdio(self.logger, **kwargs)
def kill_children(*args):
signal.signal(signal.SIGTERM, signal.SIG_IGN)
os.killpg(0, signal.SIGTERM)
sys.exit()
signal.signal(signal.SIGTERM, kill_children)
if once:
self.run_once(**kwargs)
else:
self.run_forever(**kwargs)
def run_once(self, *args, **kwargs):
"""
Override this to run the script once
;
"""
raise NotImplementedError('run_once not implemented')
def run_once(self, *args, **kwargs):
"""
container ;
"""
self.logger.info(_('Begin container audit "once" mode'))
begin = reported = time.time()
# ;
self._one_audit_pass(reported)
elapsed = time.time() - begin
self.logger.info(
('Container audit "once" mode completed: %.02fs'), elapsed)
dump_recon_cache({'container_auditor_pass_completed': elapsed},
self.rcache, self.logger)
def _one_audit_pass(self, reported):
"""
container ;
"""
# , .db (path, device, partition);
# audit_location_generator path,device,partition;
all_locs = audit_location_generator(self.devices, DATADIR, '.db',
mount_check=self.mount_check,
logger=self.logger)
for path, device, partition in all_locs:
# container_audit: container db ;
# , , , ;
self.container_audit(path)
if time.time() - reported >= 3600: # once an hour
self.logger.info(_('Since %(time)s: Container audits: %(pass)s passed '
'audit, %(fail)s failed audit'),
{'time': time.ctime(reported),
'pass': self.container_passes,
'fail': self.container_failures})
dump_recon_cache(
{'container_audits_since': reported,
'container_audits_passed': self.container_passes,
'container_audits_failed': self.container_failures},
self.rcache, self.logger)
reported = time.time()
self.container_passes = 0
self.container_failures = 0
self.containers_running_time = ratelimit_sleep(self.containers_running_time, self.max_containers_per_second)
return reported
1.呼び出し方法audit_location_generatorは、所与のデバイスパス(self.devices,DATADIR=containers)とファイル接尾辞(.db)に基づいて、このデータディレクトリ内の.dbを接尾辞とするすべてのファイルに対してメタグループ(path,device,partition)を生成することを実現する.生成パスの例は、path=/devices/device/containers/partition/asuffix/hsh/****.db device:self.devicesの下の特定のデバイス名です.partition:/devices/device/containers/次の具体的なパーティション名;2.メタグループ(path,device,partition)の各マッチングペアを巡回し、メソッドcontainer_を呼び出すauditは、特定のコンテナを監査し、削除されたかどうかを確認し、削除されていない場合は、アカウントのグローバルデータを取得します.
2に移動して、方法containerを見てみましょう.audit:
def container_audit(self, path):
"""
container db ;
, , , ;
"""
start_time = time.time()
try:
# ContainerBroker:container ;
broker = ContainerBroker(path)
# is_deleted: ;
if not broker.is_deleted():
# get_info: container ;
broker.get_info()
self.logger.increment('passes')
self.container_passes += 1
self.logger.debug(_('Audit passed for %s'), broker)
except (Exception, Timeout):
self.logger.increment('failures')
self.container_failures += 1
self.logger.exception(_('ERROR Could not get container info %s'), path)
self.logger.timing_since('timing', start_time)
この方法の実現は比較的簡単で,ここではさらに解析を行わない.