| 82 | } |
| 83 | |
| 84 | void ObjectDesc::iterator::adjust_stack() { |
| 85 | while (!stack.empty() && pos >= stack.top().second.next) { |
| 86 | ceph_assert(pos == stack.top().second.next); |
| 87 | size = stack.top().second.size; |
| 88 | current = stack.top().first; |
| 89 | stack.pop(); |
| 90 | } |
| 91 | |
| 92 | if (stack.empty()) { |
| 93 | cur_valid_till = std::numeric_limits<uint64_t>::max(); |
| 94 | } else { |
| 95 | cur_valid_till = stack.top().second.next; |
| 96 | } |
| 97 | |
| 98 | while (current != layers.end() && !current->covers(pos)) { |
| 99 | uint64_t next = current->next(pos); |
| 100 | if (next < cur_valid_till) { |
| 101 | stack.emplace(current, StackState{next, size}); |
| 102 | cur_valid_till = next; |
| 103 | } |
| 104 | |
| 105 | ++current; |
| 106 | } |
| 107 | |
| 108 | if (current == layers.end()) { |
| 109 | size = 0; |
| 110 | } else { |
| 111 | current->iter.seek(pos); |
| 112 | size = std::min(size, current->get_size()); |
| 113 | cur_valid_till = std::min( |
| 114 | current->valid_till(pos), |
| 115 | cur_valid_till); |
| 116 | } |
| 117 | } |
| 118 | |
| 119 | const ContDesc &ObjectDesc::most_recent() { |
| 120 | return layers.begin()->second; |