国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

合肥seo優(yōu)化安徽網(wǎng)站關(guān)鍵詞優(yōu)化

合肥seo優(yōu)化,安徽網(wǎng)站關(guān)鍵詞優(yōu)化,福建網(wǎng)站建設(shè)公司,網(wǎng)站建設(shè)價(jià)格如何本章介紹ceph中比較復(fù)雜的模塊: Peering機(jī)制。該過(guò)程保障PG內(nèi)各個(gè)副本之間數(shù)據(jù)的一致性,并實(shí)現(xiàn)PG的各種狀態(tài)的維護(hù)和轉(zhuǎn)換。本章首先介紹boost庫(kù)的statechart狀態(tài)機(jī)基本知識(shí),Ceph使用它來(lái)管理PG的狀態(tài)轉(zhuǎn)換。其次介紹PG的創(chuàng)建過(guò)程以及相應(yīng)的狀…

本章介紹ceph中比較復(fù)雜的模塊:

Peering機(jī)制。該過(guò)程保障PG內(nèi)各個(gè)副本之間數(shù)據(jù)的一致性,并實(shí)現(xiàn)PG的各種狀態(tài)的維護(hù)和轉(zhuǎn)換。本章首先介紹boost庫(kù)的statechart狀態(tài)機(jī)基本知識(shí),Ceph使用它來(lái)管理PG的狀態(tài)轉(zhuǎn)換。其次介紹PG的創(chuàng)建過(guò)程以及相應(yīng)的狀態(tài)機(jī)創(chuàng)建和初始化。然后詳細(xì)介紹peering機(jī)制三個(gè)具體的實(shí)現(xiàn)階段:GetInfo、GetLog、GetMissing。

statechart狀態(tài)機(jī)
1.1 狀態(tài)
1.2 事件
1.3 狀態(tài)機(jī)的響應(yīng)
1.4 狀態(tài)機(jī)的定義
1.5 context函數(shù)
1.6 事件的特殊處理
1.7 PG狀態(tài)機(jī)
1.8 PG狀態(tài)機(jī)的總體狀態(tài)轉(zhuǎn)換圖
1.9 OSD啟動(dòng)加載PG狀態(tài)機(jī)轉(zhuǎn)換
1.10 PG創(chuàng)建后狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換
1.11 PG在觸發(fā)Peering過(guò)程時(shí)機(jī)


1. statechart狀態(tài)機(jī)


Ceph在處理PG的狀態(tài)轉(zhuǎn)換時(shí),使用了boost庫(kù)提供的statechart狀態(tài)機(jī)。因此先簡(jiǎn)單介紹一下statechart狀態(tài)機(jī)的基本概念和涉及的相關(guān)知識(shí),以便更好地理解Peering過(guò)程PG的狀態(tài)機(jī)轉(zhuǎn)換流程。下面例舉時(shí)截取了PG狀態(tài)機(jī)的部分代碼。

1.1 狀態(tài)

沒(méi)有子狀態(tài)情況下的狀態(tài)定義
在statechart里,一個(gè)狀態(tài)的定義方式有兩種:

 
  1. struct Reset : boost::statechart::state< Reset, RecoveryMachine >, NamedState {

  2. ...

  3. };

這里定義了狀態(tài)Reset,它需要繼承boost::statechart::state類。該類的模板參數(shù)中,第一個(gè)參數(shù)為狀態(tài)自己的名字Reset,第二個(gè)參數(shù)為該狀態(tài)所屬狀態(tài)機(jī)的名字,表明Reset是狀態(tài)機(jī)RecoveryMachine的一個(gè)狀態(tài)。

有子狀態(tài)情況下的狀態(tài)定義

 
  1. struct Start;

  2. struct Started : boost::statechart::state< Started, RecoveryMachine, Start >, NamedState {

  3. ...

  4. }

  5. struct Start : boost::statechart::state< Start, Started >, NamedState {

  6. };

