]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Fix trim_object() to not crash on corrupt snapset
authorDavid Zafman <dzafman@redhat.com>
Thu, 15 Oct 2015 03:42:48 +0000 (20:42 -0700)
committerDavid Zafman <dzafman@redhat.com>
Fri, 30 Oct 2015 20:01:50 +0000 (13:01 -0700)
Add test case to check for trim_object() osd crash

Signed-off-by: David Zafman <dzafman@redhat.com>
src/osd/ReplicatedPG.cc
src/test/osd/osd-scrub-snaps.sh

index 5b11786af20f2e5a1b58ad7cb293ef5c001ceca6..e69c05a773ecd42c24d016ef5ea3ab973b06fa80 100644 (file)
@@ -3175,13 +3175,19 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid)
 
   object_info_t &coi = obc->obs.oi;
   set<snapid_t> old_snaps(coi.snaps.begin(), coi.snaps.end());
-  assert(old_snaps.size());
+  if (old_snaps.empty()) {
+    osd->clog->error() << __func__ << " No object info snaps for " << coid << "\n";
+    return NULL;
+  }
 
   SnapSet& snapset = obc->ssc->snapset;
 
   dout(10) << coid << " old_snaps " << old_snaps
           << " old snapset " << snapset << dendl;
-  assert(snapset.seq);
+  if (snapset.seq == 0) {
+    osd->clog->error() << __func__ << " No snapset.seq for " << coid << "\n";
+    return NULL;
+  }
 
   RepGather *repop = simple_repop_create(obc);
   OpContext *ctx = repop->ctx;
@@ -3210,7 +3216,11 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid)
     for (p = snapset.clones.begin(); p != snapset.clones.end(); ++p)
       if (*p == last)
        break;
-    assert(p != snapset.clones.end());
+    if (p == snapset.clones.end()) {
+      osd->clog->error() << __func__ << " Snap " << coid.snap << " not in clones" << "\n";
+      return NULL;
+    }
+
     ctx->delta_stats.num_bytes -= snapset.get_clone_bytes(last);
 
     if (p != snapset.clones.begin()) {
index fbc93be8f446d2b896cba5f3cad7bbfe6b500c3d..569a332c982254b2faaa11c6d15b222b0aac6d16 100755 (executable)
@@ -132,10 +132,23 @@ sleep 5
 ./ceph pg scrub 1.0
 timeout 30 ./ceph -w
 
-./stop.sh
+for i in `seq 1 7`
+do
+    ./rados -p test rmsnap snap$i
+done
+
+sleep 10
 
 ERRORS=0
 
+if ! killall ceph-osd
+then
+    echo "OSD crash occurred"
+    ERRORS=$(expr $ERRORS + 1)
+fi
+
+./stop.sh
+
 declare -a err_strings
 err_strings[0]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/2acecc8b/obj10/1 is missing in clone_overlap"
 err_strings[1]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/666934a3/obj5/7 no '_' attr"