// -*- 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) 2004-2006 Sage Weil * * 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 CEPH_LOGSEGMENT_H #define CEPH_LOGSEGMENT_H #include "include/elist.h" #include "include/interval_set.h" #include "include/Context.h" #include "MDSContext.h" #include "mdstypes.h" #include "CInode.h" #include "CDentry.h" #include "CDir.h" #include "include/unordered_set.h" using ceph::unordered_set; class CDir; class CInode; class CDentry; class MDSRank; struct MDPeerUpdate; class LogSegment { public: using seq_t = uint64_t; LogSegment(uint64_t _seq, loff_t off=-1) : seq(_seq), offset(off), end(off), dirty_dirfrags(member_offset(CDir, item_dirty)), new_dirfrags(member_offset(CDir, item_new)), dirty_inodes(member_offset(CInode, item_dirty)), dirty_dentries(member_offset(CDentry, item_dirty)), open_files(member_offset(CInode, item_open_file)), dirty_parent_inodes(member_offset(CInode, item_dirty_parent)), dirty_dirfrag_dir(member_offset(CInode, item_dirty_dirfrag_dir)), dirty_dirfrag_nest(member_offset(CInode, item_dirty_dirfrag_nest)), dirty_dirfrag_dirfragtree(member_offset(CInode, item_dirty_dirfrag_dirfragtree)) {} void try_to_expire(MDSRank *mds, MDSGatherBuilder &gather_bld, int op_prio); void purge_inodes_finish(interval_set& inos){ purging_inodes.subtract(inos); if (NULL != purged_cb && purging_inodes.empty()) purged_cb->complete(0); } void set_purged_cb(MDSContext* c){ ceph_assert(purged_cb == NULL); purged_cb = c; } void wait_for_expiry(MDSContext *c) { ceph_assert(c != NULL); expiry_waiters.push_back(c); } const seq_t seq; uint64_t offset, end; int num_events = 0; // dirty items elist dirty_dirfrags, new_dirfrags; elist dirty_inodes; elist dirty_dentries; elist open_files; elist dirty_parent_inodes; elist dirty_dirfrag_dir; elist dirty_dirfrag_nest; elist dirty_dirfrag_dirfragtree; std::set truncating_inodes; interval_set purging_inodes; MDSContext* purged_cb = nullptr; std::map > pending_commit_tids; // mdstable std::set uncommitted_leaders; std::set uncommitted_peers; std::set uncommitted_fragments; // client request ids std::map last_client_tids; // potentially dirty sessions std::set touched_sessions; // table version version_t inotablev = 0; version_t sessionmapv = 0; std::map tablev; MDSContext::vec expiry_waiters; }; #endif