狀態(tài)Started也是狀態(tài)機(jī)RecoveryMachine的一個(gè)狀態(tài),模板參數(shù)中多了一個(gè)參數(shù)Start,它是狀態(tài)Started的默認(rèn)初始子狀態(tài)。
這里定義的Start是狀態(tài)Started的子狀態(tài)。第一個(gè)模板參數(shù)是自己的名字,第二個(gè)模板參數(shù)是該子狀態(tài)所屬父狀態(tài)的名字。

綜上所述,一個(gè)狀態(tài),要么屬于一個(gè)狀態(tài)機(jī),要么屬于一個(gè)狀態(tài),成為該狀態(tài)的子狀態(tài)。其定義的模板參數(shù)是自己,第二個(gè)參數(shù)是擁有者,第三個(gè)參數(shù)是它的起始子狀態(tài)。

?1.2 事件

狀態(tài)能夠接收并處理事件。事件可以改變狀態(tài),促使?fàn)顟B(tài)發(fā)生轉(zhuǎn)移。在boost庫(kù)的statechart狀態(tài)機(jī)中定義事件的方式如下所示:

 
  1. struct QueryState : boost::statechart::event< QueryState > {

  2. Formatter *f;

  3. explicit QueryState(Formatter *f) : f(f) {}

  4. void print(std::ostream *out) const {

  5. *out << "Query";

  6. }

  7. };

  8. };

QueryState為一個(gè)事件,需要繼承boost::statechart::event類,模板參數(shù)為自己的名字。

1.3 狀態(tài)機(jī)的響應(yīng)

在一個(gè)狀態(tài)內(nèi)部,需要定義狀態(tài)機(jī)處于當(dāng)前狀態(tài)時(shí),可以接受的事件以及如何處理這些事件的方法:

 
  1. #define TrivialEvent(T) struct T : boost::statechart::event< T > { \

  2. T() : boost::statechart::event< T >() {} \

  3. void print(std::ostream *out) const { \

  4. *out << #T; \

  5. } \

  6. };

  7. TrivialEvent(Initialize)

  8. TrivialEvent(Load)

  9. TrivialEvent(GotInfo)

  10. TrivialEvent(NeedUpThru)

  11. TrivialEvent(NullEvt)

  12. TrivialEvent(FlushedEvt)

  13. TrivialEvent(Backfilled)

  14. TrivialEvent(LocalBackfillReserved)

  15. TrivialEvent(RemoteBackfillReserved)

  16. TrivialEvent(RejectRemoteReservation)

  17. TrivialEvent(RemoteReservationRejected)

  18. TrivialEvent(RemoteReservationCanceled)

  19. TrivialEvent(RequestBackfill)

  20. TrivialEvent(RequestRecovery)

  21. TrivialEvent(RecoveryDone)

  22. TrivialEvent(BackfillTooFull)

  23. TrivialEvent(RecoveryTooFull)

  24. TrivialEvent(MakePrimary)

  25. TrivialEvent(MakeStray)

  26. TrivialEvent(NeedActingChange)

  27. TrivialEvent(IsIncomplete)

  28. TrivialEvent(IsDown)

  29. TrivialEvent(AllReplicasRecovered)

  30. TrivialEvent(DoRecovery)

  31. TrivialEvent(LocalRecoveryReserved)

  32. TrivialEvent(RemoteRecoveryReserved)

  33. TrivialEvent(AllRemotesReserved)

  34. TrivialEvent(AllBackfillsReserved)

  35. TrivialEvent(GoClean)

  36. TrivialEvent(AllReplicasActivated)

  37. TrivialEvent(IntervalFlush)

 
  1. struct Initial : boost::statechart::state< Initial, RecoveryMachine >, NamedState {

  2. explicit Initial(my_context ctx);

  3. void exit();

  4. typedef boost::mpl::list <

  5. boost::statechart::transition< Initialize, Reset >,

  6. boost::statechart::custom_reaction< Load >,

  7. boost::statechart::custom_reaction< NullEvt >,

  8. boost::statechart::transition< boost::statechart::event_base, Crashed >

  9. > reactions;

  10. boost::statechart::result react(const Load&);

  11. boost::statechart::result react(const MNotifyRec&);

  12. boost::statechart::result react(const MInfoRec&);

  13. boost::statechart::result react(const MLogRec&);

  14. boost::statechart::result react(const boost::statechart::event_base&) {

  15. return discard_event();

  16. }

  17. };

