// -*- mode:c++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab /* * ceph - scalable distributed file system * * copyright (c) 2014 john spray * * this is free software; you can redistribute it and/or * modify it under the terms of the gnu lesser general public * license version 2.1, as published by the free software * foundation. see file copying. */ #ifndef JOURNAL_SCANNER_H #define JOURNAL_SCANNER_H // For Journaler::Header, can't forward-declare nested classes #include namespace librados { class IoCtx; } #include "JournalFilter.h" /** * A simple sequential reader for metadata journals. Unlike * the MDS Journaler class, this is written to detect, record, * and read past corruptions and missing objects. It is also * less efficient but more plainly written. */ class JournalScanner { private: librados::IoCtx &io; // Input constraints const int rank; JournalFilter const filter; void gap_advance(); public: JournalScanner( librados::IoCtx &io_, int rank_, JournalFilter const &filter_) : io(io_), rank(rank_), filter(filter_), pointer_present(false), pointer_valid(false), header_present(false), header_valid(false), header(NULL) {}; JournalScanner( librados::IoCtx &io_, int rank_) : io(io_), rank(rank_), pointer_present(false), pointer_valid(false), header_present(false), header_valid(false), header(NULL) {}; ~JournalScanner(); int scan(bool const full=true); int scan_pointer(); int scan_header(); int scan_events(); void report(std::ostream &out) const; std::string obj_name(uint64_t offset) const; std::string obj_name(inodeno_t ino, uint64_t offset) const; // The results of the scan inodeno_t ino; // Corresponds to JournalPointer.front class EventRecord { public: EventRecord() : log_event(NULL), raw_size(0) {} EventRecord(LogEvent *le, uint32_t rs) : log_event(le), raw_size(rs) {} LogEvent *log_event; uint32_t raw_size; //< Size from start offset including all encoding overhead }; class EventError { public: int r; std::string description; EventError(int r_, const std::string &desc_) : r(r_), description(desc_) {} }; typedef std::map EventMap; typedef std::map ErrorMap; typedef std::pair Range; bool pointer_present; bool pointer_valid; bool header_present; bool header_valid; Journaler::Header *header; bool is_healthy() const; bool is_readable() const; std::vector objects_valid; std::vector objects_missing; std::vector ranges_invalid; std::vector events_valid; EventMap events; // For events present in ::events (i.e. scanned successfully), // any subsequent errors handling them (e.g. replaying) ErrorMap errors; private: // Forbid copy construction because I have ptr members JournalScanner(const JournalScanner &rhs); }; #endif // JOURNAL_SCANNER_H