PG的生成过程
1. 首先将OSD对象new出来:
1 osd = new OSD(g_ceph_context, 2 store, 3 whoami, 4 ms_cluster, 5 ms_public, 6 ms_hb_front_client, 7 ms_hb_back_client, 8 ms_hb_front_server, 9 ms_hb_back_server, 10 ms_objecter, 11 &mc, 12 data_path, 13 journal_path);
2. 将osd初始化:
init中会call load_pgs();加载pg,在load_pgs之前有一个非常重要的细节,就是read_superblock,superblock中会保存上次持久化的osdmap epoch。拿到这个epoch之后再到store上去读取相应的osdmap,也就是osd最近一次持久化的osdmap,后面会用到。
int OSD::init()
3121 r = read_superblock(); ... 3162 osdmap = get_map(superblock.current_epoch); ... 3235 // load up pgs (as they previously existed) 3236 load_pgs(); ... 3397 dout(10) << "ensuring pgs have consumed prior maps" << dendl; 3398 consume_map(); ... 3413 start_boot(); 3414 3415 return 0;
4. PG* OSD::_make_pg(OSDMapRef createmap, spg_t pgid):创造每个pg的类 pg = new PrimaryLogPG(&service, createmap, pool, ec_profile, pgid);
1 PG::PG(OSDService *o, OSDMapRef curmap, 2 const PGPool &_pool, spg_t p) : 3 pg_id(p), 4 coll(p), 5 osd(o), 6 cct(o->cct), 7 osdmap_ref(curmap), 8 pool(_pool), 9 osdriver(osd->store, coll_t(), OSD::make_snapmapper_oid()), 10 snap_mapper(cct, 11 &osdriver, 12 p.ps(), 13 p.get_split_bits(_pool.info.get_pg_num()), 14 _pool.id, 15 p.shard), 16 last_persisted_osdmap(curmap->get_epoch()), 17 deleting(false), 18 trace_endpoint("0.0.0.0", 0, "PG"), 19 dirty_info(false), dirty_big_info(false), 20 info(p), 21 info_struct_v(0), 22 pg_log(cct), 23 pgmeta_oid(p.make_pgmeta_oid()), 24 missing_loc(this), 25 stat_queue_item(this), 26 scrub_queued(false), 27 recovery_queued(false), 28 recovery_ops_active(0), 29 role(-1), 30 state(0), 31 send_notify(false), 32 pg_whoami(osd->whoami, p.shard), 33 need_up_thru(false), 34 last_peering_reset(0), 35 heartbeat_peer_lock("PG::heartbeat_peer_lock"), 36 backfill_reserved(false), 37 backfill_reserving(false), 38 flushes_in_progress(0), 39 pg_stats_publish_lock("PG::pg_stats_publish_lock"), 40 pg_stats_publish_valid(false), 41 finish_sync_event(NULL), 42 backoff_lock("PG::backoff_lock"), 43 scrub_after_recovery(false), 44 save_req_scrub(false), 45 active_pushes(0), 46 recovery_state(this), // 创造状态机 47 peer_features(CEPH_FEATURES_SUPPORTED_DEFAULT), 48 acting_features(CEPH_FEATURES_SUPPORTED_DEFAULT), 49 upacting_features(CEPH_FEATURES_SUPPORTED_DEFAULT), 50 last_epoch(0), 51 last_require_osd_release(curmap->require_osd_release) 52 { 53 #ifdef PG_DEBUG_REFS 54 osd->add_pgid(p, this); 55 #endif 56 #ifdef WITH_BLKIN 57 std::stringstream ss; 58 ss << "PG " << info.pgid; 59 trace_endpoint.copy_name(ss.str()); 60 #endif 61 }
void OSD::handle_pg_create(OpRequestRef op)