狀態(tài)機(jī)的7種事件處理方法?

上述代碼列出了狀態(tài)RecoveryMachine/Initial可以處理的事件列表和處理對(duì)應(yīng)事件的方法:

1) 通過(guò)boost::mpl::list定義該狀態(tài)可以處理多個(gè)事件類型。本例中可以處理Initialize、Load、NullEvt和event_base事件。

2) 簡(jiǎn)單事件處理

boost::statechart::transition< Initialize, Reset >

定義了狀態(tài)Initial接收到事件Initialize后,無(wú)條件直接跳轉(zhuǎn)到Reset狀態(tài);

3) 用戶自定義事件處理: 當(dāng)接收到事件后,需要根據(jù)一些條件來(lái)決定狀態(tài)如何轉(zhuǎn)移,這個(gè)邏輯需要用戶自己定義實(shí)現(xiàn)

boost::statechart::custom_reaction< Load >

custom_reaction 定義了一個(gè)用戶自定義的事件處理方法,必須有一個(gè)react()的處理函數(shù)處理對(duì)應(yīng)該事件。狀態(tài)轉(zhuǎn)移的邏輯需要用戶自己在react函數(shù)里實(shí)現(xiàn):

boost::statechart::result react(const Load&);


4)NullEvt事件用戶自定義處理,但是沒(méi)有實(shí)現(xiàn)react()函數(shù)來(lái)處理,最終事件匹配了boost::statechart::event_base事件,直接調(diào)用函數(shù)discard_event把事件丟棄掉。

 
  1. boost::statechart::custom_reaction< NullEvt >

  2. ?? ?

  3. boost::statechart::result react(const boost::statechart::event_base&) {

  4. ?? ?return discard_event();

  5. ? ? ? }

1.4 狀態(tài)機(jī)的定義
RecoveryMachine為定義的狀態(tài)機(jī),需要繼承boost::statechart::state_machine類:

 
  1. ? ? struct Initial;

  2. ? ? class RecoveryMachine : public boost::statechart::state_machine< RecoveryMachine, Initial > {

  3. ? ? ? RecoveryState *state;

  4. ? ? public:

  5. ? ? ? PG *pg;

  6. ? ? ? }

模板參數(shù)第一個(gè)參數(shù)為自己的名字,第二個(gè)參數(shù)為狀態(tài)機(jī)默認(rèn)的初始狀態(tài)Initial。

狀態(tài)機(jī)的基本操作有兩個(gè):? ?

 
  1. RecoveryMachine machine;

  2. ? ? PG *pg;

  3. ? ? explicit RecoveryState(PG *pg)

  4. ? ? ? : machine(this, pg), pg(pg), orig_ctx(0) {

  5. ? ? ? machine.initiate();//a---

  6. ? ? }

  7. ? ? void handle_event(const boost::statechart::event_base &evt,

  8. ?? ??? ? ? ? ?RecoveryCtx *rctx) {

  9. ? ? ? start_handle(rctx);

  10. ? ? ? machine.process_event(evt);//b---

  11. ? ? ? end_handle();

  12. ? ? }

  13. ? ? void handle_event(CephPeeringEvtRef evt,

  14. ?? ??? ? ? ? ?RecoveryCtx *rctx) {

  15. ? ? ? start_handle(rctx);

  16. ? ? ? machine.process_event(evt->get_event());/b---

  17. ? ? ? end_handle();

  18. ? ? }


a.狀態(tài)機(jī)的初始化

initiate()是繼承自boost::statechart::state_machine的成員函數(shù)。

