pushing.clear();
pulling.clear();
pull_from_peer.clear();
+
+ // clear snap_trimmer state
+ snap_trimmer_machine.process_event(SnapTrimmer::Reset());
}
void ReplicatedPG::on_role_change()
dout(10) << "_scrub (" << mode << ") finish" << dendl;
return errors;
}
+
+/*---SnapTrimmer states---*/
+#undef dout_prefix
+#define dout_prefix (*_dout << context< SnapTrimmer >().pg->gen_prefix() \
+ << "SnapTrimmer state<" << get_state_name() << ">: ")
+
+/* NotTrimming */
+ReplicatedPG::SnapTrimmer::NotTrimming::NotTrimming(my_context ctx) : my_base(ctx)
+{
+ state_name = "Started/Primary/Active/NotTrimming";
+ //context< SnapTrimmer >().log_enter(state_name);
+}
+
+void ReplicatedPG::SnapTrimmer::NotTrimming::exit()
+{
+ //context< SnapTrimmer >().log_exit(state_name, enter_time);
+}
+
+boost::statechart::result ReplicatedPG::SnapTrimmer::NotTrimming::react(const SnapTrim&)
+{
+ return discard_event();
+}
+
+/* Trimming */
+ReplicatedPG::SnapTrimmer::Trimming::Trimming(my_context ctx) : my_base(ctx)
+{
+ state_name = "Started/Primary/Active/Trimming";
+ //context< SnapTrimmer >().log_enter(state_name);
+}
+
+void ReplicatedPG::SnapTrimmer::Trimming::exit()
+{
+ //context< SnapTrimmer >().log_exit(state_name, enter_time);
+}
+
+/* TrimmingObjects */
+ReplicatedPG::SnapTrimmer::TrimmingObjects::TrimmingObjects(my_context ctx) : my_base(ctx)
+{
+ state_name = "Started/Primary/Active/Trimming/TrimmingObjects";
+ //context< SnapTrimmer >().log_enter(state_name);
+}
+
+void ReplicatedPG::SnapTrimmer::TrimmingObjects::exit()
+{
+ //context< SnapTrimmer >().log_exit(state_name, enter_time);
+}
+
+boost::statechart::result ReplicatedPG::SnapTrimmer::TrimmingObjects::react(const SnapTrim&)
+{
+ return discard_event();
+}
+/* WaitingOnReplicasObjects */
+ReplicatedPG::SnapTrimmer::WaitingOnReplicas::WaitingOnReplicas(my_context ctx) : my_base(ctx)
+{
+ state_name = "Started/Primary/Active/Trimming/WaitingOnReplicas";
+ //context< SnapTrimmer >().log_enter(state_name);
+}
+
+void ReplicatedPG::SnapTrimmer::WaitingOnReplicas::exit()
+{
+ //context< SnapTrimmer >().log_exit(state_name, enter_time);
+}
+
+boost::statechart::result ReplicatedPG::SnapTrimmer::WaitingOnReplicas::react(const SnapTrim&)
+{
+ return discard_event();
+}
public:
ReplicatedPG(OSD *o, PGPool *_pool, pg_t p, const sobject_t& oid, const sobject_t& ioid) :
- PG(o, _pool, p, oid, ioid)
+ PG(o, _pool, p, oid, ioid), snap_trimmer_machine(this)
{ }
~ReplicatedPG() {}
bufferlist& odata);
void do_osd_op_effects(OpContext *ctx);
private:
+ class NotTrimming;
+ class SnapTrimmer : public boost::statechart::state_machine< SnapTrimmer, NotTrimming > {
+ ReplicatedPG *pg;
+
+ public:
+ SnapTrimmer(ReplicatedPG *pg) : pg(pg) {}
+
+ struct SnapTrim : boost::statechart::event< SnapTrim > {};
+ struct Reset : boost::statechart::event< SnapTrim > {};
+ private:
+ struct NotTrimming : boost::statechart::state< NotTrimming, SnapTrimmer >, NamedState {
+ typedef boost::mpl::list <
+ boost::statechart::custom_reaction< SnapTrim >
+ > reactions;
+ NotTrimming(my_context ctx);
+ void exit();
+ boost::statechart::result react(const SnapTrim&);
+ };
+
+ struct TrimmingObjects;
+ struct RepGather;
+ struct Trimming : boost::statechart::state< Trimming, SnapTrimmer, TrimmingObjects >, NamedState {
+ typedef boost::mpl::list <
+ boost::statechart::transition< Reset, NotTrimming >
+ > reactions;
+ Trimming(my_context ctx);
+ void exit();
+ set< RepGather* > pending_repops;
+ set< sobject_t > remaining_objects;
+ coll_t col_trimming;
+ snapid_t snap_trimming;
+ };
+
+ struct TrimmingObjects : boost::statechart::state< TrimmingObjects, Trimming >, NamedState {
+ typedef boost::mpl::list <
+ boost::statechart::custom_reaction< SnapTrim >
+ > reactions;
+ TrimmingObjects(my_context ctx);
+ void exit();
+ boost::statechart::result react(const SnapTrim&);
+ };
+
+ struct WaitingOnReplicas : boost::statechart::state< WaitingOnReplicas, Trimming >, NamedState {
+ typedef boost::mpl::list <
+ boost::statechart::custom_reaction< SnapTrim >
+ > reactions;
+ WaitingOnReplicas(my_context ctx);
+ void exit();
+ boost::statechart::result react(const SnapTrim&);
+ };
+ } snap_trimmer_machine;
void _delete_head(OpContext *ctx);
int _rollback_to(OpContext *ctx, ceph_osd_op& op);
public: