mds->queue_waiters(it->second.waiting_for_finish);
// drop locks
if (state == EXPORT_LOCKING || state == EXPORT_DISCOVERING) {
- MDRequest *mdr = dynamic_cast<MDRequest*>(it->second.mut);
+ MDRequestRef mdr = ceph::static_pointer_cast<MDRequestImpl,
+ MutationImpl>(it->second.mut);
assert(mdr);
if (mdr->more()->waiting_on_slave.empty())
mds->mdcache->request_finish(mdr);
} else if (it->second.mut) {
- Mutation *mut = it->second.mut;
+ MutationRef& mut = it->second.mut;
mds->locker->drop_locks(mut);
mut->cleanup();
- delete mut;
}
export_state.erase(it);
stat.state = EXPORT_LOCKING;
stat.peer = dest;
stat.tid = mdr->reqid.tid;
- stat.mut = mdr.get();
+ stat.mut = mdr;
dispatch_export_dir(mdr);
}
-void Migrator::dispatch_export_dir(MDRequest *mdr)
+void Migrator::dispatch_export_dir(MDRequestRef& mdr)
{
dout(7) << "dispatch_export_dir " << *mdr << dendl;
CDir *dir = mdr->more()->export_dir;
} else {
assert(it->second.state == EXPORT_DISCOVERING);
// release locks to avoid deadlock
- MDRequest *mdr = dynamic_cast<MDRequest*>(it->second.mut);
+ MDRequestRef mdr = ceph::static_pointer_cast<MDRequestImpl,
+ MutationImpl>(it->second.mut);
assert(mdr);
mds->mdcache->request_finish(mdr);
- it->second.mut = NULL;
+ it->second.mut.reset();
// freeze the subtree
it->second.state = EXPORT_FREEZING;
dir->auth_unpin(this);
return;
}
- it->second.mut = new Mutation;
+ it->second.mut = MutationRef(new MutationImpl);
if (diri->is_auth())
it->second.mut->auth_pin(diri);
mds->locker->rdlock_take_set(rdlocks, it->second.mut);
mds->queue_waiters(it->second.waiting_for_finish);
// unpin path
- Mutation *mut = it->second.mut;
+ MutationRef& mut = it->second.mut;
if (mut) {
mds->locker->drop_locks(mut);
mut->cleanup();
- delete mut;
}
export_state.erase(it);
bool success = true;
if (dir->get_inode()->filelock.can_wrlock(-1) &&
dir->get_inode()->nestlock.can_wrlock(-1)) {
- it->second.mut = new Mutation;
+ it->second.mut = MutationRef(new MutationImpl);
// force some locks. hacky.
mds->locker->wrlock_force(&dir->inode->filelock, it->second.mut);
mds->locker->wrlock_force(&dir->inode->nestlock, it->second.mut);
if (it->second.mut) {
mds->locker->drop_locks(it->second.mut);
it->second.mut->cleanup();
- delete it->second.mut;
}
import_state.erase(it);
it->second.peer_exports.swap(peer_exports);
// clear import state (we're done!)
- Mutation *mut = it->second.mut;
+ MutationRef& mut = it->second.mut;
import_state.erase(it);
mds->mdlog->start_submit_entry(new EImportFinish(dir, true));
if (mut) {
mds->locker->drop_locks(mut);
mut->cleanup();
- delete mut;
}
// re-eval imported caps
class EImportStart;
-struct Mutation;
-
class Migrator {
private:
MDS *mds;
set<int> notify_ack_waiting;
map<inodeno_t,map<client_t,Capability::Import> > peer_imported;
list<Context*> waiting_for_finish;
- Mutation *mut;
+ MutationRef mut;
// for freeze tree deadlock detection
utime_t last_cum_auth_pins_change;
int last_cum_auth_pins;
int num_remote_waiters; // number of remote authpin waiters
- export_state_t() : state(0), peer(0), tid(0), mut(NULL),
+ export_state_t() : state(0), peer(0), tid(0), mut(),
last_cum_auth_pins(0), num_remote_waiters(0) {}
};
list<ScatterLock*> updated_scatterlocks;
map<client_t,entity_inst_t> client_map;
map<CInode*, map<client_t,Capability::Export> > peer_exports;
- Mutation *mut;
- import_state_t() : state(0), peer(0), tid(0), mut(NULL) {}
+ MutationRef mut;
+ import_state_t() : state(0), peer(0), tid(0), mut() {}
};
map<dirfrag_t, import_state_t> import_state;
// -- import/export --
// exporter
public:
- void dispatch_export_dir(MDRequest *mdr);
+ void dispatch_export_dir(MDRequestRef& mdr);
void export_dir(CDir *dir, int dest);
void export_empty_import(CDir *dir);