diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-06-26 20:32:52 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-06-26 20:32:52 +0000 | 
| commit | 08bbd35a80bf7765fe0d3043f9eb5a2f2786b649 (patch) | |
| tree | 80108f0f128657f8623f8f66ad9735b4d88e7b47 /lib/Support/CachePruning.cpp | |
| parent | 7c7aba6e5fef47a01a136be655b0a92cfd7090f6 (diff) | |
Notes
Diffstat (limited to 'lib/Support/CachePruning.cpp')
| -rw-r--r-- | lib/Support/CachePruning.cpp | 55 | 
1 files changed, 43 insertions, 12 deletions
diff --git a/lib/Support/CachePruning.cpp b/lib/Support/CachePruning.cpp index aca123639565..60d0964f2764 100644 --- a/lib/Support/CachePruning.cpp +++ b/lib/Support/CachePruning.cpp @@ -82,7 +82,7 @@ llvm::parseCachePruningPolicy(StringRef PolicyStr) {        if (Value.back() != '%')          return make_error<StringError>("'" + Value + "' must be a percentage",                                         inconvertibleErrorCode()); -      StringRef SizeStr = Value.slice(0, Value.size() - 1); +      StringRef SizeStr = Value.drop_back();        uint64_t Size;        if (SizeStr.getAsInteger(0, Size))          return make_error<StringError>("'" + SizeStr + "' not an integer", @@ -91,7 +91,28 @@ llvm::parseCachePruningPolicy(StringRef PolicyStr) {          return make_error<StringError>("'" + SizeStr +                                             "' must be between 0 and 100",                                         inconvertibleErrorCode()); -      Policy.PercentageOfAvailableSpace = Size; +      Policy.MaxSizePercentageOfAvailableSpace = Size; +    } else if (Key == "cache_size_bytes") { +      uint64_t Mult = 1; +      switch (tolower(Value.back())) { +      case 'k': +        Mult = 1024; +        Value = Value.drop_back(); +        break; +      case 'm': +        Mult = 1024 * 1024; +        Value = Value.drop_back(); +        break; +      case 'g': +        Mult = 1024 * 1024 * 1024; +        Value = Value.drop_back(); +        break; +      } +      uint64_t Size; +      if (Value.getAsInteger(0, Size)) +        return make_error<StringError>("'" + Value + "' not an integer", +                                       inconvertibleErrorCode()); +      Policy.MaxSizeBytes = Size * Mult;      } else {        return make_error<StringError>("Unknown key: '" + Key + "'",                                       inconvertibleErrorCode()); @@ -115,11 +136,12 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) {    if (!isPathDir)      return false; -  Policy.PercentageOfAvailableSpace = -      std::min(Policy.PercentageOfAvailableSpace, 100u); +  Policy.MaxSizePercentageOfAvailableSpace = +      std::min(Policy.MaxSizePercentageOfAvailableSpace, 100u);    if (Policy.Expiration == seconds(0) && -      Policy.PercentageOfAvailableSpace == 0) { +      Policy.MaxSizePercentageOfAvailableSpace == 0 && +      Policy.MaxSizeBytes == 0) {      DEBUG(dbgs() << "No pruning settings set, exit early\n");      // Nothing will be pruned, early exit      return false; @@ -157,7 +179,8 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) {      writeTimestampFile(TimestampFile);    } -  bool ShouldComputeSize = (Policy.PercentageOfAvailableSpace > 0); +  bool ShouldComputeSize = +      (Policy.MaxSizePercentageOfAvailableSpace > 0 || Policy.MaxSizeBytes > 0);    // Keep track of space    std::set<std::pair<uint64_t, std::string>> FileSizes; @@ -216,14 +239,22 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) {      }      sys::fs::space_info SpaceInfo = ErrOrSpaceInfo.get();      auto AvailableSpace = TotalSize + SpaceInfo.free; -    auto FileAndSize = FileSizes.rbegin(); + +    if (Policy.MaxSizePercentageOfAvailableSpace == 0) +      Policy.MaxSizePercentageOfAvailableSpace = 100; +    if (Policy.MaxSizeBytes == 0) +      Policy.MaxSizeBytes = AvailableSpace; +    auto TotalSizeTarget = std::min<uint64_t>( +        AvailableSpace * Policy.MaxSizePercentageOfAvailableSpace / 100ull, +        Policy.MaxSizeBytes); +      DEBUG(dbgs() << "Occupancy: " << ((100 * TotalSize) / AvailableSpace) -                 << "% target is: " << Policy.PercentageOfAvailableSpace -                 << "\n"); +                 << "% target is: " << Policy.MaxSizePercentageOfAvailableSpace +                 << "%, " << Policy.MaxSizeBytes << " bytes\n"); + +    auto FileAndSize = FileSizes.rbegin();      // Remove the oldest accessed files first, till we get below the threshold -    while (((100 * TotalSize) / AvailableSpace) > -               Policy.PercentageOfAvailableSpace && -           FileAndSize != FileSizes.rend()) { +    while (TotalSize > TotalSizeTarget && FileAndSize != FileSizes.rend()) {        // Remove the file.        sys::fs::remove(FileAndSize->second);        // Update size  | 
