# 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