return m.state == m.FullSync ? m.next_step_marker : m.marker;
}
-/// comparison operator for take_min_markers()
-bool operator<(const rgw_data_sync_marker& lhs,
- const rgw_data_sync_marker& rhs)
-{
- // sort by stable marker
- return get_stable_marker(lhs) < get_stable_marker(rhs);
-}
-
/// populate the container starting with 'dest' with the minimum stable marker
/// of each shard for all of the peers in [first, last)
template <typename IterIn, typename IterOut>
if (first == last) {
return;
}
- // initialize markers with the first peer's
- auto m = dest;
- for (auto &shard : first->sync_markers) {
- *m = std::move(shard.second);
- ++m;
- }
- // for remaining peers, replace with smaller markers
- for (auto p = first + 1; p != last; ++p) {
- m = dest;
+ for (auto p = first; p != last; ++p) {
+ auto m = dest;
for (auto &shard : p->sync_markers) {
- if (shard.second < *m) {
- *m = std::move(shard.second);
+ const auto& stable = get_stable_marker(shard.second);
+ if (*m > stable) {
+ *m = stable;
}
++m;
}
const int num_shards;
const std::string& zone_id; //< my zone id
std::vector<rgw_data_sync_status> peer_status; //< sync status for each peer
- std::vector<rgw_data_sync_marker> min_shard_markers; //< min marker per shard
+ std::vector<std::string> min_shard_markers; //< min marker per shard
std::vector<std::string>& last_trim; //< last trimmed marker per shard
int ret{0};
for (int i = 0; i < num_shards; i++) {
const auto& m = min_shard_markers[i];
- auto& stable = get_stable_marker(m);
- if (stable <= last_trim[i]) {
+ if (m <= last_trim[i]) {
continue;
}
ldout(cct, 10) << "trimming log shard " << i
- << " at marker=" << stable
+ << " at marker=" << m
<< " last_trim=" << last_trim[i] << dendl;
using TrimCR = RGWSyncLogTrimCR;
spawn(new TrimCR(store, store->data_log->get_oid(i),
- stable, &last_trim[i]),
+ m, &last_trim[i]),
true);
}
}