pg->info.history.epoch_created =
pg->info.history.last_epoch_started =
pg->info.history.same_since =
- pg->info.history.same_primary_since =
- pg->info.history.same_acker_since = osdmap->get_epoch();
+ pg->info.history.same_primary_since = osdmap->get_epoch();
pg->write_info(t);
pg->write_log(t);
e > h.same_primary_since) {
dout(15) << "project_pg_history " << pgid << " primary changed in " << e << dendl;
h.same_primary_since = e;
-
- if (g_conf.osd_rep == OSD_REP_PRIMARY)
- h.same_acker_since = h.same_primary_since;
- }
-
- // acker change?
- if (g_conf.osd_rep != OSD_REP_PRIMARY) {
- if (!(!acting.empty() && !last.empty() && acting[acting.size()-1] == last[last.size()-1]) &&
- e > h.same_acker_since) {
- dout(15) << "project_pg_history " << pgid << " acker changed in " << e << dendl;
- h.same_acker_since = e;
- }
}
if (h.same_since >= e &&
- h.same_primary_since >= e &&
- h.same_acker_since >= e) break;
+ h.same_primary_since >= e) break;
}
dout(15) << "project_pg_history end " << h << dendl;
// -- there was a change! --
int oldrole = pg->get_role();
int oldprimary = pg->get_primary();
- int oldacker = pg->get_acker();
vector<int> oldacting = pg->acting;
pg->clear_prior();
pg->cancel_recovery();
pg->dirty_info = true;
}
- if (oldacker != pg->get_acker()) {
- pg->info.history.same_acker_since = osdmap->get_epoch();
- pg->dirty_info = true;
- }
// deactivate.
pg->state_clear(PG_STATE_ACTIVE);
if (osdmap->is_down(oldacting[i]))
pg->on_osd_failure(oldacting[i]);
pg->on_change();
- if (oldacker != pg->get_acker() && oldacker == whoami)
- pg->on_acker_change();
if (role != oldrole) {
// old primary?
} else {
// modify
- if ((pg->get_primary() != whoami ||
+ if ((!pg->is_primary() ||
!pg->same_for_modify_since(op->get_map_epoch()))) {
dout(7) << "handle_op pg changed " << pg->info.history
<< " after " << op->get_map_epoch()
epoch_t same_since; // same acting set since
epoch_t same_primary_since; // same primary at least back through this epoch.
- epoch_t same_acker_since; // same acker at least back through this epoch.
History() :
epoch_created(0),
last_epoch_started(0),
- same_since(0), same_primary_since(0), same_acker_since(0) {}
+ same_since(0), same_primary_since(0) {}
void merge(const History &other) {
if (epoch_created < other.epoch_created)
::encode(last_epoch_started, bl);
::encode(same_since, bl);
::encode(same_primary_since, bl);
- ::encode(same_acker_since, bl);
}
void decode(bufferlist::iterator &bl) {
::decode(epoch_created, bl);
::decode(last_epoch_started, bl);
::decode(same_since, bl);
::decode(same_primary_since, bl);
- ::decode(same_acker_since, bl);
}
} history;
int get_nrep() const { return acting.size(); }
int get_primary() { return acting.empty() ? -1:acting[0]; }
- //int get_tail() { return acting.empty() ? -1:acting[ acting.size()-1 ]; }
- //int get_acker() { return g_conf.osd_rep == OSD_REP_PRIMARY ? get_primary():get_tail(); }
- int get_acker() {
- if (g_conf.osd_rep == OSD_REP_PRIMARY ||
- acting.size() <= 1)
- return get_primary();
- return acting[1];
- }
int get_role() const { return role; }
void set_role(int r) { role = r; }
bool is_primary() const { return role == PG_ROLE_HEAD; }
bool is_replica() const { return role > 0; }
- bool is_acker() const {
- if (g_conf.osd_rep == OSD_REP_PRIMARY)
- return is_primary();
- else
- return role == PG_ROLE_ACKER;
- }
- bool is_head() const { return role == PG_ROLE_HEAD; }
- bool is_middle() const { return role == PG_ROLE_MIDDLE; }
- bool is_residual() const { return role == PG_ROLE_STRAY; }
//int get_state() const { return state; }
bool state_test(int m) const { return (state & m) != 0; }
virtual void wait_for_missing_object(object_t oid, Message *op) = 0;
virtual void on_osd_failure(int osd) = 0;
- virtual void on_acker_change() = 0;
virtual void on_role_change() = 0;
virtual void on_change() = 0;
virtual void on_shutdown() = 0;
{
return out << "ec=" << h.epoch_created
<< " les=" << h.last_epoch_started
- << " " << h.same_since << "/" << h.same_primary_since << "/" << h.same_acker_since;
+ << " " << h.same_since << "/" << h.same_primary_since;
}
inline ostream& operator<<(ostream& out, const PG::Info& pgi)
bool ReplicatedPG::same_for_read_since(epoch_t e)
{
- return (e >= info.history.same_acker_since);
+ return (e >= info.history.same_primary_since);
}
bool ReplicatedPG::same_for_modify_since(epoch_t e)
bool ReplicatedPG::same_for_rep_modify_since(epoch_t e)
{
// check osd map: same set, or primary+acker?
- return (e >= info.history.same_primary_since &&
- e >= info.history.same_acker_since);
+ return e >= info.history.same_primary_since;
}
// ====================
osd->store->getattr(info.pgid.to_coll(), poid, "balance-reads", &b, 1) < 0) {
dout(-10) << "read on replica, object " << poid
<< " dne or no balance-reads, fw back to primary" << dendl;
- osd->messenger->forward_message(op, osd->osdmap->get_inst(get_acker()));
+ osd->messenger->forward_message(op, osd->osdmap->get_inst(get_primary()));
return;
}
}
}
}
-void ReplicatedPG::on_acker_change()
-{
- dout(10) << "on_acker_change" << dendl;
-}
-
void ReplicatedPG::on_shutdown()
{
dout(10) << "on_shutdown" << dendl;
-#define CEPH_OSD_ONDISK_MAGIC "ceph osd volume v006"
+#define CEPH_OSD_ONDISK_MAGIC "ceph osd volume v007"