100
99
list<ScatterLock*> updated_locks;
102
101
list<CInode*> dirty_cow_inodes;
103
list<CDentry*> dirty_cow_dentries;
102
list<pair<CDentry*,version_t> > dirty_cow_dentries;
217
216
p != dirty_cow_inodes.end();
219
218
(*p)->_mark_dirty(ls);
220
for (list<CDentry*>::iterator p = dirty_cow_dentries.begin();
219
for (list<pair<CDentry*,version_t> >::iterator p = dirty_cow_dentries.begin();
221
220
p != dirty_cow_dentries.end();
223
(*p)->_mark_dirty(ls);
222
p->first->mark_dirty(p->second, ls);
225
224
for (list<ScatterLock*>::iterator p = updated_locks.begin();
226
225
p != updated_locks.end();
316
312
Context *slave_commit;
317
313
bufferlist rollback_bl;
321
frag_t fragment_base;
322
list<CDir*> fragment_start;
323
list<CDir*> fragment_result;
327
316
src_reanchor_atid(0), dst_reanchor_atid(0), inode_import_v(0),
328
317
destdn_was_remote_inode(0), was_link_merge(false),
331
fragment_in(0), fragment_bits(0) { }
338
326
session(0), item_session_request(this),
339
client_request(0), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
327
client_request(0), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
340
328
alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
341
329
slave_request(0),
349
337
session(0), item_session_request(this),
350
client_request(req), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
338
client_request(req), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
351
339
alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
352
340
slave_request(0),
358
346
Mutation(ri, by),
360
348
session(0), item_session_request(this),
361
client_request(0), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
349
client_request(0), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
362
350
alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
363
351
slave_request(0),
403
391
if (is_slave()) out << " slave_to mds" << slave_to_mds;
404
392
if (client_request) out << " cr=" << client_request;
405
393
if (slave_request) out << " sr=" << slave_request;
406
if (internal_op == MDS_INTERNAL_OP_FRAGMENT) out << " fragment";
446
433
hash_map<vinodeno_t,CInode*> inode_map; // map of inodes by ino
447
434
CInode *root; // root inode
448
435
CInode *myin; // .ceph/mds%d dir
449
CInode *stray; // my stray dir
437
CInode *strays[NUM_STRAY]; // my stray dir
440
CInode *get_stray() {
441
return strays[stray_index];
450
444
set<CInode*> base_inodes;
447
void advance_stray() {
448
stray_index = (stray_index+1)%NUM_STRAY;
453
451
DecayRate decayrate;
455
453
int num_inodes_with_caps;
458
456
ceph_file_layout default_file_layout;
459
ceph_file_layout default_dir_layout;
457
ceph_file_layout default_log_layout;
461
459
// -- client leases --
473
471
// -- client caps --
474
472
uint64_t last_cap_id;
476
void remove_client_cap(CInode *in, client_t client);
479
476
// -- discover --
477
struct discover_info_t {
488
discover_info_t() : tid(0), mds(-1), snap(CEPH_NOSNAP), want_base_dir(false), want_xlocked(false) {}
491
map<tid_t, discover_info_t> discovers;
492
tid_t discover_last_tid;
494
void _send_discover(discover_info_t& dis);
495
discover_info_t& _create_discover(int mds) {
496
discover_info_t& d = discovers[++discover_last_tid];
481
502
map<int, map<inodeno_t, list<Context*> > > waiting_for_base_ino;
483
// in process discovers, by mds.
484
// this is just enough info to kick any waiters in the event of a failure.
485
// FIXME: use pointers here instead of identifiers?
486
map<int, map<inodeno_t,int> > discover_dir;
487
map<int, map<dirfrag_t,int> > discover_dir_sub;
489
504
void discover_base_ino(inodeno_t want_ino, Context *onfinish, int from=-1);
490
505
void discover_dir_frag(CInode *base, frag_t approx_fg, Context *onfinish,
591
606
CInode **pcow_inode=0);
592
607
inode_t *journal_dirty_inode(Mutation *mut, EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP);
594
void project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snapid_t last,
595
CDir *parent, int linkunlink=0);
609
void project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first, int linkunlink);
610
void _project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snapid_t last,
611
CDir *parent, int linkunlink=0);
596
612
void project_rstat_frag_to_inode(nest_info_t& rstat, nest_info_t& accounted_rstat,
597
613
snapid_t ofirst, snapid_t last,
598
614
CInode *pin, bool cow_head);
657
673
void disambiguate_imports();
658
674
void recalc_auth_bits();
659
675
void trim_unlinked_inodes();
660
677
void remove_inode_recursive(CInode *in);
662
679
void add_rollback(metareqid_t reqid) {
663
680
need_resolve_rollback.insert(reqid);
677
694
void cancel_ambiguous_import(dirfrag_t dirino);
678
695
void finish_ambiguous_import(dirfrag_t dirino);
679
696
void resolve_start();
680
void send_resolve(int who);
697
void send_resolves();
681
698
void send_resolve_now(int who);
682
699
void send_resolve_later(int who);
683
700
void maybe_send_pending_resolves();
703
720
set<CInode*> rejoin_undef_inodes;
704
721
set<CInode*> rejoin_potential_updated_scatterlocks;
722
set<CDir*> rejoin_undef_dirfrags;
706
724
vector<CInode*> rejoin_recover_q, rejoin_check_q;
707
725
list<Context*> rejoin_waiters;
710
728
void handle_cache_rejoin(MMDSCacheRejoin *m);
711
729
void handle_cache_rejoin_weak(MMDSCacheRejoin *m);
712
730
CInode* rejoin_invent_inode(inodeno_t ino, snapid_t last);
731
CDir* rejoin_invent_dirfrag(dirfrag_t df);
713
732
void handle_cache_rejoin_strong(MMDSCacheRejoin *m);
714
void rejoin_scour_survivor_replicas(int from, MMDSCacheRejoin *ack);
733
void rejoin_scour_survivor_replicas(int from, MMDSCacheRejoin *ack, set<vinodeno_t>& acked_inodes);
715
734
void handle_cache_rejoin_ack(MMDSCacheRejoin *m);
716
735
void handle_cache_rejoin_purge(MMDSCacheRejoin *m);
717
736
void handle_cache_rejoin_missing(MMDSCacheRejoin *m);
755
774
reconnected_snaprealms[ino][client] = seq;
757
776
void process_imported_caps();
758
void process_reconnected_caps();
777
void choose_lock_states_and_reconnect_caps();
759
778
void prepare_realm_split(SnapRealm *realm, client_t client, inodeno_t ino,
760
779
map<client_t,MClientSnap*>& splits);
761
780
void do_realm_invalidate_and_update_notify(CInode *in, int snapop, bool nosend=false);
774
793
void check_realm_past_parents(SnapRealm *realm);
775
794
void open_snap_parents();
796
void open_undef_dirfrags();
797
void opened_undef_dirfrag(CDir *dir) {
798
rejoin_undef_dirfrags.erase(dir);
777
801
void reissue_all_caps();
780
804
friend class Locker;
781
805
friend class Migrator;
782
friend class Renamer;
783
806
friend class MDBalancer;
831
853
map<int,class MCacheExpire*>& expiremap);
832
854
void send_expire_messages(map<int, MCacheExpire*>& expiremap);
833
855
void trim_non_auth(); // trim out trimmable non-auth items
856
bool trim_non_auth_subtree(CDir *directory);
835
858
void trim_client_leases();
836
859
void check_memory_usage();
846
869
bool did_shutdown_log_cap;
872
bool have_inode(vinodeno_t vino) {
873
return inode_map.count(vino) ? true:false;
849
875
bool have_inode(inodeno_t ino, snapid_t snap=CEPH_NOSNAP) {
850
876
return have_inode(vinodeno_t(ino, snap));
852
bool have_inode(vinodeno_t vino) { return inode_map.count(vino) ? true:false; }
854
878
CInode* get_inode(vinodeno_t vino) {
855
return get_inode(vino.ino, vino.snapid);
857
CInode* get_inode(inodeno_t ino, snapid_t s=CEPH_NOSNAP) {
858
vinodeno_t vino(ino, s);
859
879
if (have_inode(vino))
860
880
return inode_map[vino];
883
CInode* get_inode(inodeno_t ino, snapid_t s=CEPH_NOSNAP) {
884
return get_inode(vinodeno_t(ino, s));
864
887
CDir* get_dirfrag(dirfrag_t df) {
865
888
if (!have_inode(df.ino)) return NULL;
1016
1039
friend class C_MDC_PurgeStrayLoggedTruncate;
1017
1040
friend class C_MDC_PurgeStrayPurged;
1018
1041
void reintegrate_stray(CDentry *dn, CDentry *rlink);
1019
void migrate_stray(CDentry *dn, int src, int dest);
1042
void migrate_stray(CDentry *dn, int dest);
1022
1045
// == messages ==
1050
1073
CDir* forge_replica_dir(CInode *diri, frag_t fg, int from);
1051
1074
CDentry *add_replica_dentry(bufferlist::iterator& p, CDir *dir, list<Context*>& finished);
1052
1075
CInode *add_replica_inode(bufferlist::iterator& p, CDentry *dn, list<Context*>& finished);
1077
void replicate_stray(CDentry *straydn, int who, bufferlist& bl);
1053
1078
CDentry *add_replica_stray(bufferlist &bl, int from);
1055
1080
// -- namespace --
1066
1091
void adjust_dir_fragments(CInode *diri, frag_t basefrag, int bits,
1067
1092
list<CDir*>& frags, list<Context*>& waiters, bool replay);
1093
void adjust_dir_fragments(CInode *diri,
1094
list<CDir*>& srcfrags,
1095
frag_t basefrag, int bits,
1096
list<CDir*>& resultfrags,
1097
list<Context*>& waiters,
1068
1100
friend class EFragment;
1102
bool can_fragment_lock(CInode *diri);
1103
bool can_fragment(CInode *diri, list<CDir*>& dirs);
1071
1106
void split_dir(CDir *dir, int byn);
1107
void merge_dir(CInode *diri, frag_t fg);
1074
void dispatch_fragment(MDRequest *mdr);
1075
void fragment_mark_and_complete(MDRequest *mdr);
1076
void fragment_go(MDRequest *mdr);
1077
void fragment_stored(MDRequest *mdr);
1078
void fragment_logged(MDRequest *mdr);
1079
friend class C_MDC_FragmentGo;
1110
void fragment_freeze_dirs(list<CDir*>& dirs, C_Gather *gather);
1111
void fragment_mark_and_complete(list<CDir*>& dirs);
1112
void fragment_frozen(list<CDir*>& dirs, frag_t basefrag, int bits);
1113
void fragment_unmark_unfreeze_dirs(list<CDir*>& dirs);
1114
void fragment_stored(list<CDir*>& resultfrags, frag_t basefrag, int bits);
1115
void fragment_logged(Mutation *mut, list<CDir*>& resultfrags, frag_t basefrag, int bits);
1116
friend class C_MDC_FragmentFrozen;
1080
1117
friend class C_MDC_FragmentMarking;
1081
1118
friend class C_MDC_FragmentStored;
1082
1119
friend class C_MDC_FragmentLogged;