diff --git a/bin/swift-drive-audit b/bin/swift-drive-audit index 3d9227ba06..64d1bc5280 100755 --- a/bin/swift-drive-audit +++ b/bin/swift-drive-audit @@ -22,7 +22,8 @@ import subprocess import sys from ConfigParser import ConfigParser -from swift.common.utils import backward, get_logger +from swift.common.utils import backward, get_logger, dump_recon_cache, \ + config_true_value def get_devices(device_dir, logger): @@ -146,6 +147,7 @@ if __name__ == '__main__': device_dir = conf.get('device_dir', '/srv/node') minutes = int(conf.get('minutes', 60)) error_limit = int(conf.get('error_limit', 1)) + recon_cache_path = conf.get('recon_cache_path', "/var/cache/swift") log_file_pattern = conf.get('log_file_pattern', '/var/log/kern.*[!.][!g][!z]') error_re = [] @@ -169,6 +171,9 @@ if __name__ == '__main__': logger.debug("Devices found: %s" % str(devices)) if not devices: logger.error("Error: No devices found!") + recon_errors = {} + for device in devices: + recon_errors[device['mount_point']] = 0 errors = get_errors(error_re, log_file_pattern, minutes) logger.debug("Errors found: %s" % str(errors)) unmounts = 0 @@ -179,12 +184,18 @@ if __name__ == '__main__': if device: mount_point = device[0]['mount_point'] if mount_point.startswith(device_dir): - logger.info("Unmounting %s with %d errors" % - (mount_point, count)) - subprocess.call(['umount', '-fl', mount_point]) - logger.info("Commenting out %s from /etc/fstab" % - (mount_point)) - comment_fstab(mount_point) - unmounts += 1 + if config_true_value(conf.get('unmount_failed_device', + True)): + logger.info("Unmounting %s with %d errors" % + (mount_point, count)) + subprocess.call(['umount', '-fl', mount_point]) + logger.info("Commenting out %s from /etc/fstab" % + (mount_point)) + comment_fstab(mount_point) + unmounts += 1 + recon_errors[mount_point] = count + recon_file = recon_cache_path + "/drive.recon" + dump_recon_cache(recon_errors, recon_file, logger) + if unmounts == 0: logger.info("No drives were unmounted") diff --git a/etc/drive-audit.conf-sample b/etc/drive-audit.conf-sample index 50613ae7e2..bc3cba8fbc 100644 --- a/etc/drive-audit.conf-sample +++ b/etc/drive-audit.conf-sample @@ -8,6 +8,8 @@ # log_max_line_length = 0 # minutes = 60 # error_limit = 1 +# recon_cache_path = /var/cache/swift +# unmount_failed_device = True # # Location of the log file with globbing # pattern to check against device errors.