Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 1 | //=- CachePruning.h - Helper to manage the pruning of a cache dir -*- C++ -*-=// | 
| 2 | // | ||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| 4 | // See https://llvm.org/LICENSE.txt for license information. | ||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| 6 | // | ||
| 7 | //===----------------------------------------------------------------------===// | ||
| 8 | // | ||
| 9 | // This file implements pruning of a directory intended for cache storage, using | ||
| 10 | // various policies. | ||
| 11 | // | ||
| 12 | //===----------------------------------------------------------------------===// | ||
| 13 | |||
| 14 | #ifndef LLVM_SUPPORT_CACHEPRUNING_H | ||
| 15 | #define LLVM_SUPPORT_CACHEPRUNING_H | ||
| 16 | |||
| 17 | #include "llvm/Support/MemoryBuffer.h" | ||
| 18 | #include <chrono> | ||
| 19 | #include <optional> | ||
| 20 | |||
| 21 | namespace llvm { | ||
| 22 | |||
| 23 | template <typename T> class Expected; | ||
| 24 | class StringRef; | ||
| 25 | |||
| 26 | /// Policy for the pruneCache() function. A default constructed | ||
| 27 | /// CachePruningPolicy provides a reasonable default policy. | ||
| 28 | struct CachePruningPolicy { | ||
| 29 |   /// The pruning interval. This is intended to be used to avoid scanning the | ||
| 30 |   /// directory too often. It does not impact the decision of which file to | ||
| 31 |   /// prune. A value of 0 forces the scan to occur. A value of None disables | ||
| 32 |   /// pruning. | ||
| 33 | std::optional<std::chrono::seconds> Interval = std::chrono::seconds(1200); | ||
| 34 | |||
| 35 |   /// The expiration for a file. When a file hasn't been accessed for Expiration | ||
| 36 |   /// seconds, it is removed from the cache. A value of 0 disables the | ||
| 37 |   /// expiration-based pruning. | ||
| 38 | std::chrono::seconds Expiration = std::chrono::hours(7 * 24); // 1w | ||
| 39 | |||
| 40 |   /// The maximum size for the cache directory, in terms of percentage of the | ||
| 41 |   /// available space on the disk. Set to 100 to indicate no limit, 50 to | ||
| 42 |   /// indicate that the cache size will not be left over half the available disk | ||
| 43 |   /// space. A value over 100 will be reduced to 100. A value of 0 disables the | ||
| 44 |   /// percentage size-based pruning. | ||
| 45 | unsigned MaxSizePercentageOfAvailableSpace = 75; | ||
| 46 | |||
| 47 |   /// The maximum size for the cache directory in bytes. A value over the amount | ||
| 48 |   /// of available space on the disk will be reduced to the amount of available | ||
| 49 |   /// space. A value of 0 disables the absolute size-based pruning. | ||
| 50 | uint64_t MaxSizeBytes = 0; | ||
| 51 | |||
| 52 |   /// The maximum number of files in the cache directory. A value of 0 disables | ||
| 53 |   /// the number of files based pruning. | ||
| 54 |   /// | ||
| 55 |   /// This defaults to 1000000 because with that many files there are | ||
| 56 |   /// diminishing returns on the effectiveness of the cache. Some systems have a | ||
| 57 |   /// limit on total number of files, and some also limit the number of files | ||
| 58 |   /// per directory, such as Linux ext4, with the default setting (block size is | ||
| 59 |   /// 4096 and large_dir disabled), there is a per-directory entry limit of | ||
| 60 |   /// 508*510*floor(4096/(40+8))~=20M for average filename length of 40. | ||
| 61 | uint64_t MaxSizeFiles = 1000000; | ||
| 62 | }; | ||
| 63 | |||
| 64 | /// Parse the given string as a cache pruning policy. Defaults are taken from a | ||
| 65 | /// default constructed CachePruningPolicy object. | ||
| 66 | /// For example: "prune_interval=30s:prune_after=24h:cache_size=50%" | ||
| 67 | /// which means a pruning interval of 30 seconds, expiration time of 24 hours | ||
| 68 | /// and maximum cache size of 50% of available disk space. | ||
| 69 | Expected<CachePruningPolicy> parseCachePruningPolicy(StringRef PolicyStr); | ||
| 70 | |||
| 71 | /// Peform pruning using the supplied policy, returns true if pruning | ||
| 72 | /// occurred, i.e. if Policy.Interval was expired. | ||
| 73 | /// | ||
| 74 | /// Check whether cache pruning happens using the supplied policy, adds a | ||
| 75 | /// ThinLTO warning if cache_size_bytes or cache_size_files is too small for the | ||
| 76 | /// current link job. The warning recommends the user to consider adjusting | ||
| 77 | /// --thinlto-cache-policy. | ||
| 78 | /// | ||
| 79 | /// As a safeguard against data loss if the user specifies the wrong directory | ||
| 80 | /// as their cache directory, this function will ignore files not matching the | ||
| 81 | /// pattern "llvmcache-*". | ||
| 82 | bool pruneCache(StringRef Path, CachePruningPolicy Policy, | ||
| 83 | const std::vector<std::unique_ptr<MemoryBuffer>> &Files = {}); | ||
| 84 | } // namespace llvm | ||
| 85 | |||
| 86 | #endif |