Hi, everyone. When I read the source code of PG::calc_replicated_acting method, I found the following code really confusing: // select replicas that have log contiguity with primary. // prefer up, then acting, then any peer_info osds for (vector<int>::const_iterator i = up.begin(); i != up.end(); ++i) { pg_shard_t up_cand = pg_shard_t(*i, shard_id_t::NO_SHARD); if (up_cand == primary->first) continue; const pg_info_t &cur_info = all_info.find(up_cand)->second; if (cur_info.is_incomplete() || cur_info.last_update < MIN( primary->second.log_tail, auth_log_shard->second.log_tail)) { /* We include auth_log_shard->second.log_tail because in GetLog, * we will request logs back to the min last_update over our * acting_backfill set, which will result in our log being extended * as far backwards as necessary to pick up any peers which can * be log recovered by auth_log_shard's log */ ss << " shard " << up_cand << " (up) backfill " << cur_info << std::endl; if (compat_mode) { if (backfill->empty()) { backfill->insert(up_cand); want->push_back(*i); acting_backfill->insert(up_cand); } } else { backfill->insert(up_cand); acting_backfill->insert(up_cand); } } else { want->push_back(*i); acting_backfill->insert(up_cand); usable++; ss << " osd." << *i << " (up) accepted " << cur_info << std::endl; } } It seems that only when the "backfill" set is empty will an OSD in up set whose pg log can not be linked up with the pg log of auth_log_shard or primary be added into "backfill" set, which means only one OSD can be "backfilled". What if there are two or more OSD in up set that needs to be "backfilled"? Please help me. Thank you.��.n��������+%������w��{.n����z��u���ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f