#ifndef CEPH_MDS_SERVER_H
#define CEPH_MDS_SERVER_H
+#include <boost/utility/string_view.hpp>
+
#include "MDSRank.h"
#include "Mutation.h"
enum {
l_mdss_first = 1000,
+ l_mdss_dispatch_client_request,
+ l_mdss_dispatch_slave_request,
l_mdss_handle_client_request,
- l_mdss_handle_slave_request,
l_mdss_handle_client_session,
- l_mdss_dispatch_client_request,
+ l_mdss_handle_slave_request,
+ l_mdss_req_create,
+ l_mdss_req_getattr,
+ l_mdss_req_getfilelock,
+ l_mdss_req_link,
+ l_mdss_req_lookup,
l_mdss_req_lookuphash,
l_mdss_req_lookupino,
- l_mdss_req_lookupparent,
l_mdss_req_lookupname,
- l_mdss_req_lookup,
+ l_mdss_req_lookupparent,
l_mdss_req_lookupsnap,
- l_mdss_req_getattr,
+ l_mdss_req_lssnap,
+ l_mdss_req_mkdir,
+ l_mdss_req_mknod,
+ l_mdss_req_mksnap,
+ l_mdss_req_open,
+ l_mdss_req_readdir,
+ l_mdss_req_rename,
+ l_mdss_req_renamesnap,
+ l_mdss_req_rmdir,
+ l_mdss_req_rmsnap,
+ l_mdss_req_rmxattr,
l_mdss_req_setattr,
- l_mdss_req_setlayout,
l_mdss_req_setdirlayout,
- l_mdss_req_setxattr,
- l_mdss_req_rmxattr,
- l_mdss_req_readdir,
l_mdss_req_setfilelock,
- l_mdss_req_getfilelock,
- l_mdss_req_create,
- l_mdss_req_open,
- l_mdss_req_mknod,
- l_mdss_req_link,
- l_mdss_req_unlink,
- l_mdss_req_rmdir,
- l_mdss_req_rename,
- l_mdss_req_mkdir,
+ l_mdss_req_setlayout,
+ l_mdss_req_setxattr,
l_mdss_req_symlink,
- l_mdss_req_lssnap,
- l_mdss_req_mksnap,
- l_mdss_req_rmsnap,
- l_mdss_req_renamesnap,
- l_mdss_dispatch_slave_request,
+ l_mdss_req_unlink,
l_mdss_last,
};
// State for while in reconnect
MDSInternalContext *reconnect_done;
int failed_reconnects;
+ bool reconnect_evicting; // true if I am waiting for evictions to complete
+ // before proceeding to reconnect_gather_finish
friend class MDSContinuation;
friend class ServerContext;
bool waiting_for_reconnect(client_t c) const;
void dump_reconnect_status(Formatter *f) const;
- Session *get_session(Message *m);
void handle_client_session(class MClientSession *m);
void _session_logged(Session *session, uint64_t state_seq,
bool open, version_t pv, interval_set<inodeno_t>& inos,version_t piv);
version_t prepare_force_open_sessions(map<client_t,entity_inst_t> &cm,
- map<client_t,uint64_t>& sseqmap);
- void finish_force_open_sessions(map<client_t,entity_inst_t> &cm,
- map<client_t,uint64_t>& sseqmap,
+ map<client_t,pair<Session*,uint64_t> >& smap);
+ void finish_force_open_sessions(const map<client_t,pair<Session*,uint64_t> >& smap,
bool dec_import=true);
void flush_client_sessions(set<client_t>& client_set, MDSGatherBuilder& gather);
void finish_flush_session(Session *session, version_t seq);
void terminate_sessions();
void find_idle_sessions();
void kill_session(Session *session, Context *on_safe);
+ size_t apply_blacklist(const std::set<entity_addr_t> &blacklist);
void journal_close_session(Session *session, int state, Context *on_safe);
void reconnect_clients(MDSInternalContext *reconnect_done_);
void handle_client_reconnect(class MClientReconnect *m);
void reconnect_tick();
void recover_filelocks(CInode *in, bufferlist locks, int64_t client);
- void recall_client_state(float ratio);
+ void recall_client_state(void);
void force_clients_readonly();
// -- requests --
bool check_fragment_space(MDRequestRef& mdr, CDir *in);
bool check_access(MDRequestRef& mdr, CInode *in, unsigned mask);
bool _check_access(Session *session, CInode *in, unsigned mask, int caller_uid, int caller_gid, int setattr_uid, int setattr_gid);
- CDir *validate_dentry_dir(MDRequestRef& mdr, CInode *diri, const string& dname);
+ CDir *validate_dentry_dir(MDRequestRef& mdr, CInode *diri, boost::string_view dname);
CDir *traverse_to_auth_dir(MDRequestRef& mdr, vector<CDentry*> &trace, filepath refpath);
- CDentry *prepare_null_dentry(MDRequestRef& mdr, CDir *dir, const string& dname, bool okexist=false);
+ CDentry *prepare_null_dentry(MDRequestRef& mdr, CDir *dir, boost::string_view dname, bool okexist=false);
CDentry *prepare_stray_dentry(MDRequestRef& mdr, CInode *in);
CInode* prepare_new_inode(MDRequestRef& mdr, CDir *dir, inodeno_t useino, unsigned mode,
file_layout_t *layout=NULL);
bool _rmdir_prepare_witness(MDRequestRef& mdr, mds_rank_t who, vector<CDentry*>& trace, CDentry *straydn);
void handle_slave_rmdir_prep(MDRequestRef& mdr);
void _logged_slave_rmdir(MDRequestRef& mdr, CDentry *srcdn, CDentry *straydn);
- void _commit_slave_rmdir(MDRequestRef& mdr, int r);
+ void _commit_slave_rmdir(MDRequestRef& mdr, int r, CDentry *straydn);
void handle_slave_rmdir_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack);
void do_rmdir_rollback(bufferlist &rbl, mds_rank_t master, MDRequestRef& mdr);
void _rmdir_rollback_finish(MDRequestRef& mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn);