diff --git a/llvm/lib/Debuginfod/Debuginfod.cpp b/llvm/lib/Debuginfod/Debuginfod.cpp --- a/llvm/lib/Debuginfod/Debuginfod.cpp +++ b/llvm/lib/Debuginfod/Debuginfod.cpp @@ -251,17 +251,25 @@ // 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 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 --- /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