]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mon/MDSMonitor: avoid crash when decoding old FSMap epochs
authorPatrick Donnelly <pdonnell@redhat.com>
Tue, 12 Oct 2021 18:00:50 +0000 (14:00 -0400)
committerPatrick Donnelly <pdonnell@redhat.com>
Tue, 12 Oct 2021 18:00:50 +0000 (14:00 -0400)
Fixes: https://tracker.ceph.com/issues/52820
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/mds/FSMap.cc
src/mon/MDSMonitor.cc

index d82f8c439cc57a1841e61d5835f917e0b861ea2b..9fe50244ef1389ac8761effa81ace6a778f42bc0 100644 (file)
@@ -651,6 +651,7 @@ void FSMap::encode(bufferlist& bl, uint64_t features) const
 
 void FSMap::decode(bufferlist::const_iterator& p)
 {
+  struct_version = 0;
   DECODE_START(STRUCT_VERSION, p);
   DECODE_OLDEST(7);
   struct_version = struct_v;
index c3a3d0046e4a07f4c2b19c9ab7810e12a94bb12e..b64671176f5ee0a7f7c41e45ffe08050d95a0ee7 100644 (file)
@@ -2335,7 +2335,12 @@ void MDSMonitor::tick()
         derr << "could not get version " << v << dendl;
         ceph_abort();
       }
-      fsmap.decode(bl);
+      try {
+        fsmap.decode(bl);
+      } catch (const ceph::buffer::malformed_input& e) {
+        dout(5) << "flushing old fsmap struct because unable to decode FSMap: " << e.what() << dendl;
+      }
+      /* N.B. FSMap::is_struct_old is also true for undecoded (failed to decode) FSMap */
       if (fsmap.is_struct_old()) {
         dout(5) << "fsmap struct is too old; proposing to flush out old versions" << dendl;
         do_propose = true;