summaryrefslogtreecommitdiffstats
path: root/src/osd/PGStateUtils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/PGStateUtils.cc')
-rw-r--r--src/osd/PGStateUtils.cc57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/osd/PGStateUtils.cc b/src/osd/PGStateUtils.cc
new file mode 100644
index 000000000..5dbe78eb7
--- /dev/null
+++ b/src/osd/PGStateUtils.cc
@@ -0,0 +1,57 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "PGStateUtils.h"
+#include "common/Clock.h"
+
+using ceph::Formatter;
+
+/*------NamedState----*/
+NamedState::NamedState(PGStateHistory *pgsh, const char *state_name)
+ : pgsh(pgsh), state_name(state_name), enter_time(ceph_clock_now()) {
+ if(pgsh) {
+ pgsh->enter(enter_time, state_name);
+ }
+}
+
+NamedState::~NamedState() {
+ if(pgsh) {
+ pgsh->exit(state_name);
+ }
+}
+
+/*---------PGStateHistory---------*/
+void PGStateHistory::enter(const utime_t entime, const char* state)
+{
+ if (pi == nullptr) {
+ pi = std::make_unique<PGStateInstance>();
+ }
+ pi->enter_state(entime, state);
+}
+
+void PGStateHistory::exit(const char* state) {
+ pi->setepoch(es.get_osdmap_epoch());
+ pi->exit_state(ceph_clock_now());
+ if (pi->empty()) {
+ reset();
+ }
+}
+
+void PGStateHistory::dump(Formatter* f) const {
+ f->open_array_section("history");
+ for (auto pi = buffer.begin(); pi != buffer.end(); ++pi) {
+ f->open_object_section("epochs");
+ f->dump_stream("epoch") << (*pi)->this_epoch;
+ f->open_array_section("states");
+ for (auto she : (*pi)->state_history) {
+ f->open_object_section("state");
+ f->dump_string("state", std::get<2>(she));
+ f->dump_stream("enter") << std::get<0>(she);
+ f->dump_stream("exit") << std::get<1>(she);
+ f->close_section();
+ }
+ f->close_section();
+ f->close_section();
+ }
+ f->close_section();
+}