b.函數(shù)process_event()用來(lái)向狀態(tài)機(jī)投遞事件,從而觸發(fā)狀態(tài)機(jī)接收并處理該事件

process_event()也是繼承自boost::statechart::state_machine的成員函數(shù)。

1.5 context函數(shù)
context是狀態(tài)機(jī)的一個(gè)比較有用的函數(shù),它可以獲取當(dāng)前狀態(tài)的所有祖先狀態(tài)的指針。通過(guò)它可以獲取父狀態(tài)以及祖先狀態(tài)的一些內(nèi)部參數(shù)和狀態(tài)值。context()函數(shù)是實(shí)現(xiàn)在boost::statechart::state_machine中的:

context()函數(shù)在boost::statechart::simple_state中有實(shí)現(xiàn):

 
  1. //boost_1_73_0/boost/statechart/simple_state.hpp

  2. 234 ? ? template< class OtherContext >

  3. 235 ? ? OtherContext & context()

  4. 236 ? ? {

  5. 237 ? ? ? typedef typename mpl::if_<

  6. 238 ? ? ? ? is_base_of< OtherContext, MostDerived >,

  7. 239 ? ? ? ? context_impl_this_context,

  8. 240 ? ? ? ? context_impl_other_context

  9. 241 ? ? ? >::type impl;

  10. 242 ? ? ? return impl::template context_impl< OtherContext >( *this );

  11. 243 ? ? }

  12. 244 ? ? ?

  13. 245 ? ? template< class OtherContext >

  14. 246 ? ? const OtherContext & context() const

  15. 247 ? ? {

  16. 248 ? ? ? typedef typename mpl::if_<

  17. 249 ? ? ? ? is_base_of< OtherContext, MostDerived >,

  18. 250 ? ? ? ? context_impl_this_context,

  19. 251 ? ? ? ? context_impl_other_context

  20. 252 ? ? ? >::type impl;

  21. 253 ? ? ? return impl::template context_impl< OtherContext >( *this );

  22. 254 ? ? }

從simple_state的實(shí)現(xiàn)來(lái)看,context()可以獲取當(dāng)前狀態(tài)的祖先狀態(tài)指針,也可以獲取當(dāng)前狀態(tài)所屬狀態(tài)機(jī)的指針。

例如狀態(tài)Started是RecoveryMachine的一個(gè)狀態(tài),狀態(tài)Start是Started狀態(tài)的一個(gè)子狀態(tài),那么如果當(dāng)前狀態(tài)是Start,就可以通過(guò)該函數(shù)獲取它的父狀態(tài)Started的指針:

Started * parent = context< Started >();

同時(shí)也可以獲取其祖先狀態(tài)RecoveryMachine的指針:

RecoveryMachine *machine = context< RecoveryMachine >();

在狀態(tài)機(jī)實(shí)現(xiàn)中,大量了使用該函數(shù)來(lái)獲取相應(yīng)的指針。Eg:

 
  1. ? PG *pg = context< RecoveryMachine >().pg;

  2. ? context< RecoveryMachine >().get_cur_transaction(),

  3. ? context< RecoveryMachine >().get_on_applied_context_list(),

  4. ? context< RecoveryMachine >().get_on_safe_context_list());

綜上所述,context()函數(shù)為獲取當(dāng)前狀態(tài)的祖先狀態(tài)上下文提供了一種方法。

<span id = “1.6事件的特殊處理”></span>

1.6 事件的特殊處理
事件除了在狀態(tài)轉(zhuǎn)移列表中觸發(fā)狀態(tài)轉(zhuǎn)移,或者進(jìn)入用戶自定義的狀態(tài)處理函數(shù),還可以有下列特殊的處理方式:

在用戶自定義的函數(shù)里,可以直接調(diào)用函數(shù)transit來(lái)直接跳轉(zhuǎn)到目標(biāo)狀態(tài)。例如:

 
  1. boost::statechart::result PG::RecoveryState::Initial::react(const MLogRec& i)

  2. {

  3. ? PG *pg = context< RecoveryMachine >().pg;

  4. ? assert(!pg->is_primary());

  5. ? post_event(i);

  6. ? return transit< Stray >();//go---

  7. }

可以直接跳轉(zhuǎn)到狀態(tài)Stray。在用戶自定義的函數(shù)里,可以調(diào)用函數(shù)post_event()直接產(chǎn)生相應(yīng)的事件,并投遞給狀態(tài)機(jī)

 
  1. PG::RecoveryState::Start::Start(my_context ctx)

  2. ? : my_base(ctx),

  3. ? ? NamedState(context< RecoveryMachine >().pg->cct, "Start")

  4. {

  5. ? context< RecoveryMachine >().log_enter(state_name);

  6. ? PG *pg = context< RecoveryMachine >().pg;

  7. ? if (pg->is_primary()) {

  8. ? ? dout(1) << "transitioning to Primary" << dendl;

  9. ? ? post_event(MakePrimary());//go---

  10. ? } else { //is_stray

  11. ? ? dout(1) << "transitioning to Stray" << dendl;?

  12. ? ? post_event(MakeStray());//go---

  13. ? }

  14. }

在用戶的自定義函數(shù)里,調(diào)用函數(shù)discard_event()可以直接丟棄事件,不做任何處理

 
  1. boost::statechart::result PG::RecoveryState::Primary::react(const ActMap&)

  2. {

  3. ? dout(7) << "handle ActMap primary" << dendl;

  4. ? PG *pg = context< RecoveryMachine >().pg;

  5. ? pg->publish_stats_to_osd();

  6. ? pg->take_waiters();

  7. ? return discard_event();//go---

  8. }

在用戶的自定義函數(shù)里,調(diào)用函數(shù)forward_event()可以把當(dāng)前事件繼續(xù)投遞給狀態(tài)機(jī)

 
  1. boost::statechart::result PG::RecoveryState::WaitUpThru::react(const ActMap& am)

  2. {

  3. ? PG *pg = context< RecoveryMachine >().pg;

  4. ? if (!pg->need_up_thru) {

  5. ? ? post_event(Activate(pg->get_osdmap()->get_epoch()));

  6. ? }

  7. ? return forward_event();

  8. }

結(jié)合?1.3 狀態(tài)機(jī)的響應(yīng)?的3種事件響應(yīng),大概有7種事件響應(yīng)處理的方法。

1.7 PG狀態(tài)機(jī)
在類PG的內(nèi)部定義了類RecoveryState,該類RecoveryState的內(nèi)部定義了PG的狀態(tài)機(jī)RecoveryMachine和它的各種狀態(tài)。

 
  1. class PG{

  2. ?? ?class RecoveryState{

  3. ?? ??? ?class RecoveryMachine{

  4. ?? ??? ?};

  5. ?? ?};

  6. };

在每個(gè)PG創(chuàng)建時(shí),在構(gòu)造函數(shù)里創(chuàng)建一個(gè)新的RecoveryState類的對(duì)象,并創(chuàng)建相應(yīng)的RecoveryMachine類的對(duì)象,也就是創(chuàng)建了一個(gè)新的狀態(tài)機(jī)。每個(gè)PG類對(duì)應(yīng)一個(gè)獨(dú)立的狀態(tài)機(jī)來(lái)控制該P(yáng)G的狀態(tài)轉(zhuǎn)換。

 
  1. PG::PG(OSDService *o, OSDMapRef curmap,

  2. ? ? ? ?const PGPool &_pool, spg_t p) :

  3. ?? ?recovery_state(this){

  4. }

  5. class RecoveryState{

  6. public:

  7. ?? ?explicit RecoveryState(PG *pg)

  8. ? ? ? : machine(this, pg), pg(pg), orig_ctx(0) {

  9. ? ? ? machine.initiate();

  10. ? ? }

  11. };

上面machine.initiate()調(diào)用的是boost::statechart::state_machine中的initiate()方法。
1.8 PG狀態(tài)機(jī)的總體狀態(tài)轉(zhuǎn)換圖

