From 60bea770bd2fa5f96ac3e6b59e7755b7aa4a6747 Mon Sep 17 00:00:00 2001 From: Lucas Moura Date: Fri, 25 Oct 2024 17:19:32 -0300 Subject: [PATCH] docs: add explanation for vulnerability caches --- ...aching_works_for_vulnerability_commands.md | 29 ++++++++++++++++++ dev-docs/explanations/vulnerability-cache.png | Bin 0 -> 45326 bytes 2 files changed, 29 insertions(+) create mode 100644 dev-docs/explanations/how_caching_works_for_vulnerability_commands.md create mode 100644 dev-docs/explanations/vulnerability-cache.png diff --git a/dev-docs/explanations/how_caching_works_for_vulnerability_commands.md b/dev-docs/explanations/how_caching_works_for_vulnerability_commands.md new file mode 100644 index 0000000000..4fa3d118d2 --- /dev/null +++ b/dev-docs/explanations/how_caching_works_for_vulnerability_commands.md @@ -0,0 +1,29 @@ +# How caching works for vulnerability commands + +For the vulnerability commands (both API and CLI commands), we use caching to speed up +the commands on subsequent runs. We cache both our vulnerability JSON data and the +parsed result of that vulnerability data. To support that, we have four distinct caches: + +* **data cache**: This is just raw JSON vulnerability data +* **published data cached**: This caches the publish date of the vulnerability data. + We use it to check if there is new version of the JSON data available +* **result cache**: This is the JSON data created by parsing the JSON vulnerability data in the + system +* **dpkg status cache**: This caches the mtime of **/var/lib/dpkg/status**. We use this cache to + verify if our result cache is stale. The reason is that any APT related changes should invalidate + the result cache. + +Given all that, the following data flow diagram provides a better visualization of the role of those +caches when running a vulnerability API command: + +![](vulnerability-cache.png) + + +## Are there situations when the caches are not produced ? + +There are other scenarios where we don't cache anything when running the commands. +That will happen when the user: + +* Provides a manifest file for the vulnerability commands +* Provides a static vulnerability JSON data for the vulnerability commands + diff --git a/dev-docs/explanations/vulnerability-cache.png b/dev-docs/explanations/vulnerability-cache.png new file mode 100644 index 0000000000000000000000000000000000000000..faffcb852963d7562af1d4877e89d320a5a0cf00 GIT binary patch literal 45326 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