// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #ifndef CEPH_LIBRBD_CACHE_RWL_LOG_MAP_H #define CEPH_LIBRBD_CACHE_RWL_LOG_MAP_H #include "librbd/BlockGuard.h" #include namespace librbd { namespace cache { namespace pwl { /** * WriteLogMap: maps block extents to GenericWriteLogEntries * * A WriteLogMapEntry (based on LogMapEntry) refers to a portion of a GenericWriteLogEntry */ template class LogMapEntry { public: BlockExtent block_extent; std::shared_ptr log_entry; LogMapEntry(BlockExtent block_extent, std::shared_ptr log_entry = nullptr); LogMapEntry(std::shared_ptr log_entry); template friend std::ostream &operator<<(std::ostream &os, LogMapEntry &e); }; template using LogMapEntries = std::list>; template class LogMap { public: LogMap(CephContext *cct); LogMap(const LogMap&) = delete; LogMap &operator=(const LogMap&) = delete; void add_log_entry(std::shared_ptr log_entry); void add_log_entries(std::list> &log_entries); void remove_log_entry(std::shared_ptr log_entry); void remove_log_entries(std::list> &log_entries); std::list> find_log_entries(BlockExtent block_extent); LogMapEntries find_map_entries(BlockExtent block_extent); private: void add_log_entry_locked(std::shared_ptr log_entry); void remove_log_entry_locked(std::shared_ptr log_entry); void add_map_entry_locked(LogMapEntry &map_entry); void remove_map_entry_locked(LogMapEntry &map_entry); void adjust_map_entry_locked(LogMapEntry &map_entry, BlockExtent &new_extent); void split_map_entry_locked(LogMapEntry &map_entry, BlockExtent &removed_extent); std::list> find_log_entries_locked(const BlockExtent &block_extent); LogMapEntries find_map_entries_locked(const BlockExtent &block_extent); using LogMapEntryT = LogMapEntry; class LogMapEntryCompare { public: bool operator()(const LogMapEntryT &lhs, const LogMapEntryT &rhs) const; }; using BlockExtentToLogMapEntries = std::set; CephContext *m_cct; ceph::mutex m_lock; BlockExtentToLogMapEntries m_block_to_log_entry_map; }; } //namespace pwl } //namespace cache } //namespace librbd #endif //CEPH_LIBRBD_CACHE_RWL_LOG_MAP_H