下圖為PG狀態(tài)機(jī)的總體狀態(tài)轉(zhuǎn)換圖簡(jiǎn)化版

1.9 OSD啟動(dòng)加載PG狀態(tài)機(jī)轉(zhuǎn)換
當(dāng)OSD重啟時(shí),調(diào)用函數(shù)OSD::init(),該函數(shù)調(diào)用load_pgs()加載已經(jīng)存在的PG,其處理過(guò)程和以下創(chuàng)建PG的過(guò)程相似。

 
  1. int OSD::init()

  2. {

  3. ? // load up pgs (as they previously existed)

  4. ? load_pgs();

  5. }

  6. void OSD::load_pgs()

  7. {

  8. ...

  9. ? ? PG::RecoveryCtx rctx(0, 0, 0, 0, 0, 0);

  10. ? ? pg->handle_loaded(&rctx);//go--

  11. ...

  12. }

  13. void PG::handle_loaded(RecoveryCtx *rctx)

  14. {

  15. ? dout(10) << "handle_loaded" << dendl;

  16. ? Load evt;

  17. ? recovery_state.handle_event(evt, rctx);

  18. }

  19. struct Initial : boost::statechart::state< Initial, RecoveryMachine >, NamedState {

  20. ? ? typedef boost::mpl::list <

  21. ?? ?boost::statechart::transition< Initialize, Reset >,

  22. ?? ?boost::statechart::custom_reaction< Load >,

  23. ?? ?boost::statechart::custom_reaction< NullEvt >,

  24. ?? ?boost::statechart::transition< boost::statechart::event_base, Crashed >

  25. ?? ?> reactions;

  26. ?? ?

  27. ? ? boost::statechart::result react(const Load&);

  28. }

  29. boost::statechart::result PG::RecoveryState::Initial::react(const Load& l)

  30. {

  31. ? PG *pg = context< RecoveryMachine >().pg;

  32. ? // do we tell someone we're here?

  33. ? pg->send_notify = (!pg->is_primary());

  34. ? pg->update_store_with_options();

  35. ? pg->update_store_on_load();

  36. ? return transit< Reset >();//go---

  37. }

1.10 PG創(chuàng)建后狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換
?

 
  1. void PG::handle_create(RecoveryCtx *rctx)

  2. {

  3. ? dout(10) << "handle_create" << dendl;

  4. ? rctx->created_pgs.insert(this);

  5. ? Initialize evt;

  6. ? recovery_state.handle_event(evt, rctx);

  7. ? ActMap evt2;

  8. ? recovery_state.handle_event(evt2, rctx);

  9. ? rctx->on_applied->add(make_lambda_context([this]() {

  10. ? ? update_store_with_options();

  11. ? }));

  12. }

當(dāng)PG創(chuàng)建后,同時(shí)在該類內(nèi)部創(chuàng)建了一個(gè)屬于該P(yáng)G的RecoveryMachine類型的狀態(tài)機(jī),該狀態(tài)機(jī)的初始化狀態(tài)為默認(rèn)初始化狀態(tài)Initial。

在PG創(chuàng)建后,調(diào)用函數(shù)pg->handle_create(&rctx)來(lái)給狀態(tài)機(jī)投遞事件

該函數(shù)首先向RecoveryMachine投遞了Initialize類型的事件。接收到Initialize類型的事件后直接轉(zhuǎn)移到Reset狀態(tài)。其次,向RecoveryMachine投遞了ActMap事件。

 
  1. boost::statechart::result PG::RecoveryState::Reset::react(const ActMap&)

  2. {

  3. ? PG *pg = context< RecoveryMachine >().pg;

  4. ? if (pg->should_send_notify() && pg->get_primary().osd >= 0) {

  5. ? ? context< RecoveryMachine >().send_notify(

  6. ? ? ? pg->get_primary(),

  7. ? ? ? pg_notify_t(

  8. ?? ?pg->get_primary().shard, pg->pg_whoami.shard,

  9. ?? ?pg->get_osdmap()->get_epoch(),

  10. ?? ?pg->get_osdmap()->get_epoch(),

  11. ?? ?pg->info),

  12. ? ? ? pg->past_intervals);

  13. ? }

  14. ? pg->update_heartbeat_peers();

  15. ? pg->take_waiters();

  16. ? return transit< Started >();//a---

  17. }

