| 72 | } |
| 73 | |
| 74 | int minimum_to_decode(const shard_id_set &want_to_read, const shard_id_set &available, |
| 75 | shard_id_set &minimum_set, |
| 76 | shard_id_map<std::vector<std::pair<int, int>>> *minimum_sub_chunks) override { |
| 77 | bool recover = false; |
| 78 | for (shard_id_t shard : want_to_read) { |
| 79 | if (available.contains(shard)) { |
| 80 | minimum_set.insert(shard); |
| 81 | } else { |
| 82 | recover = true; |
| 83 | break; |
| 84 | } |
| 85 | } |
| 86 | |
| 87 | if (recover) { |
| 88 | minimum_set.clear(); |
| 89 | |
| 90 | // Shard is missing. Collect data_chunk_count shards from available |
| 91 | // shards for recovery. |
| 92 | for (auto a : available) { |
| 93 | minimum_set.insert(a); |
| 94 | if (std::cmp_equal(minimum_set.size(), data_chunk_count)) { |
| 95 | break; |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | if (std::cmp_not_equal(minimum_set.size(), data_chunk_count)) { |
| 100 | minimum_set.clear(); |
| 101 | return -EIO; // Cannot recover. |
| 102 | } |
| 103 | } |
| 104 | |
| 105 | if (minimum_sub_chunks) { |
| 106 | for (auto &&shard : minimum_set) { |
| 107 | minimum_sub_chunks->emplace(shard, default_sub_chunk); |
| 108 | } |
| 109 | } |
| 110 | return 0; |
| 111 | } |
| 112 | |
| 113 | [[deprecated]] |
| 114 | int minimum_to_decode(const std::set<int> &want_to_read, |