From 67de12bf9b67c29bf613e831f4146ff9809e42f7 Mon Sep 17 00:00:00 2001 From: xinxin shu Date: Wed, 17 Jun 2015 06:49:58 +0800 Subject: [PATCH] Fixes : #12018 osd/OSD.cc : drop write if pool is full Signed-off-by: xinxin shu --- src/osd/OSD.cc | 33 ++++++++++++++++++++++++++++++--- src/osd/OSD.h | 1 + src/osd/osd_types.cc | 5 ++++- src/osd/osd_types.h | 1 + 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index f6be098442c09..fb9f8a7d99021 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -6119,6 +6119,7 @@ void OSD::handle_osd_map(MOSDMap *m) o->decode(bl); if (o->test_flag(CEPH_OSDMAP_FULL)) last_marked_full = e; + set_pool_last_map_marked_full(o, e); hobject_t fulloid = get_osdmap_pobject_name(e); t.write(META_COLL, fulloid, 0, bl.length(), bl); @@ -6152,6 +6153,7 @@ void OSD::handle_osd_map(MOSDMap *m) if (o->test_flag(CEPH_OSDMAP_FULL)) last_marked_full = e; + set_pool_last_map_marked_full(o, e); bufferlist fbl; o->encode(fbl, inc.encode_features | CEPH_FEATURE_RESERVED); @@ -8050,6 +8052,9 @@ void OSD::handle_op(OpRequestRef& op, OSDMapRef& osdmap) } } + // calc actual pgid + pg_t _pgid = m->get_pg(); + int64_t pool = _pgid.pool(); if (op->may_write()) { // full? if ((service.check_failsafe_full() || @@ -8061,6 +8066,17 @@ void OSD::handle_op(OpRequestRef& op, OSDMapRef& osdmap) return; } + const pg_pool_t *pi = osdmap->get_pg_pool(pool); + if (!pi) { + return; + } + // pool is full ? + map &pool_last_map_marked_full = superblock.pool_last_map_marked_full; + if (pi->has_flag(pg_pool_t::FLAG_FULL) || + (pool_last_map_marked_full.count(pool) && (m->get_map_epoch() < pool_last_map_marked_full[pool]))) { + return; + } + // invalid? if (m->get_snapid() != CEPH_NOSNAP) { service.reply_op_error(op, -EINVAL); @@ -8079,9 +8095,6 @@ void OSD::handle_op(OpRequestRef& op, OSDMapRef& osdmap) } } - // calc actual pgid - pg_t _pgid = m->get_pg(); - int64_t pool = _pgid.pool(); if ((m->get_flags() & CEPH_OSD_FLAG_PGOP) == 0 && osdmap->have_pg_pool(pool)) _pgid = osdmap->raw_pg_to_pg(_pgid); @@ -8744,3 +8757,17 @@ void OSD::PeeringWQ::_dequeue(list *out) { } in_use.insert(got.begin(), got.end()); } + +void OSD::set_pool_last_map_marked_full(OSDMap *o, epoch_t &e) +{ + map &pool_last_map_marked_full = superblock.pool_last_map_marked_full; + for (map::const_iterator it = o->get_pools().begin(); + it != o->get_pools().end(); it++) { + bool exist = pool_last_map_marked_full.count(it->first); + if (it->second.has_flag(pg_pool_t::FLAG_FULL) && !exist) + pool_last_map_marked_full[it->first] = e; + if (it->second.has_flag(pg_pool_t::FLAG_FULL) && + (exist && pool_last_map_marked_full.count(it->first) < e)) + pool_last_map_marked_full[it->first] = e; + } +} diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 85452057ca380..82fa3f881dc36 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1775,6 +1775,7 @@ private: void handle_osd_map(class MOSDMap *m); void note_down_osd(int osd); void note_up_osd(int osd); + void set_pool_last_map_marked_full(OSDMap *o, epoch_t &e); bool advance_pg( epoch_t advance_to, PG *pg, diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index eeaab4db0ebb9..23885931bffa8 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -3882,7 +3882,7 @@ ostream& operator<<(ostream& out, const osd_peer_stat_t &stat) void OSDSuperblock::encode(bufferlist &bl) const { - ENCODE_START(6, 5, bl); + ENCODE_START(7, 5, bl); ::encode(cluster_fsid, bl); ::encode(whoami, bl); ::encode(current_epoch, bl); @@ -3894,6 +3894,7 @@ void OSDSuperblock::encode(bufferlist &bl) const ::encode(mounted, bl); ::encode(osd_fsid, bl); ::encode(last_map_marked_full, bl); + ::encode(pool_last_map_marked_full, bl); ENCODE_FINISH(bl); } @@ -3921,6 +3922,8 @@ void OSDSuperblock::decode(bufferlist::iterator &bl) ::decode(osd_fsid, bl); if (struct_v >= 6) ::decode(last_map_marked_full, bl); + if (struct_v >= 7) + ::decode(pool_last_map_marked_full, bl); DECODE_FINISH(bl); } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index c477f1d404c22..6b4fbe3329e02 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -2684,6 +2684,7 @@ public: epoch_t mounted; // last epoch i mounted epoch_t clean_thru; // epoch i was active and clean thru epoch_t last_map_marked_full; // last epoch osdmap was marked full + map pool_last_map_marked_full; // last epoch pool was marked full OSDSuperblock() : whoami(-1), -- 2.39.5