summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Farnum <greg@inktank.com>2013-10-16 11:13:35 -0700
committerGregory Farnum <greg@inktank.com>2013-10-16 11:13:35 -0700
commit9fdf42a7fcc4df429bbd2f4a2773930b4dfc155a (patch)
treef83da564801fda7d6da449a1d63aa89fe7a0e16e
parent81c8ce2ceee6cbd1a963f594e9e68fa948744268 (diff)
parenteb381ffc8db14f13a7c5e3528a109bf89a7c5b31 (diff)
downloadceph-9fdf42a7fcc4df429bbd2f4a2773930b4dfc155a.tar.gz
Merge pull request #709 from ceph/wip-filerecover
This patch prevents us from inadvertently reducing sparse file sizes during recovery. We also reduce some code duplication by using eval() directly in do_file_recover() instead of reproducing the parts we care about. Reviewed-by: Greg Farnum <greg@inktank.com>
-rw-r--r--src/mds/Locker.cc9
-rw-r--r--src/mds/MDCache.cc11
2 files changed, 10 insertions, 10 deletions
diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc
index 19c9176f414..7f852519714 100644
--- a/src/mds/Locker.cc
+++ b/src/mds/Locker.cc
@@ -2042,10 +2042,15 @@ bool Locker::check_inode_max_size(CInode *in, bool force_wrlock,
inode_t *latest = in->get_projected_inode();
map<client_t, client_writeable_range_t> new_ranges;
uint64_t size = latest->size;
- if (update_size)
- size = new_size;
bool new_max = update_max;
+ if (update_size) {
+ new_size = size = MAX(size, new_size);
+ new_mtime = MAX(new_mtime, latest->mtime);
+ if (latest->size == new_size && latest->mtime == new_mtime)
+ update_size = false;
+ }
+
uint64_t client_range_size = update_max ? new_max_size : size;
calc_new_client_ranges(in, client_range_size, new_ranges);
diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc
index 0188d418e0d..b1f1f0ad4c9 100644
--- a/src/mds/MDCache.cc
+++ b/src/mds/MDCache.cc
@@ -5789,21 +5789,15 @@ void MDCache::do_file_recover()
dout(10) << "do_file_recover skipping " << in->inode.size
<< " " << *in << dendl;
in->state_clear(CInode::STATE_RECOVERING);
+ mds->locker->eval(in, CEPH_LOCK_IFILE);
in->auth_unpin(this);
- if (in->filelock.is_stable()) {
- bool need_issue = false;
- mds->locker->eval(&in->filelock, &need_issue);
- if (in->is_head() && need_issue)
- mds->locker->issue_caps(in);
- } else
- mds->locker->eval_gather(&in->filelock);
}
}
}
void MDCache::_recovered(CInode *in, int r, uint64_t size, utime_t mtime)
{
- dout(10) << "_recovered r=" << r << " size=" << in->inode.size << " mtime=" << in->inode.mtime
+ dout(10) << "_recovered r=" << r << " size=" << size << " mtime=" << mtime
<< " for " << *in << dendl;
if (r != 0) {
@@ -5825,6 +5819,7 @@ void MDCache::_recovered(CInode *in, int r, uint64_t size, utime_t mtime)
} else {
// journal
mds->locker->check_inode_max_size(in, true, true, size, false, 0, mtime);
+ mds->locker->eval(in, CEPH_LOCK_IFILE);
in->auth_unpin(this);
}