Merge branch 'testing' into unstable

Conflicts:
	configure.ac
	src/mds/MDCache.cc
This commit is contained in:
Sage Weil 2010-09-07 12:13:39 -07:00
commit 90dd3c3e89
7 changed files with 68 additions and 41 deletions

19
debian/changelog vendored
View File

@ -1,3 +1,22 @@
ceph (0.21.2-1) unstable; urgency=low
* osd: less log noise
* osd: mark down old heartbeat peers
* filejournal: clean up init sequence, fewer confusing errors on startup
* msgr: fix throttler leak when closing connections (fixes deadlock)
* osdmaptool: don't crash on corrupt input
* crush: error out instead of crashing on ambiguous hierarchy
* mds: error to client on invalid op
* mds: fix ENOTEMPTY checks on rmdir
* osd: fix race between reads and cloned objects
* auth: fix keyring load search when $HOME not defined
* client: fix xattr cap writeback
* client: fix snap vs metadata writeback
* osd: fix journal, btrfs throttling
* msgr: fix memory leak on closed connections
-- Sage Weil <sage@newdream.net> Thu, 26 Aug 2010 15:22:42 -0700
ceph (0.21.1-1) unstable; urgency=high
* ceph.spec: many fixes

View File

@ -701,7 +701,12 @@ public:
lock->set_state(LOCK_EXCL);
else if (issued & CEPH_CAP_GWR)
lock->set_state(LOCK_MIX);
else
else if (lock->is_dirty()) {
if (is_replicated())
lock->set_state(LOCK_MIX);
else
lock->set_state(LOCK_LOCK);
} else
lock->set_state(LOCK_SYNC);
} else {
if (lock->is_xlocked())
@ -716,6 +721,8 @@ public:
choose_ideal_loner() >= 0)
try_set_loner();
choose_lock_state(&filelock, issued);
choose_lock_state(&nestlock, issued);
choose_lock_state(&dirfragtreelock, issued);
choose_lock_state(&authlock, issued);
choose_lock_state(&xattrlock, issued);
choose_lock_state(&linklock, issued);

View File

