From: Sage Weil Date: Wed, 4 Jun 2008 17:37:25 +0000 (-0700) Subject: mds: another FileLock fix; call predirty_nested with correct args everywhere X-Git-Tag: v0.3~170^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=287b5d2853e07eb79879d1fdb0699c4979e021bf;p=ceph.git mds: another FileLock fix; call predirty_nested with correct args everywhere --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 4b6a33cad2f..bacfcf420da 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -822,10 +822,10 @@ public: }; -bool Locker::check_inode_max_size(CInode *in, bool forcewrlock) +bool Locker::check_inode_max_size(CInode *in, bool forceupdate, __u64 new_size) { assert(in->is_auth()); - if (!forcewrlock && !in->filelock.can_wrlock()) { + if (!forceupdate && !in->filelock.can_wrlock()) { // try again later in->filelock.add_waiter(SimpleLock::WAIT_STABLE, new C_MDL_CheckMaxSize(this, in)); dout(10) << "check_inode_max_size can't wrlock, waiting on " << *in << dendl; @@ -839,8 +839,8 @@ bool Locker::check_inode_max_size(CInode *in, bool forcewrlock) new_max = 0; else if ((latest->size << 1) >= latest->max_size) new_max = latest->max_size ? (latest->max_size << 1):in->get_layout_size_increment(); - - if (new_max == latest->max_size)// && !force_journal) + + if (new_max == latest->max_size && !forceupdate) return false; // no change. dout(10) << "check_inode_max_size " << latest->max_size << " -> " << new_max @@ -852,8 +852,18 @@ bool Locker::check_inode_max_size(CInode *in, bool forcewrlock) inode_t *pi = in->project_inode(); pi->version = in->pre_dirty(); pi->max_size = new_max; + if (forceupdate) { + dout(10) << "check_inode_max_size also forcing size " + << pi->size << " -> " << new_size << dendl; + pi->size = new_size; + pi->dirstat.rbytes = new_size; + } + EOpen *le = new EOpen(mds->mdlog); - le->metablob.add_dir_context(in->get_parent_dir()); + if (forceupdate) // FIXME if/when we do max_size nested accounting + predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY); + else + le->metablob.add_dir_context(in->get_parent_dir()); le->metablob.add_primary_dentry(in->parent, true, 0, pi); le->add_ino(in->ino()); mut->ls->open_files.push_back(&in->xlist_open_file); @@ -1052,8 +1062,7 @@ void Locker::handle_client_file_caps(MClientFileCaps *m) mut->ls = mds->mdlog->get_current_segment(); file_wrlock_force(&in->filelock, mut); // wrlock for duration of journal mut->auth_pin(in); - predirty_nested(mut, &le->metablob, in, 0, true, false); - le->metablob.add_dir_context(in->get_parent_dir()); + predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, false); le->metablob.add_primary_dentry(in->parent, true, 0, pi); mds->mdlog->submit_entry(le, new C_Locker_FileUpdate_finish(this, in, mut, change_max)); } @@ -2327,7 +2336,7 @@ void Locker::scatter_writebehind(ScatterLock *lock) lock->clear_updated(); EUpdate *le = new EUpdate(mds->mdlog, "scatter_writebehind"); - predirty_nested(mut, &le->metablob, in, 0, true, false); + predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, false); le->metablob.add_primary_dentry(in->get_parent_dn(), true, 0, pi); mds->mdlog->submit_entry(le); @@ -3357,18 +3366,7 @@ bool Locker::file_sync(FileLock *lock) assert(in->is_auth()); assert(lock->is_stable()); - if (lock->get_state() == LOCK_LOCK) { - if (in->is_replicated()) { - bufferlist softdata; - lock->encode_locked_state(softdata); - send_lock_message(lock, LOCK_AC_SYNC, softdata); - } - - // change lock - lock->set_state(LOCK_SYNC); - issue_caps(in); // reissue caps - return true; - } else { + if (lock->get_state() != LOCK_LOCK) { // gather? switch (lock->get_state()) { case LOCK_MIXED: lock->set_state(LOCK_GSYNCM); break; @@ -3377,15 +3375,6 @@ bool Locker::file_sync(FileLock *lock) } int gather = 0; - if (in->is_replicated()) { - bufferlist softdata; - lock->encode_locked_state(softdata); - send_lock_message(lock, LOCK_AC_SYNC, softdata); - if (lock->get_state() != LOCK_GSYNCL) { // loner replica is already LOCK - lock->init_gather(); - gather++; - } - } int issued = in->get_caps_issued(); if (issued & ~lock->caps_allowed()) { issue_caps(in); @@ -3399,16 +3388,24 @@ bool Locker::file_sync(FileLock *lock) gather++; } - if (gather) + if (gather) { lock->get_parent()->auth_pin(); - else { - lock->set_state(LOCK_SYNC); - issue_caps(in); - return true; + return false; } } - return false; + assert(!lock->is_wrlocked()); // FIXME if we hit this we need a new gsynck state or somethin' + + // ok + if (in->is_replicated()) { + bufferlist softdata; + lock->encode_locked_state(softdata); + send_lock_message(lock, LOCK_AC_SYNC, softdata); + } + + lock->set_state(LOCK_SYNC); + issue_caps(in); + return true; } @@ -3530,11 +3527,7 @@ void Locker::file_loner(FileLock *lock) assert(in->count_nonstale_caps() == 1 && in->mds_caps_wanted.empty()); - if (lock->get_state() == LOCK_LOCK) { - // change lock. ignore replicas; they don't know about LONER. - lock->set_state(LOCK_LONER); - issue_caps(in); - } else { + if (lock->get_state() != LOCK_LOCK) { // LONER replicas are LOCK switch (lock->get_state()) { case LOCK_SYNC: lock->set_state(LOCK_GLONERR); break; case LOCK_MIXED: lock->set_state(LOCK_GLONERM); break; @@ -3557,13 +3550,14 @@ void Locker::file_loner(FileLock *lock) gather++; } - if (gather) + if (gather) { lock->get_parent()->auth_pin(); - else { - lock->set_state(LOCK_LONER); - issue_caps(in); + return; } } + + lock->set_state(LOCK_LONER); + issue_caps(in); } diff --git a/src/mds/Locker.h b/src/mds/Locker.h index 13b278b582e..3c97eb88472 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -213,7 +213,7 @@ protected: void file_update_finish(CInode *in, Mutation *mut, bool share); public: - bool check_inode_max_size(CInode *in, bool forcewrlock=false); + bool check_inode_max_size(CInode *in, bool forceupdate=false, __u64 newsize=0); private: void share_inode_max_size(CInode *in); diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index f55076d6c54..fbb23bd580d 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -2978,15 +2978,14 @@ void MDCache::_recovered(CInode *in, int r) { dout(10) << "_recovered r=" << r << " size=" << in->inode.size << " for " << *in << dendl; - // make sure this is in "newest" inode struct, and doesn't get thrown out.. - in->get_projected_inode()->size = in->inode.size; - file_recovering.erase(in); in->state_clear(CInode::STATE_RECOVERING); - in->auth_unpin(); + // make sure this is in "newest" inode struct, and gets journaled + in->get_projected_inode()->size = in->inode.size; + mds->locker->check_inode_max_size(in, true, in->inode.size); - mds->locker->check_inode_max_size(in, true); + in->auth_unpin(); do_file_recover(); } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index f64bed06431..e7ae5753227 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -1614,7 +1614,7 @@ void Server::handle_client_utime(MDRequest *mdr) mdr->ls = mdlog->get_current_segment(); EUpdate *le = new EUpdate(mdlog, "utime"); le->metablob.add_client_req(req->get_reqid()); - mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false); + mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); le->metablob.add_primary_dentry(cur->parent, true, 0, pi); mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur)); @@ -1655,7 +1655,7 @@ void Server::handle_client_chmod(MDRequest *mdr) mdr->ls = mdlog->get_current_segment(); EUpdate *le = new EUpdate(mdlog, "chmod"); le->metablob.add_client_req(req->get_reqid()); - mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false); + mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); le->metablob.add_primary_dentry(cur->parent, true, 0, pi); mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur)); @@ -1696,7 +1696,7 @@ void Server::handle_client_chown(MDRequest *mdr) mdr->ls = mdlog->get_current_segment(); EUpdate *le = new EUpdate(mdlog, "chown"); le->metablob.add_client_req(req->get_reqid()); - mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false); + mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); le->metablob.add_primary_dentry(cur->parent, true, 0, pi); mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur)); @@ -1755,7 +1755,7 @@ void Server::handle_client_setxattr(MDRequest *mdr) mdr->ls = mdlog->get_current_segment(); EUpdate *le = new EUpdate(mdlog, "setxattr"); le->metablob.add_client_req(req->get_reqid()); - mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false); + mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); le->metablob.add_primary_dentry(cur->parent, true, 0, pi); mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur)); @@ -1799,7 +1799,7 @@ void Server::handle_client_removexattr(MDRequest *mdr) mdr->ls = mdlog->get_current_segment(); EUpdate *le = new EUpdate(mdlog, "removexattr"); le->metablob.add_client_req(req->get_reqid()); - mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false); + mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); le->metablob.add_primary_dentry(cur->parent, true, 0, pi); mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur)); @@ -4292,7 +4292,7 @@ void Server::handle_client_truncate(MDRequest *mdr) pi->ctime = ctime; pi->version = pdv; pi->size = le64_to_cpu(req->head.args.truncate.length); - mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false); + mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); le->metablob.add_primary_dentry(cur->parent, true, 0, pi); mdlog->submit_entry(le, fin); @@ -4481,7 +4481,7 @@ void Server::handle_client_opent(MDRequest *mdr) pi->ctime = ctime; pi->version = pdv; pi->size = 0; - mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false); + mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); le->metablob.add_primary_dentry(cur->parent, true, 0, pi); mdlog->submit_entry(le, fin);