a. 在自定義的react函數(shù)里直接調(diào)用了transit函數(shù)跳轉(zhuǎn)到Started狀態(tài)。? ?

 
  1. struct Start;

  2. ? ? struct Started : boost::statechart::state< Started, RecoveryMachine, Start >, NamedState {//這里直接進(jìn)入默認(rèn)子狀態(tài)Start

  3. ? ? ...

  4. ? ? }

  5. ? ? /*-------Start---------*/

  6. ? ? PG::RecoveryState::Start::Start(my_context ctx)

  7. ? ? ? : my_base(ctx),

  8. ? ? ? ? NamedState(context< RecoveryMachine >().pg, "Start")

  9. ? ? {

  10. ? ? ? context< RecoveryMachine >().log_enter(state_name);

  11. ? ??

  12. ? ? ? PG *pg = context< RecoveryMachine >().pg;

  13. ? ? ? if (pg->is_primary()) {

  14. ? ? ? ? ldout(pg->cct, 1) << "transitioning to Primary" << dendl;

  15. ? ? ? ? post_event(MakePrimary());//go---

  16. ? ? ? } else { //is_stray

  17. ? ? ? ? ldout(pg->cct, 1) << "transitioning to Stray" << dendl;

  18. ? ? ? ? post_event(MakeStray());//go---

  19. ? ? ? }

  20. ? ? }

  21. ? ??

  22. ? ? struct Start : boost::statechart::state< Start, Started >, NamedState {

  23. ? ? ? explicit Start(my_context ctx);

  24. ? ? ? void exit();

  25. ? ? typedef boost::mpl::list <

  26. ?? ?boost::statechart::transition< MakePrimary, Primary >,

  27. ?? ?boost::statechart::transition< MakeStray, Stray >

  28. ?? ?> reactions;

  29. ? ? }; ? ?

  30. ? ??

  31. ? ? struct Primary : boost::statechart::state< Primary, Started, Peering >, NamedState {//這里直接進(jìn)入Primary的默認(rèn)子狀態(tài)Peering。

  32. ? ? ...

  33. ? ? }

  34. ? ??

  35. ? ? struct Stray : boost::statechart::state< Stray, Started >, NamedState {

  36. ? ? ...

  37. ? ? } ? ?

1.進(jìn)入狀態(tài)RecoveryMachine/Started后,就進(jìn)入RecoveryMachine/Started的默認(rèn)的子狀態(tài)RecoveryMachine/Started/Start中。
由以上代碼可知,在Start狀態(tài)的構(gòu)造函數(shù)中,根據(jù)本OSD在該P(yáng)G中擔(dān)任的角色不同分別進(jìn)行如下處理:

(1)如果是主OSD,就調(diào)用函數(shù)post_event(),拋出事件MakePrimary,進(jìn)入主OSD的默認(rèn)子狀態(tài)Primary/Peering中;

(2)如果是從OSD,就調(diào)用函數(shù)post_event(),拋出事件MakeStray,進(jìn)入Started/Stray狀態(tài);

對(duì)于一個(gè)OSD的PG處于Stray狀態(tài),是指該OSD上的PG副本目前狀態(tài)不確定,但是可以響應(yīng)主OSD的各種查詢操作。它有兩種可能:一種是最終轉(zhuǎn)移到狀態(tài)ReplicaActive,處于活躍狀態(tài),成為PG的一個(gè)副本;另一種可能的情況是:如果是數(shù)據(jù)遷移的源端,可能一直保持Stray狀態(tài),該OSD上的副本可能在數(shù)據(jù)遷移完成后,PG以及數(shù)據(jù)就都被刪除了。

