From 6c7bd4f5cc9e9189dcd230ff6e9debfa3f402189 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 29 Jul 2008 12:53:49 -0700 Subject: [PATCH] mds: delay cap handler if freezing|frozen. drop cap msg if migrate_seq is older. --- src/TODO | 1 + src/client/Client.cc | 3 ++- src/mds/Locker.cc | 12 ++++++++++++ src/messages/MClientFileCaps.h | 2 +- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/TODO b/src/TODO index 32555afce5aa8..48de8e3ed67b7 100644 --- a/src/TODO +++ b/src/TODO @@ -26,6 +26,7 @@ snapshots - garbage collection mds +- cap release probably needs ack by mds. or, mds needs to possibly initiate recovery on import? no, release should pbly just be acked by mds... like it was way back when... bah! - dentry waiters? - resolve - rejoin diff --git a/src/client/Client.cc b/src/client/Client.cc index 7eb4a0fa20571..0670d6b8eec90 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1444,7 +1444,7 @@ void Client::check_caps(Inode *in, bool flush_snap) cap->seq, cap->issued, wanted, - 0); + cap->mseq); in->reported_size = in->inode.size; m->set_max_size(in->wanted_max_size); in->requested_max_size = in->wanted_max_size; @@ -1949,6 +1949,7 @@ void Client::handle_file_caps(MClientFileCaps *m) m->set_atime(in->inode.atime); m->set_wanted(wanted); m->set_snap_follows(in->snaprealm->get_follows()); + m->set_migrate_seq(cap->mseq); } } else if (old_caps == new_caps) { dout(10) << " caps unchanged at " << cap_string(old_caps) << dendl; diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index a8854ad90c331..49119cc0aa4a4 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -953,6 +953,18 @@ void Locker::handle_client_file_caps(MClientFileCaps *m) } assert(cap); + // freezing|frozen? + if (in->is_freezing() || in->is_frozen()) { + dout(7) << "handle_client_file_caps freezing|frozen on " << *in << dendl; + in->add_waiter(CInode::WAIT_UNFREEZE, new C_MDS_RetryMessage(mds, m)); + return; + } + if (m->get_mseq() < cap->get_mseq()) { + dout(7) << "handle_client_file_caps mseq " << m->get_mseq() << " < " << cap->get_mseq() + << ", dropping" << dendl; + delete m; + return; + } // flushsnap? if (m->get_op() == CEPH_CAP_OP_FLUSHSNAP) { diff --git a/src/messages/MClientFileCaps.h b/src/messages/MClientFileCaps.h index 7a059def2e755..ff7c5f298cfa2 100644 --- a/src/messages/MClientFileCaps.h +++ b/src/messages/MClientFileCaps.h @@ -51,7 +51,7 @@ class MClientFileCaps : public Message { void set_max_size(__u64 ms) { h.max_size = ms; } - void set_migrate_seq(int m) { h.migrate_seq = m; } + void set_migrate_seq(unsigned m) { h.migrate_seq = m; } void set_op(int o) { h.op = o; } void set_size(loff_t s) { h.size = s; } -- 2.39.5