foundry
foundry copied to clipboard
Verbosity Level of 3 or higher makes forked tests 10-30x slower
Component
Forge
Have you ensured that all of these are up to date?
- [X] Foundry
- [X] Foundryup
What version of Foundry are you on?
forge 0.2.0 (293fad7 2024-01-14T00:19:24.272194000Z)
What command(s) is the bug in?
forge test
Operating System
macOS (Apple Silicon)
Describe the bug
When running a forked foundry test (--fork-url and --fork-block-number flags set) the test has a certain runtime, in my situation it's 2-3s total (using time forge ... to measure). However as soon as you set the verbosity level to 3 or higher (-vvv and up) the test takes 15x-30x longer to run, even if no trace is actually shown (because e.g. verbosity level is 3 and the tests are passing).
Note: Adding an etherscan key seems to speed this up considerably, I assume what's happening in the background is it's trying to resolve the name of contracts in the trace and not caching all those calls making it even slower when you're using the public etherscan end-points?
As a note the running is "only" 3-4x slower upon improving the internet connection. Could be a separate issue but --offline doesn't seem to impact the speed at which traces are constructed and rendered
hmm, this is odd.
could you perhaps share the etherscan related settings of forge config? and the logs if you run with RUST_LOG=etherscanidentifier
Experiencing the same issue, really slow when having -vvvv
Also noticed this @Philogy @mattsse.
With RUST_LOG=etherscanidentifier, it spews out a huge amount of logs and hits etherscan rate limits.
2024-03-26T21:53:14.060910Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.060922Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.060926Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.060929Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.060932Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.060974Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.060978Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.060998Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061002Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.061020Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061022Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.061040Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061043Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.061060Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061063Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.061079Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061081Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.061097Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061169Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.061203Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061215Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061225Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061235Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061341Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061965Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.061973Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.061974Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.061976Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.061977Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.061995Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.061996Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062007Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062009Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062019Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062020Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062029Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062072Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062100Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062103Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062122Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062124Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062140Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062143Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062159Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062161Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062177Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062181Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062196Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062199Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062214Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062216Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062231Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062293Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062312Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062314Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062325Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062326Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062337Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062338Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062374Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062376Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062385Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062387Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062397Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062398Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062407Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062408Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062417Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062419Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062428Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062429Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062438Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062439Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062448Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062476Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062489Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062490Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062499Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062500Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062509Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062674Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062695Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062697Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062708Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062709Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062720Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062735Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062749Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062751Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062761Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062762Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062772Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062774Z TRACE etherscanidentifier: fetching info for 0x7109709ecfa91a80626ff3989d68f67f5b1dd12d
2024-03-26T21:53:14.062783Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062792Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062802Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062812Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062868Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x7109709ecfa91a80626ff3989d68f67f5b1dd12d)
2024-03-26T21:53:14.062926Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.062927Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.062929Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.062930Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.062931Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.297823Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x0000000000000000000000000000000000000004)
2024-03-26T21:53:14.297860Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.315506Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x0000000000000000000000000000000000000004)
2024-03-26T21:53:14.315535Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.331855Z WARN etherscanidentifier: could not get etherscan info: ContractCodeNotVerified(0x0000000000000000000000000000000000000004)
2024-03-26T21:53:14.331902Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.344993Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.346393Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.364384Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.365700Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.512320Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.513720Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.528642Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.529894Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.551399Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.552582Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.569005Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.571206Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.589155Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.590349Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.737062Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.738240Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.748508Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.749678Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.766899Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.768106Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.814421Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.815671Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.834284Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.835452Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.949882Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.951055Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.970087Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.971278Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
2024-03-26T21:53:14.997844Z WARN etherscanidentifier: rate limit exceeded on attempt
2024-03-26T21:53:14.999006Z TRACE etherscanidentifier: fetching info for 0x0000000000000000000000000000000000000004
--offline is a temporary workaround
forge-config.txt
Was able to replicate this as well, extreme slowdown for tracing with a verbosity level > -vv
Temporary workaround for local tests was to use the --offline flag suggested by @frontier159 (thanks!) and limit the verbosity on fork and integration tests.
Seems to be indeed related to Etherscan rate limits or excessive calls to Etherscan.
Update:
- https://github.com/foundry-rs/block-explorers/pull/40 fixes a caching issue that caused the excessive refetching as reported. This has an effect on repeated tests against cached values (after initial run).
In review, should be largely fixed soon:
- https://github.com/foundry-rs/foundry/pull/7606 selectively disables Etherscan querying for non-forking tests. This should reduce the time when running against non-cached values (initial run).
Together these two should address the reported issue.
Given no new reports have come in since https://github.com/foundry-rs/block-explorers/pull/40 fixed the cache busting I'll close this as resolved.
It is possible to selective disable Etherscan for non-forking tests but this only has an impact on the first run that populates the cache.