1.11 PG在觸發(fā)Peering過(guò)程時(shí)機(jī):
1.當(dāng)系統(tǒng)初始化時(shí),OSD重新啟動(dòng)導(dǎo)致PG重新加載。
2.PG新創(chuàng)建時(shí),PG會(huì)發(fā)起一次Peering的過(guò)程
3. 當(dāng)有OSD失效,OSD的增加或者刪除等導(dǎo)致PG的acting set發(fā)生了變化,該P(yáng)G就會(huì)重新發(fā)起一次Peering過(guò)程。
參考link:
?https://ivanzz1001.github.io/records/post/ceph/2019/02/01/ceph-src-code-part10_1

http://aloenet.com.cn/news/40538.html

相關(guān)文章:

  • 虛擬主機(jī)網(wǎng)站淘客網(wǎng)站建設(shè)b站推廣軟件
  • 網(wǎng)站備案之前需要建好網(wǎng)站嗎windows優(yōu)化大師要會(huì)員
  • 教育網(wǎng)站怎么做如何推廣一個(gè)項(xiàng)目
  • 長(zhǎng)春企業(yè)網(wǎng)站模板建站域名解析ip
  • css做購(gòu)物網(wǎng)站的分類目錄搜索引擎優(yōu)化搜索優(yōu)化
  • 做地方旅游網(wǎng)站目的意義正規(guī)的教育培訓(xùn)機(jī)構(gòu)有哪些
  • 中華人民共和國(guó)城鄉(xiāng)與建設(shè)部網(wǎng)站長(zhǎng)沙seo優(yōu)化推薦
  • ae有么有做gif的網(wǎng)站構(gòu)建新發(fā)展格局
  • 網(wǎng)站開(kāi)發(fā)架設(shè)baidu百度
  • 如何打開(kāi)本地安裝的WORDPRESS網(wǎng)站查詢工具seo
  • 合肥建設(shè)學(xué)校官網(wǎng)網(wǎng)站網(wǎng)站關(guān)鍵詞挖掘
  • html5移動(dòng)網(wǎng)站模板貴港網(wǎng)站seo
  • 怎么兼職做網(wǎng)站谷歌seo站內(nèi)優(yōu)化
  • 用網(wǎng)站模板建網(wǎng)站谷歌官網(wǎng)注冊(cè)入口
  • 一個(gè)網(wǎng)站想看訪客量怎么做seo外鏈平臺(tái)
  • 青浦網(wǎng)站建設(shè)公司福州短視頻seo推薦
  • 網(wǎng)站風(fēng)格設(shè)計(jì)百度seo怎么樣優(yōu)化
  • 網(wǎng)站建設(shè)文化怎么樣圖片百度搜索
  • 簡(jiǎn)單的招聘網(wǎng)站怎么做電商網(wǎng)站設(shè)計(jì)
  • 手機(jī)哪里可以做視頻網(wǎng)站鄭州聚商網(wǎng)絡(luò)科技有限公司
  • 勁松做網(wǎng)站的公司百度一下首頁(yè)設(shè)為主頁(yè)
  • wordpress中文 插件網(wǎng)站文章優(yōu)化技巧
  • 做網(wǎng)站北京公司推廣產(chǎn)品的渠道
  • drupal7建站教程怎么創(chuàng)建網(wǎng)站鏈接
  • 重慶微網(wǎng)站建設(shè)寧波網(wǎng)絡(luò)推廣軟件
  • 自適應(yīng)網(wǎng)站設(shè)計(jì)規(guī)范企業(yè)的互聯(lián)網(wǎng)推廣
  • 如何建設(shè)dj網(wǎng)站seo 工具推薦
  • 成都網(wǎng)站制作創(chuàng)新互聯(lián)磁力搜索引擎哪個(gè)好
  • 寬屏企業(yè)網(wǎng)站源碼國(guó)家再就業(yè)免費(fèi)培訓(xùn)網(wǎng)
  • 遵義做網(wǎng)站的公司重慶電子商務(wù)網(wǎng)站seo