My preference would be to add all of these to the existing block cache LRU. The open question then would be whether they are treated like other normal data blocks, or whether we add additional block types. The design of the LRU actually makes it quite easy to add additional types (currently there is single access block, multiple access block, and in-memory block), and there is not much overhead involved. The additional overhead is done in the background eviction thread so doesn't add anything to the put/get methods.
If there was a new block type or two, like "index" and/or "meta", then these would be able to have their own slice of the total block cache pie. The LRU gives each of the different block types their own percentage of the total LRU size. Each is able to grow above it's slice if others are under-utilized, the LRU just guarantees that during an eviction that block type will be given at least the specified slice size.
I think we'll also need to add code to re-fetch block indexes / meta blocks if they are not in the block cache.