@ -3935,7 +3935,7 @@ void MDCache::rejoin_gather_finish()
}
process_imported_caps();
process_reconnected_caps();
choose_lock_states_and_reconnect_caps();
vector<CInode*> recover_q, check_q;
identify_files_to_recover(rejoin_recover_q, rejoin_check_q);
@ -4005,18 +4005,17 @@ void MDCache::check_realm_past_parents(SnapRealm *realm)
/*
* choose lock states based on reconnected caps
*/
void MDCache::process_reconnected_caps()
void MDCache::choose_lock_states_and_reconnect_caps()
{
dout(10) << "process_reconnected_caps" << dendl;
dout(10) << "choose_lock_states_and_reconnect_caps" << dendl;
map<client_t,MClientSnap*> splits;
// adjust lock states appropriately
for (map<CInode*,map<client_t,inodeno_t> >::iterator p = reconnected_caps.begin();
p != reconnected_caps.end();
p++) {
CInode *in = p->first;
for (hash_map<vinodeno_t,CInode*>::iterator i = inode_map.begin();
i != inode_map.end();
++i) {
CInode *in = i->second;
in->choose_lock_states();
dout(15) << " chose lock states on " << *in << dendl;
@ -4024,21 +4023,25 @@ void MDCache::process_reconnected_caps()
check_realm_past_parents(realm);
// also, make sure client's cap is in the correct snaprealm.
for (map<client_t,inodeno_t>::iterator q = p->second.begin();
q != p->second.end();
q++) {
if (q->second == realm->inode->ino()) {
dout(15) << " client" << q->first << " has correct realm " << q->second << dendl;
} else {
dout(15) << " client" << q->first << " has wrong realm " << q->second
<< " != " << realm->inode->ino() << dendl;
if (realm->have_past_parents_open()) {
// ok, include in a split message _now_.
prepare_realm_split(realm, q->first, in->ino(), splits);
map<CInode*,map<client_t,inodeno_t> >::iterator p = reconnected_caps.find(in);
if (p != reconnected_caps.end()) {
// also, make sure client's cap is in the correct snaprealm.
for (map<client_t,inodeno_t>::iterator q = p->second.begin();
q != p->second.end();
q++) {
if (q->second == realm->inode->ino()) {
dout(15) << " client" << q->first << " has correct realm " << q->second << dendl;
} else {
// send the split later.
missing_snap_parents[realm->inode][q->first].insert(in->ino());
dout(15) << " client" << q->first << " has wrong realm " << q->second
<< " != " << realm->inode->ino() << dendl;
if (realm->have_past_parents_open()) {
// ok, include in a split message _now_.
prepare_realm_split(realm, q->first, in->ino(), splits);
} else {
// send the split later.
missing_snap_parents[realm->inode][q->first].insert(in->ino());
}
}
}
}

View File

@ -755,7 +755,7 @@ public:
reconnected_snaprealms[ino][client] = seq;
}
void process_imported_caps();
void process_reconnected_caps();
void choose_lock_states_and_reconnect_caps();
void prepare_realm_split(SnapRealm *realm, client_t client, inodeno_t ino,
map<client_t,MClientSnap*>& splits);
void do_realm_invalidate_and_update_notify(CInode *in, int snapop, bool nosend=false);

View File

@ -365,7 +365,7 @@ public:
virtual bool is_dirty() { return false; }
virtual bool is_dirty() const { return false; }
// can_*

View File

@ -1677,7 +1677,7 @@ void OSD::send_pg_stats()
if (osd_stat_updated || !pg_stat_queue.empty()) {
osd_stat_updated = false;
dout(1) << "send_pg_stats - " << pg_stat_queue.size() << " pgs updated" << dendl;
dout(10) << "send_pg_stats - " << pg_stat_queue.size() << " pgs updated" << dendl;
utime_t had_for = g_clock.now();
had_for -= had_map_since;
@ -4459,11 +4459,11 @@ void OSD::handle_op(MOSDOp *op)
int err = -EPERM;
if (op->may_read() && !(perm & OSD_POOL_CAP_R)) {
dout(0) << "no READ permission to access pool " << pg->pool->name << dendl;
dout(10) << "no READ permission to access pool " << pg->pool->name << dendl;
} else if (op->may_write() && !(perm & OSD_POOL_CAP_W)) {
dout(0) << "no WRITE permission to access pool " << pg->pool->name << dendl;
dout(10) << "no WRITE permission to access pool " << pg->pool->name << dendl;
} else if (op->require_exec_caps() && !(perm & OSD_POOL_CAP_X)) {
dout(0) << "no EXEC permission to access pool " << pg->pool->name << dendl;
dout(10) << "no EXEC permission to access pool " << pg->pool->name << dendl;
} else {
err = 0;
}
@ -4822,7 +4822,7 @@ int OSD::get_class(const string& cname, ClassVersion& version, pg_t pgid, Messag
*pcls = cls;
return 0;
case ClassHandler::ClassData::CLASS_INVALID:
dout(0) << "class not supported" << dendl;
dout(1) << "class " << cname << " not supported" << dendl;
return -EOPNOTSUPP;
case ClassHandler::ClassData::CLASS_ERROR:
dout(0) << "error loading class!" << dendl;
@ -4911,7 +4911,7 @@ void OSD::init_op_flags(MOSDOp *op)
is_write = flags & CLS_METHOD_WR;
is_public = flags & CLS_METHOD_PUBLIC;
dout(0) << "class " << cname << " method " << mname
dout(10) << "class " << cname << " method " << mname
<< " flags=" << (is_read ? "r" : "") << (is_write ? "w" : "") << dendl;
if (is_read)
op->rmw_flags |= CEPH_OSD_FLAG_READ;

View File

@ -139,7 +139,7 @@ void ReplicatedPG::wait_for_degraded_object(const sobject_t& soid, Message *m)
// ==========================================================
void ReplicatedPG::do_pg_op(MOSDOp *op)
{
dout(0) << "do_pg_op " << *op << dendl;
dout(10) << "do_pg_op " << *op << dendl;
bufferlist outdata;
int result = 0;
@ -813,7 +813,6 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops,
case CEPH_OSD_OP_READ:
{
dout(0) << "CEPH_OSD_OP_READ" << dendl;
// read into a buffer
bufferlist bl;
int r = osd->store->read(coll_t::build_pg_coll(info.pgid), soid, op.extent.offset, op.extent.length, bl);
@ -828,7 +827,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops,
}
info.stats.num_rd_kb += SHIFT_ROUND_UP(op.extent.length, 10);
info.stats.num_rd++;
dout(0) << " read got " << r << " / " << op.extent.length << " bytes from obj " << soid << dendl;
dout(10) << " read got " << r << " / " << op.extent.length << " bytes from obj " << soid << dendl;
__u32 seq = oi.truncate_seq;
// are we beyond truncate_size?
@ -845,7 +844,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops,
bufferlist keep;
// keep first part of odata; trim at truncation point
dout(0) << " obj " << soid << " seq " << seq
dout(10) << " obj " << soid << " seq " << seq
<< ": trimming overlap " << from << "~" << trim << dendl;
keep.substr_of(odata, 0, odata.length() - trim);
odata.claim(keep);
@ -932,7 +931,6 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops,
case CEPH_OSD_OP_CMPXATTR:
{
dout(0) << "CEPH_OSD_OP_CMPXATTR" << dendl;
string aname;
bp.copy(op.xattr.name_len, aname);
string name = "_" + aname;
@ -970,16 +968,16 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops,
}
if (!result) {
dout(0) << "comparison returned false" << dendl;
dout(10) << "comparison returned false" << dendl;
result = -ECANCELED;
break;
}
if (result < 0) {
dout(0) << "comparison returned " << result << " " << strerror(-result) << dendl;
dout(10) << "comparison returned " << result << " " << strerror(-result) << dendl;
break;
}
dout(0) << "comparison returned true" << dendl;
dout(10) << "comparison returned true" << dendl;
info.stats.num_rd++;
}
break;
@ -3158,7 +3156,7 @@ void ReplicatedPG::sub_op_push(MOSDSubOp *op)
dout(10) << "sub_op_push need " << data_needed << ", got " << data_subset << dendl;
if (!data_needed.subset_of(data_subset)) {
dout(0) << " we did not get enough of " << soid << " object data" << dendl;
dout(0) << "sub_op_push we did not get enough of " << soid << " object data" << dendl;
op->put();
return;
}