]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PG: clean up fastinfo key when last_update does not increase 32615/head
authorSage Weil <sage@redhat.com>
Mon, 13 Jan 2020 13:11:51 +0000 (07:11 -0600)
committerKefu Chai <kchai@redhat.com>
Tue, 14 Jan 2020 06:25:20 +0000 (14:25 +0800)
If the last_update field goes backwards, we write a full info instead of
the fastinfo key. However, a stale fastinfo key may still be present, and
it may have a last_update that looks valid to a restarting OSD.

Fixes: https://tracker.ceph.com/issues/43580
Reported-by: song <jinglesong0814@163.com>
Signed-off-by: Sage Weil <sage@redhat.com>
src/crimson/osd/pg.cc
src/osd/PG.cc
src/osd/osd_types.cc
src/osd/osd_types.h
src/tools/ceph_objectstore_tool.cc

index 3955dd7765d299dd35f9e0bc002815f86c44970a..6b7556e960ff7c328bb56779c9c09e536991e453 100644 (file)
@@ -243,10 +243,12 @@ void PG::prepare_write(pg_info_t &info,
                       ceph::os::Transaction &t)
 {
   std::map<string,bufferlist> km;
+  std::string key_to_remove;
   if (dirty_big_info || dirty_info) {
     int ret = prepare_info_keymap(
       shard_services.get_cct(),
       &km,
+      &key_to_remove,
       get_osdmap_epoch(),
       info,
       last_written_info,
@@ -264,6 +266,9 @@ void PG::prepare_write(pg_info_t &info,
   if (!km.empty()) {
     t.omap_setkeys(coll, pgmeta_oid, km);
   }
+  if (!key_to_remove.empty()) {
+    t.omap_rmkey(coll, pgmeta_oid, key_to_remove);
+  }
 }
 
 void PG::log_state_enter(const char *state) {
index db29e0056ace20fb5d1ad9299f55fb5daf580976..2019ebe1bd4f038f060490c52aa59e717a7f4dcd 100644 (file)
@@ -949,10 +949,12 @@ void PG::prepare_write(
   info.stats.stats.add(unstable_stats);
   unstable_stats.clear();
   map<string,bufferlist> km;
+  string key_to_remove;
   if (dirty_big_info || dirty_info) {
     int ret = prepare_info_keymap(
       cct,
       &km,
+      &key_to_remove,
       get_osdmap_epoch(),
       info,
       last_written_info,
@@ -968,6 +970,8 @@ void PG::prepare_write(
     t, &km, coll, pgmeta_oid, pool.info.require_rollback());
   if (!km.empty())
     t.omap_setkeys(coll, pgmeta_oid, km);
+  if (!key_to_remove.empty())
+    t.omap_rmkey(coll, pgmeta_oid, key_to_remove);
 }
 
 #pragma GCC diagnostic ignored "-Wpragmas"
index a4b322d20170a5490c39edb012d16e926ae9e085..901480b849f3c0fb188dc58281870803c0cec777 100644 (file)
@@ -6840,6 +6840,7 @@ void OSDOp::clear_data(vector<OSDOp>& ops)
 int prepare_info_keymap(
   CephContext* cct,
   map<string,bufferlist> *km,
+  string *key_to_remove,
   epoch_t epoch,
   pg_info_t &info,
   pg_info_t &last_written_info,
@@ -6885,6 +6886,10 @@ int prepare_info_keymap(
       }
       *_dout << dendl;
     }
+  } else if (info.last_update <= last_written_info.last_update) {
+    // clean up any potentially stale fastinfo key resulting from last_update
+    // not moving forwards (e.g., a backwards jump during peering)
+    *key_to_remove = fastinfo_key;
   }
 
   last_written_info = info;
index 9fa3fd8758d36c34d32df726c73224701b3c4466..be90f083ee25448b7ba6d4cf1bdf73dc7a68e4b0 100644 (file)
@@ -6229,6 +6229,7 @@ static const __u8 pg_compat_struct_v = 10;
 int prepare_info_keymap(
   CephContext* cct,
   map<string,bufferlist> *km,
+  string *key_to_remove,
   epoch_t epoch,
   pg_info_t &info,
   pg_info_t &last_written_info,
index 77c929feb510e6ac3db70ac302760786c008aa24..b534e0ab317b0823d733026c9119db8072039721 100644 (file)
@@ -577,16 +577,21 @@ int write_info(ObjectStore::Transaction &t, epoch_t epoch, pg_info_t &info,
   coll_t coll(info.pgid);
   ghobject_t pgmeta_oid(info.pgid.make_pgmeta_oid());
   map<string,bufferlist> km;
+  string key_to_remove;
   pg_info_t last_written_info;
   int ret = prepare_info_keymap(
     g_ceph_context,
-    &km, epoch,
+    &km, &key_to_remove,
+    epoch,
     info,
     last_written_info,
     past_intervals,
     true, true, false);
   if (ret) cerr << "Failed to write info" << std::endl;
   t.omap_setkeys(coll, pgmeta_oid, km);
+  if (!key_to_remove.empty()) {
+    t.omap_rmkey(coll, pgmeta_oid, key_to_remove);
+  }
   return ret;
 }