[llvm] cd93522 - [Debuginfod] Prune cache after fetch.

Daniel Thornburgh via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 10 12:12:49 PST 2023


Author: Daniel Thornburgh
Date: 2023-03-10T12:12:44-08:00
New Revision: cd935224c02fd65719ae9fd42dc89bf7b599697f

URL: https://github.com/llvm/llvm-project/commit/cd935224c02fd65719ae9fd42dc89bf7b599697f
DIFF: https://github.com/llvm/llvm-project/commit/cd935224c02fd65719ae9fd42dc89bf7b599697f.diff

LOG: [Debuginfod] Prune cache after fetch.

Previously, the size of the debuginfod cache would grow without bound.
This change prunes the cache after a successful debuginfod lookup, as is
done in libdebuginfod.

The cache pruning behavior is configured by a new
DEBUGINFOD_CACHE_POLICY environment variable. The semantics of this are
the same as --thinlto_cache_policy.

Reviewed By: gulfem

Differential Revision: https://reviews.llvm.org/D145618

Added: 
    llvm/test/tools/llvm-debuginfod-find/cache.test

Modified: 
    llvm/lib/Debuginfod/Debuginfod.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Debuginfod/Debuginfod.cpp b/llvm/lib/Debuginfod/Debuginfod.cpp
index 2b0710b536ba..af84fe4176b7 100644
--- a/llvm/lib/Debuginfod/Debuginfod.cpp
+++ b/llvm/lib/Debuginfod/Debuginfod.cpp
@@ -251,17 +251,25 @@ Expected<std::string> getCachedOrDownloadArtifact(
 
     // Perform the HTTP request and if successful, write the response body to
     // the cache.
-    StreamedHTTPResponseHandler Handler(
-        [&]() { return CacheAddStream(Task, ""); }, Client);
-    HTTPRequest Request(ArtifactUrl);
-    Request.Headers = getHeaders();
-    Error Err = Client.perform(Request, Handler);
-    if (Err)
-      return std::move(Err);
+    {
+      StreamedHTTPResponseHandler Handler(
+          [&]() { return CacheAddStream(Task, ""); }, Client);
+      HTTPRequest Request(ArtifactUrl);
+      Request.Headers = getHeaders();
+      Error Err = Client.perform(Request, Handler);
+      if (Err)
+        return std::move(Err);
+
+      unsigned Code = Client.responseCode();
+      if (Code && Code != 200)
+        continue;
+    }
 
-    unsigned Code = Client.responseCode();
-    if (Code && Code != 200)
-      continue;
+    Expected<CachePruningPolicy> PruningPolicyOrErr =
+        parseCachePruningPolicy(std::getenv("DEBUGINFOD_CACHE_POLICY"));
+    if (!PruningPolicyOrErr)
+      return PruningPolicyOrErr.takeError();
+    pruneCache(CacheDirectoryPath, *PruningPolicyOrErr);
 
     // Return the path to the artifact on disk.
     return std::string(AbsCachedArtifactPath);

diff  --git a/llvm/test/tools/llvm-debuginfod-find/cache.test b/llvm/test/tools/llvm-debuginfod-find/cache.test
new file mode 100644
index 000000000000..28359b45220b
--- /dev/null
+++ b/llvm/test/tools/llvm-debuginfod-find/cache.test
@@ -0,0 +1,38 @@
+REQUIRES: curl
+UNSUPPORTED: system-windows
+
+RUN: rm -rf %t/*
+RUN: mkdir -p %t/buildid/012345678901234{5,6}
+RUN: echo 'f' > %t/buildid/0123456789012345/debuginfo
+RUN: cp %t/buildid/012345678901234{5,6}/debuginfo
+RUN: mkdir %t/cache
+RUN: env DEBUGINFOD_CACHE_PATH=%t/cache DEBUGINFOD_URLS=file://%t \
+RUN:   llvm-debuginfod-find --debuginfo 0123456789012345 > /dev/null
+RUN: ls %t/cache | FileCheck --check-prefix=FIRST --match-full-lines --implicit-check-not {{.}} %s
+
+# Set policy to discard all but one file.
+RUN: env DEBUGINFOD_CACHE_POLICY=prune_interval=0s:cache_size_files=1 \
+RUN:     DEBUGINFOD_CACHE_PATH=%t/cache DEBUGINFOD_URLS=file://%t \
+RUN:     llvm-debuginfod-find --debuginfo 0123456789012346 > /dev/null
+RUN: ls %t/cache | FileCheck --check-prefix=SECOND --match-full-lines --implicit-check-not {{.}} %s
+
+# Add the first file back to the cache.
+RUN: env DEBUGINFOD_CACHE_PATH=%t/cache DEBUGINFOD_URLS=file://%t \
+RUN:     llvm-debuginfod-find --debuginfo 0123456789012345 > /dev/null
+RUN: ls %t/cache | FileCheck --check-prefix=BOTH --match-full-lines --implicit-check-not {{.}} %s
+
+# An invalid cache policy has no effect.
+RUN: env DEBUGINFOD_CACHE_POLICY=invalid:prune_interval=0s:cache_size_files=1 \
+RUN:     DEBUGINFOD_CACHE_PATH=%t/cache DEBUGINFOD_URLS=file://%t \
+RUN:     llvm-debuginfod-find --debuginfo 0123456789012346 > /dev/null
+RUN: ls %t/cache | FileCheck --check-prefix=BOTH --match-full-lines --implicit-check-not {{.}} %s
+
+FIRST: llvmcache-6663022027345102449
+FIRST: llvmcache.timestamp
+
+SECOND: llvmcache-6762748755046480574
+SECOND: llvmcache.timestamp
+
+BOTH: llvmcache-6663022027345102449
+BOTH: llvmcache-6762748755046480574
+BOTH: llvmcache.timestamp


        


More information about the llvm-commits mailing list