Record some simple object stats in the object auditor

Change-Id: I043a80c38091f59ce6707730363a4b43b29ae6ec
This commit is contained in:
David Goetz 2013-07-01 14:58:35 -07:00
parent 4a90414fc7
commit 043bfb77f4
3 changed files with 36 additions and 2 deletions

View File

@ -160,3 +160,8 @@ use = egg:swift#recon
# log_time = 3600
# zero_byte_files_per_second = 50
# recon_cache_path = /var/cache/swift
# Takes a comma separated list of ints. If set, the object auditor will
# increment a counter for every object whose size is <= to the given break
# points and report the result after a full scan.
# object_size_stats =

View File

@ -20,7 +20,7 @@ from eventlet import Timeout
from swift.obj import server as object_server
from swift.common.utils import get_logger, audit_location_generator, \
ratelimit_sleep, config_true_value, dump_recon_cache
ratelimit_sleep, config_true_value, dump_recon_cache, list_from_csv, json
from swift.common.exceptions import AuditException, DiskFileError, \
DiskFileNotExist
from swift.common.daemon import Daemon
@ -56,6 +56,10 @@ class AuditorWorker(object):
self.recon_cache_path = conf.get('recon_cache_path',
'/var/cache/swift')
self.rcache = os.path.join(self.recon_cache_path, "object.recon")
self.stats_sizes = sorted(
[int(s) for s in list_from_csv(conf.get('object_size_stats'))])
self.stats_buckets = dict(
[(s, 0) for s in self.stats_sizes + ['OVER']])
def audit_all_objects(self, mode='once'):
self.logger.info(_('Begin object audit "%s" mode (%s)' %
@ -124,6 +128,26 @@ class AuditorWorker(object):
'frate': self.total_files_processed / elapsed,
'brate': self.total_bytes_processed / elapsed,
'audit': time_auditing, 'audit_rate': time_auditing / elapsed})
if self.stats_sizes:
self.logger.info(
_('Object audit stats: %s') % json.dumps(self.stats_buckets))
def record_stats(self, obj_size):
"""
Based on config's object_size_stats will keep track of how many objects
fall into the specified ranges. For example with the following:
object_size_stats = 10, 100, 1024
and your system has 3 objects of sizes: 5, 20, and 10000 bytes the log
will look like: {"10": 1, "100": 1, "1024": 0, "OVER": 1}
"""
for size in self.stats_sizes:
if obj_size <= size:
self.stats_buckets[size] += 1
break
else:
self.stats_buckets["OVER"] += 1
def object_audit(self, path, device, partition):
"""
@ -154,6 +178,8 @@ class AuditorWorker(object):
raise AuditException(str(e))
except DiskFileNotExist:
return
if self.stats_sizes:
self.record_stats(obj_size)
if self.zero_byte_only_at_fps and obj_size:
self.passes += 1
return

View File

@ -50,7 +50,8 @@ class TestAuditor(unittest.TestCase):
self.conf = dict(
devices=self.devices,
mount_check='false')
mount_check='false',
object_size_stats='10,100,1024,10240')
self.disk_file = DiskFile(self.devices, 'sda', '0', 'a', 'c', 'o',
self.logger)
@ -168,6 +169,8 @@ class TestAuditor(unittest.TestCase):
writer.put(metadata)
self.auditor.audit_all_objects()
self.assertEquals(self.auditor.quarantines, pre_quarantines)
self.assertEquals(self.auditor.stats_buckets[1024], 1)
self.assertEquals(self.auditor.stats_buckets[10240], 0)
def test_object_run_once_no_sda(self):
self.auditor = auditor.AuditorWorker(self.conf, self.logger)