I'm running a ~30TB ES cluster on v1.7.5 and we try to make recoveries faster. We have several indices, but only one receives writes at a time. Other are "cold", they only receive reads. They've already been optimized to 1 segment.
We noticed that as expected, recoveries are near instant when the shard has a "sync_id" key and it's identical to the primary shards they're replicated from. So we'd like shards on "cold" indices to be read-only so when they get a "sync_id" and keep it.
In practice very old indices are not requested that much and they keep the same sync_id forever. On more recent indices I see the "sync_id" disappear and the "generation" ID is incremented (as seen with /_stats/commit?level=shards). I guess it's because Lucene (or ES?) does some internal optimizations depending on queries load.
Is there a way to freeze shards with some of the index settings? I tried "index.blocks.metadata=true" but unfortunately it breaks some "cat" APIs (at least /_cat/indices). I also tried "index.blocks.read_only=true" but it's not enough.