#include <set>
#include <string>
#include <string_view>
+#include <vector>
#include "common/config.h"
#include "include/buffer_fwd.h"
class bloom_filter;
class CDentry;
class MDCache;
+class MDSContext;
std::ostream& operator<<(std::ostream& out, const class CDir& dir);
void try_remove_dentries_for_stray();
bool try_trim_snap_dentry(CDentry *dn, const std::set<snapid_t>& snaps);
- void split(int bits, std::vector<CDir*>* subs, MDSContext::vec& waiters, bool replay);
- void merge(const std::vector<CDir*>& subs, MDSContext::vec& waiters, bool replay);
+ void split(int bits, std::vector<CDir*>* subs, std::vector<MDSContext*>& waiters, bool replay);
+ void merge(const std::vector<CDir*>& subs, std::vector<MDSContext*>& waiters, bool replay);
bool should_split() const;
bool should_split_fast() const;
return waiting_on_dentry.count(string_snap_t(dname, snap));
}
void add_dentry_waiter(std::string_view dentry, snapid_t snap, MDSContext *c);
- void take_dentry_waiting(std::string_view dentry, snapid_t first, snapid_t last, MDSContext::vec& ls);
+ void take_dentry_waiting(std::string_view dentry, snapid_t first, snapid_t last, std::vector<MDSContext*>& ls);
void add_waiter(uint64_t mask, MDSContext *c) override;
- void take_waiting(uint64_t mask, MDSContext::vec& ls) override; // may include dentry waiters
+ void take_waiting(uint64_t mask, std::vector<MDSContext*>& ls) override; // may include dentry waiters
void finish_waiting(uint64_t mask, int result = 0); // ditto
// -- import/export --
/* If you set up the bloom filter, you must keep it accurate!
* It's deleted when you mark_complete() and is deliberately not serialized.*/
- mempool::mds_co::compact_map<version_t, MDSContext::vec_alloc<mempool::mds_co::pool_allocator> > waiting_for_commit;
+ mempool::mds_co::compact_map<version_t, std::vector<MDSContext*, mempool::mds_co::pool_allocator<MDSContext*>>> waiting_for_commit;
// -- waiters --
- mempool::mds_co::map< string_snap_t, MDSContext::vec_alloc<mempool::mds_co::pool_allocator> > waiting_on_dentry; // FIXME string_snap_t not in mempool
+ mempool::mds_co::map< string_snap_t, std::vector<MDSContext*, mempool::mds_co::pool_allocator<MDSContext*>>> waiting_on_dentry; // FIXME string_snap_t not in mempool
private:
friend std::ostream& operator<<(std::ostream& out, const class CDir& dir);
void remove_null_dentries();
void prepare_new_fragment(bool replay);
- void prepare_old_fragment(std::map<string_snap_t, MDSContext::vec >& dentry_waiters, bool replay);
+ void prepare_old_fragment(std::map<string_snap_t, std::vector<MDSContext*> >& dentry_waiters, bool replay);
void steal_dentry(CDentry *dn); // from another dir. used by merge/split.
- void finish_old_fragment(MDSContext::vec& waiters, bool replay);
+ void finish_old_fragment(std::vector<MDSContext*>& waiters, bool replay);
void init_fragment_pins();
std::string get_path() const;
#include "include/compact_set.h"
#include "MDSCacheObject.h"
-#include "MDSContext.h"
#include "flock.h"
#include "inode_backtrace.h" // for inode_backtrace_t
class CDir;
class CInode;
class MDCache;
+class MDSContext;
class LogSegment;
struct SnapRealm;
class Session;
void set_ambiguous_auth() {
state_set(STATE_AMBIGUOUSAUTH);
}
- void clear_ambiguous_auth(MDSContext::vec& finished);
+ void clear_ambiguous_auth(std::vector<MDSContext*>& finished);
void clear_ambiguous_auth();
const inode_const_ptr& get_inode() const {
void decode_store(ceph::buffer::list::const_iterator& bl);
void add_dir_waiter(frag_t fg, MDSContext *c);
- void take_dir_waiting(frag_t fg, MDSContext::vec& ls);
+ void take_dir_waiting(frag_t fg, std::vector<MDSContext*>& ls);
bool is_waiting_for_dir(frag_t fg) {
return waiting_on_dir.count(fg);
}
void add_waiter(uint64_t tag, MDSContext *c) override;
- void take_waiting(uint64_t tag, MDSContext::vec& ls) override;
+ void take_waiting(uint64_t tag, std::vector<MDSContext*>& ls) override;
// -- encode/decode helpers --
void _encode_base(ceph::buffer::list& bl, uint64_t features);
void _encode_locks_state_for_replica(ceph::buffer::list& bl, bool need_recover);
void _encode_locks_state_for_rejoin(ceph::buffer::list& bl, int rep);
void _decode_locks_state_for_replica(ceph::buffer::list::const_iterator& p, bool is_new);
- void _decode_locks_rejoin(ceph::buffer::list::const_iterator& p, MDSContext::vec& waiters,
+ void _decode_locks_rejoin(ceph::buffer::list::const_iterator& p, std::vector<MDSContext*>& waiters,
std::list<SimpleLock*>& eval_locks, bool survivor);
// -- import/export --
/* Freeze the inode. auth_pin_allowance lets the caller account for any
* auth_pins it is itself holding/responsible for. */
bool freeze_inode(int auth_pin_allowance=0);
- void unfreeze_inode(MDSContext::vec& finished);
+ void unfreeze_inode(std::vector<MDSContext*>& finished);
void unfreeze_inode();
void freeze_auth_pin();
ceph_lock_state_t *flock_locks = nullptr;
// -- waiting --
- mempool::mds_co::compact_map<frag_t, MDSContext::vec > waiting_on_dir;
+ mempool::mds_co::compact_map<frag_t, std::vector<MDSContext*>> waiting_on_dir;
// -- freezing inode --
#include <memory>
#include <set>
#include <string_view>
+#include <vector>
#include "common/ref.h"
#include "include/mempool.h"
#include "include/types.h"
-#include "MDSContext.h"
#include "mdstypes.h" // for xattr_map
#include "Mutation.h"
#include "SimpleLock.h"
class MClientReply;
class MDCache;
class MLock;
+class MDSContext;
class MDSRank;
class Session;
class CDentry;
void eval_lock_caches(Capability *cap);
void put_lock_cache(MDLockCache* lock_cache);
- void eval_gather(SimpleLock *lock, bool first=false, bool *need_issue=0, MDSContext::vec *pfinishers=0);
+ void eval_gather(SimpleLock *lock, bool first=false, bool *need_issue=0, std::vector<MDSContext*> *pfinishers=0);
void eval(SimpleLock *lock, bool *need_issue);
- void eval_any(SimpleLock *lock, bool *need_issue, MDSContext::vec *pfinishers=0, bool first=false) {
+ void eval_any(SimpleLock *lock, bool *need_issue, std::vector<MDSContext*> *pfinishers=0, bool first=false) {
if (!lock->is_stable())
eval_gather(lock, first, need_issue, pfinishers);
else if (lock->get_parent()->is_auth())
#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"
class CDir;
class CInode;
class CDentry;
+class MDSContext;
+class C_MDSInternalNoop;
+using MDSGather = C_GatherBase<MDSContext, C_MDSInternalNoop>;
+using MDSGatherBuilder = C_GatherBuilderBase<MDSContext, MDSGather>;
class MDSRank;
struct MDPeerUpdate;
{}
void try_to_expire(MDSRank *mds, MDSGatherBuilder &gather_bld, int op_prio);
- void purge_inodes_finish(interval_set<inodeno_t>& inos){
- purging_inodes.subtract(inos);
- if (NULL != purged_cb &&
- purging_inodes.empty())
- purged_cb->complete(0);
- }
+ void purge_inodes_finish(interval_set<inodeno_t>& inos);
void set_purged_cb(MDSContext* c){
ceph_assert(purged_cb == NULL);
purged_cb = c;
version_t sessionmapv = 0;
std::map<int,version_t> tablev;
- MDSContext::vec expiry_waiters;
+ std::vector<MDSContext*> expiry_waiters;
};
static inline std::ostream& operator<<(std::ostream& out, const LogSegment& ls) {
void encode_replica_inode(CInode *in, mds_rank_t to, bufferlist& bl,
uint64_t features);
- void decode_replica_dir(CDir *&dir, bufferlist::const_iterator& p, CInode *diri, mds_rank_t from, MDSContext::vec& finished);
- void decode_replica_dentry(CDentry *&dn, bufferlist::const_iterator& p, CDir *dir, MDSContext::vec& finished);
- void decode_replica_inode(CInode *&in, bufferlist::const_iterator& p, CDentry *dn, MDSContext::vec& finished);
+ void decode_replica_dir(CDir *&dir, bufferlist::const_iterator& p, CInode *diri, mds_rank_t from, std::vector<MDSContext*>& finished);
+ void decode_replica_dentry(CDentry *&dn, bufferlist::const_iterator& p, CDir *dir, std::vector<MDSContext*>& finished);
+ void decode_replica_inode(CInode *&in, bufferlist::const_iterator& p, CDentry *dn, std::vector<MDSContext*>& finished);
void encode_replica_stray(CDentry *straydn, mds_rank_t who, bufferlist& bl);
void decode_replica_stray(CDentry *&straydn, CInode **in, const bufferlist &bl, mds_rank_t from);
ceph_tid_t discover_last_tid = 0;
// waiters
- std::map<int, std::map<inodeno_t, MDSContext::vec > > waiting_for_base_ino;
+ std::map<int, std::map<inodeno_t, std::vector<MDSContext*> > > waiting_for_base_ino;
std::map<inodeno_t,std::map<client_t, reconnected_cap_info_t> > reconnected_caps; // inode -> client -> snap_follows,realmino
std::map<inodeno_t,std::map<client_t, snapid_t> > reconnected_snaprealms; // realmino -> client -> realmseq
uleader() {}
std::set<mds_rank_t> peers;
LogSegment *ls = nullptr;
- MDSContext::vec waiters;
+ std::vector<MDSContext*> waiters;
bool safe = false;
bool committing = false;
bool recovering = false;
mds_rank_t leader;
LogSegment *ls = nullptr;
MDPeerUpdate *su = nullptr;
- MDSContext::vec waiters;
+ std::vector<MDSContext*> waiters;
};
struct open_ino_info_t {
version_t tid = 0;
int64_t pool = -1;
int last_err = 0;
- MDSContext::vec waiters;
+ std::vector<MDSContext*> waiters;
};
ceph_tid_t open_ino_last_tid = 0;
std::map<inodeno_t,open_ino_info_t> opening_inodes;
bool open_ino_batch = false;
- std::map<CDir*, std::pair<std::vector<std::string>, MDSContext::vec> > open_ino_batched_fetch;
+ std::map<CDir*, std::pair<std::vector<std::string>, std::vector<MDSContext*>> > open_ino_batched_fetch;
friend struct C_MDC_OpenInoTraverseDir;
friend struct C_MDC_OpenInoParentOpened;
std::map<inodeno_t,std::map<client_t,std::map<mds_rank_t,cap_reconnect_t> > > cap_imports; // ino -> client -> frommds -> capex
std::set<inodeno_t> cap_imports_missing;
- std::map<inodeno_t, MDSContext::vec > cap_reconnect_waiters;
+ std::map<inodeno_t, std::vector<MDSContext*> > cap_reconnect_waiters;
int cap_imports_num_opening = 0;
std::set<CInode*> rejoin_undef_inodes;
std::vector<CInode*> rejoin_recover_q, rejoin_check_q;
std::list<SimpleLock*> rejoin_eval_locks;
- MDSContext::vec rejoin_waiters;
+ std::vector<MDSContext*> rejoin_waiters;
std::unique_ptr<MDSContext> rejoin_done;
std::unique_ptr<MDSContext> resolve_done;
int bits = 0;
bool committed = false;
LogSegment *ls = nullptr;
- MDSContext::vec waiters;
+ std::vector<MDSContext*> waiters;
frag_vec_t old_frags;
bufferlist rollback;
};
void trim_non_auth(); // trim out trimmable non-auth items
void adjust_dir_fragments(CInode *diri, frag_t basefrag, int bits,
- std::vector<CDir*>* frags, MDSContext::vec& waiters, bool replay);
+ std::vector<CDir*>* frags, std::vector<MDSContext*>& waiters, bool replay);
void adjust_dir_fragments(CInode *diri,
const std::vector<CDir*>& srcfrags,
frag_t basefrag, int bits,
std::vector<CDir*>* resultfrags,
- MDSContext::vec& waiters,
+ std::vector<MDSContext*>& waiters,
bool replay);
CDir *force_dir_fragment(CInode *diri, frag_t fg, bool replay=true);
void get_force_dirfrag_bound_set(const std::vector<dirfrag_t>& dfs, std::set<CDir*>& bounds);
std::pair<dirfrag_t, std::string> shutdown_export_next;
bool opening_root = false, open = false;
- MDSContext::vec waiting_for_open;
+ std::vector<MDSContext*> waiting_for_open;
// -- snaprealms --
SnapRealm *global_snaprealm = nullptr;
bool already_replayed = false;
- MDSContext::vec waitfor_replay;
+ std::vector<MDSContext*> waitfor_replay;
// -- segments --
std::map<uint64_t,LogSegment*> segments;
#include "include/types.h"
#include "mdstypes.h"
-#include "MDSContext.h"
#include "include/elist.h"
#define MDS_REF_SET // define me for improved debug output, sanity checking
}
waiting.insert(std::pair<waiter_seq_t, waiter>(seq, waiter{mask, c}));
}
- virtual void take_waiting(uint64_t mask, MDSContext::vec& ls) {
+ virtual void take_waiting(uint64_t mask, std::vector<MDSContext*>& ls) {
take_waiting(waitmask_t(mask), ls);
}
- void take_waiting(waitmask_t mask, MDSContext::vec& ls);
+ void take_waiting(waitmask_t mask, std::vector<MDSContext*>& ls);
void finish_waiting(uint64_t mask, int result = 0) {
finish_waiting(waitmask_t(mask), result);
}
c->send_message2(m);
}
+void MDSRank::kick_waiters_for_any_client_connection() {
+ finish_contexts(g_ceph_context, waiting_for_any_client_connection);
+}
+
class C_MDS_RetrySendMessageMDS : public MDSInternalContext {
public:
C_MDS_RetrySendMessageMDS(MDSRank* mds, mds_rank_t who, ref_t<Message> m)
#include "DamageTable.h"
#include "MDSMap.h"
#include "SessionMap.h"
-#include "MDSContext.h"
#include "PurgeQueue.h"
#include "MetricsHandler.h"
#include "mon/MonClient.h"
// benefit of those including this header and using MDSRank::logger
#include "common/perf_counters.h"
+class MDSContext;
class MDSMetaRequest;
class MMDSMap;
finished_queue.push_front(c);
progress_thread.signal();
}
- void queue_waiters(MDSContext::vec& ls) {
- MDSContext::vec v;
+ void queue_waiters(std::vector<MDSContext*>& ls) {
+ std::vector<MDSContext*> v;
v.swap(ls);
std::copy(v.begin(), v.end(), std::back_inserter(finished_queue));
progress_thread.signal();
}
- void queue_waiters_front(MDSContext::vec& ls) {
- MDSContext::vec v;
+ void queue_waiters_front(std::vector<MDSContext*>& ls) {
+ std::vector<MDSContext*> v;
v.swap(ls);
std::copy(v.rbegin(), v.rend(), std::front_inserter(finished_queue));
progress_thread.signal();
void wait_for_any_client_connection(MDSContext *c) {
waiting_for_any_client_connection.push_back(c);
}
- void kick_waiters_for_any_client_connection(void) {
- finish_contexts(g_ceph_context, waiting_for_any_client_connection);
- }
+ void kick_waiters_for_any_client_connection();
void wait_for_active(MDSContext *c) {
waiting_for_active.push_back(c);
}
std::unique_ptr<MetricAggregator> metric_aggregator;
std::list<cref_t<Message>> waiting_for_nolaggy;
- MDSContext::que finished_queue;
+ std::deque<MDSContext*> finished_queue;
// Dispatch, retry, queues
int dispatch_depth = 0;
ceph_tid_t last_tid = 0; // for mds-initiated requests (e.g. stray rename)
- MDSContext::vec waiting_for_active, waiting_for_replay, waiting_for_rejoin,
+ std::vector<MDSContext*> waiting_for_active, waiting_for_replay, waiting_for_rejoin,
waiting_for_reconnect, waiting_for_resolve;
- MDSContext::vec waiting_for_any_client_connection;
- MDSContext::que replay_queue;
+ std::vector<MDSContext*> waiting_for_any_client_connection;
+ std::deque<MDSContext*> replay_queue;
bool replaying_requests_done = false;
- std::map<mds_rank_t, MDSContext::vec> waiting_for_active_peer;
- std::map<mds_rank_t, MDSContext::vec> waiting_for_bootstrapping_peer;
- std::map<epoch_t, MDSContext::vec> waiting_for_mdsmap;
+ std::map<mds_rank_t, std::vector<MDSContext*>> waiting_for_active_peer;
+ std::map<mds_rank_t, std::vector<MDSContext*>> waiting_for_bootstrapping_peer;
+ std::map<epoch_t, std::vector<MDSContext*>> waiting_for_mdsmap;
epoch_t osd_epoch_barrier = 0;
*/
#include "MDSTable.h"
+#include "MDSContext.h"
#include "MDSRank.h"
#include "osdc/Objecter.h"
#include "include/types.h" // for version_t
#include "include/cephfs/types.h" // for mds_rank_t
-#include "MDSContext.h"
-
#include <map>
#include <string>
#include <string_view>
#include <vector>
+class Context;
+class MDSContext;
class MDSRank;
class MDSTable {
version_t version = 0, committing_version = 0, committed_version = 0, projected_version = 0;
- std::map<version_t, MDSContext::vec > waitfor_save;
+ std::map<version_t, std::vector<MDSContext*> > waitfor_save;
};
#endif
#define CEPH_MDSTABLECLIENT_H
#include "include/types.h"
-#include "MDSContext.h"
#include "mds_table_types.h"
#include "mdstypes.h" // for mds_rank_t
#include "common/ref.h" // for cref_t
#include <map>
#include <set>
+class MDSContext;
class MMDSTableRequest;
class MMDSTableQuery;
class MDSRank;
// pending commits
std::map<version_t, LogSegment*> pending_commit;
- std::map<version_t, MDSContext::vec > ack_waiters;
+ std::map<version_t, std::vector<MDSContext*> > ack_waiters;
};
#endif
*/
#include "MDSTableServer.h"
+#include "MDSContext.h"
#include "MDSRank.h"
#include "MDLog.h"
#include "msg/Messenger.h"
#include "include/types.h"
#include "Capability.h"
-#include "MDSContext.h"
#include "Mutation.h" // for MDRequestRef
#include <map>
#include <string_view>
class MDCache;
+class MDSContext;
class MDSMap;
class MDSRank;
class MExportCaps;
std::map<client_t,client_metadata_t>& exported_client_metadata_map);
void finish_export_inode(CInode *in, mds_rank_t target,
std::map<client_t,Capability::Import>& peer_imported,
- MDSContext::vec& finished);
+ std::vector<MDSContext*>& finished);
void finish_export_inode_caps(CInode *in, mds_rank_t target,
std::map<client_t,Capability::Import>& peer_imported);
uint64_t &num_exported);
void finish_export_dir(CDir *dir, mds_rank_t target,
std::map<inodeno_t,std::map<client_t,Capability::Import> >& peer_imported,
- MDSContext::vec& finished, int *num_dentries);
+ std::vector<MDSContext*>& finished, int *num_dentries);
void clear_export_proxy_pins(CDir *dir);
void child_export_finish(std::shared_ptr<export_base_t>& parent, bool success);
void encode_export_prep_trace(bufferlist& bl, CDir *bound, CDir *dir, export_state_t &es,
std::set<inodeno_t> &inodes_added, std::set<dirfrag_t> &dirfrags_added);
- void decode_export_prep_trace(bufferlist::const_iterator& blp, mds_rank_t oldauth, MDSContext::vec &finished);
+ void decode_export_prep_trace(bufferlist::const_iterator& blp, mds_rank_t oldauth, std::vector<MDSContext*> &finished);
void handle_gather_caps(const cref_t<MGatherCaps> &m);
#include "include/elist.h"
#include "include/filepath.h"
-#include "MDSContext.h"
-
#include "Capability.h"
#include "common/StackStringStream.h"
class CDir;
class CDentry;
class MDSCacheObject;
+class MDSContext;
class Session;
class ScatterLock;
class SimpleLock;
Context *peer_commit = nullptr;
ceph::buffer::list rollback_bl;
- MDSContext::vec waiting_for_finish;
+ std::vector<MDSContext*> waiting_for_finish;
std::map<inodeno_t, metareqid_t> quiesce_ops;
#include "mdstypes.h"
-#include "MDSContext.h"
-
#include "common/config_proxy.h" // for class ConfigProxy
#include "global/global_context.h" // for g_conf()
struct inode_backpointer_t;
+class Context;
class CDir;
class CInode;
+class MDSContext;
class MDSRank;
class Anchor;
class OpenedAnchor;
std::vector<std::map<std::string, bufferlist> > loaded_journals;
std::map<inodeno_t, RecoveredAnchor> loaded_anchor_map;
- MDSContext::vec waiting_for_load;
+ std::vector<MDSContext*> waiting_for_load;
bool load_done = false;
enum {
};
unsigned prefetch_state = 0;
unsigned num_opening_inodes = 0;
- MDSContext::vec waiting_for_prefetch;
+ std::vector<MDSContext*> waiting_for_prefetch;
std::map<uint64_t, std::vector<inodeno_t> > logseg_destroyed_inos;
std::set<inodeno_t> destroyed_inos_set;
#include "SimpleLock.h"
-#include "MDSContext.h"
#include "include/xlist.h"
+class MDSContext;
+
class ScatterLock : public SimpleLock {
public:
ScatterLock(MDSCacheObject *o, const LockType *lt) :
encode(s, bl);
}
- void decode_state_rejoin(ceph::buffer::list::const_iterator& p, MDSContext::vec& waiters, bool survivor) {
+ void decode_state_rejoin(ceph::buffer::list::const_iterator& p, std::vector<MDSContext*>& waiters, bool survivor) {
SimpleLock::decode_state_rejoin(p, waiters, survivor);
if (is_flushing()) {
set_dirty();
supported_metric_spec = feature_bitset_t(CEPHFS_METRIC_FEATURES_ALL);
}
+Server::~Server() {
+ g_ceph_context->get_perfcounters_collection()->remove(logger);
+ delete logger;
+ delete reconnect_done;
+}
+
void Server::dispatch(const cref_t<Message> &m)
{
switch (m->get_type()) {
class MDCache;
class MDLog;
class MDSContext;
+class C_MDSInternalNoop;
+using MDSGather = C_GatherBase<MDSContext, C_MDSInternalNoop>;
+using MDSGatherBuilder = C_GatherBuilderBase<MDSContext, MDSGather>;
+class MDSLogContextBase;
class MDSRank;
class Session;
struct SnapInfo;
};
explicit Server(MDSRank *m, MetricsHandler *metrics_handler);
- ~Server() {
- g_ceph_context->get_perfcounters_collection()->remove(logger);
- delete logger;
- delete reconnect_done;
- }
+ ~Server();
void create_logger();
#include "mds/MDSAuthCaps.h"
#include "common/DecayCounter.h"
-#include "MDSContext.h"
#include "Mutation.h" // for struct MDRequestImpl
#include "msg/Message.h"
struct MDRequestImpl;
+class MDSContext;
+class C_MDSInternalNoop;
+using MDSGather = C_GatherBase<MDSContext, C_MDSInternalNoop>;
+using MDSGatherBuilder = C_GatherBuilderBase<MDSContext, MDSGather>;
enum {
l_mdssm_first = 5500,
waitfor_flush[get_push_seq()].push_back(c);
return get_push_seq();
}
- void finish_flush(version_t seq, MDSContext::vec& ls) {
+ void finish_flush(version_t seq, std::vector<MDSContext*>& ls) {
while (!waitfor_flush.empty()) {
auto it = waitfor_flush.begin();
if (it->first > seq)
// -- caps --
uint32_t cap_gen = 0;
version_t cap_push_seq = 0; // cap push seq #
- std::map<version_t, MDSContext::vec > waitfor_flush; // flush session messages
+ std::map<version_t, std::vector<MDSContext*> > waitfor_flush; // flush session messages
// Has completed_requests been modified since the last time we
// wrote this session out?
MDSRank *mds;
std::map<int,xlist<Session*>*> by_state;
- std::map<version_t, MDSContext::vec> commit_waiters;
+ std::map<version_t, std::vector<MDSContext*>> commit_waiters;
// -- loading, saving --
inodeno_t ino;
- MDSContext::vec waiting_for_load;
+ std::vector<MDSContext*> waiting_for_load;
protected:
void _mark_dirty(Session *session, bool may_save);
#include <boost/intrusive_ptr.hpp>
#include "MDSCacheObject.h"
-#include "MDSContext.h"
// -- lock types --
// see CEPH_LOCK_*
struct MDLockCache;
struct MDLockCacheItem;
struct MutationImpl;
+class MDSContext;
typedef boost::intrusive_ptr<MutationImpl> MutationRef;
struct LockType {
void finish_waiters(uint64_t mask, int r=0) {
parent->finish_waiting(getmask(mask), r);
}
- void take_waiting(uint64_t mask, MDSContext::vec& ls) {
+ void take_waiting(uint64_t mask, std::vector<MDSContext*>& ls) {
parent->take_waiting(getmask(mask), ls);
}
void add_waiter(uint64_t mask, MDSContext *c) {
//assert(!is_stable() || gather_set.size() == 0); // gather should be empty in stable states.
return s;
}
- void set_state_rejoin(int s, MDSContext::vec& waiters, bool survivor) {
+ void set_state_rejoin(int s, std::vector<MDSContext*>& waiters, bool survivor) {
ceph_assert(!get_parent()->is_auth());
// If lock in the replica object was not in SYNC state when auth mds of the object failed.
if (is_new)
state = s;
}
- void decode_state_rejoin(ceph::buffer::list::const_iterator& p, MDSContext::vec& waiters, bool survivor) {
+ void decode_state_rejoin(ceph::buffer::list::const_iterator& p, std::vector<MDSContext*>& waiters, bool survivor) {
__s16 s;
using ceph::decode;
decode(s, p);
#include <map>
#include <set>
#include <string_view>
+#include <vector>
#include "MDSTableClient.h"
#include "snap.h"
std::set<version_t> committing_tids;
- std::map<version_t, MDSContext::vec > waiting_for_version;
+ std::map<version_t, std::vector<MDSContext*> > waiting_for_version;
uint64_t sync_reqid = 0;
bool synced = false;
}
}
+void LogSegment::purge_inodes_finish(interval_set<inodeno_t>& inos){
+ purging_inodes.subtract(inos);
+ if (NULL != purged_cb &&
+ purging_inodes.empty())
+ purged_cb->complete(0);
+}
+
// -----------------------
// EMetaBlob