# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This throttler reduces result size by deleting files permanently."""
import os
import throttler_lib
import utils_lib
# Default threshold of file size in KB for a file to be qualified for deletion.
DEFAULT_FILE_SIZE_THRESHOLD_BYTE = 1024 * 1024
# Regex for file path that should not be deleted.
NON_DELETABLE_FILE_PATH_PATTERNS = [
'.*perf.data$', # Performance test data.
]
def _delete_file(file_info):
"""Delete the given file and update the summary.
@param file_info: A ResultInfo object containing summary for the file to be
shrunk.
"""
utils_lib.LOG('Deleting file %s.' % file_info.path)
try:
os.remove(file_info.path)
except OSError as e:
utils_lib.LOG('Failed to delete file %s Error: %s' %
(file_info.path, e))
# Update the trimmed_size in ResultInfo.
file_info.trimmed_size = 0
def throttle(summary, max_result_size_KB,
file_size_threshold_byte=DEFAULT_FILE_SIZE_THRESHOLD_BYTE,
exclude_file_patterns=[]):
"""Throttle the files in summary by trimming file content.
Stop throttling until all files are processed or the result size is already
reduced to be under the given max_result_size_KB.
@param summary: A ResultInfo object containing result summary.
@param max_result_size_KB: Maximum test result size in KB.
@param file_size_threshold_byte: Threshold of file size in byte for a file
to be qualified for deletion. All qualified files will be deleted,
until all files are processed or the result size is under the given
max_result_size_KB.
@param exclude_file_patterns: A list of regex pattern for files not to be
throttled. Default is an empty list.
"""
file_infos, _ = throttler_lib.sort_result_files(summary)
file_infos = throttler_lib.get_throttleable_files(
file_infos,
exclude_file_patterns + NON_DELETABLE_FILE_PATH_PATTERNS)
for info in file_infos:
if info.trimmed_size > file_size_threshold_byte:
_delete_file(info)
if throttler_lib.check_throttle_limit(summary, max_result_size_KB):
return