From dd080988f1466ee648629d412d22210f35816c11 Mon Sep 17 00:00:00 2001
From: Xinze Chi <xinze@xsky.com>
Date: Fri, 15 Sep 2017 16:02:27 +0800
Subject: [PATCH 1/2] osd: set min_version to newest version in
 maybe_force_recovery

Signed-off-by: Xinze Chi <xinze@xsky.com>
---
 src/osd/PrimaryLogPG.cc | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc
index b91cd4980be..25ff18696ba 100644
--- a/src/osd/PrimaryLogPG.cc
+++ b/src/osd/PrimaryLogPG.cc
@@ -726,7 +726,7 @@ void PrimaryLogPG::maybe_force_recovery()
     return;
 
   // find the oldest missing object
-  version_t min_version = 0;
+  version_t min_version = pg_log.get_log().head.version;
   hobject_t soid;
   if (!pg_log.get_missing().get_items().empty()) {
     min_version = pg_log.get_missing().get_rmissing().begin()->first;
@@ -739,10 +739,14 @@ void PrimaryLogPG::maybe_force_recovery()
     if (*it == get_primary()) continue;
     pg_shard_t peer = *it;
     if (peer_missing.count(peer) &&
-	!peer_missing[peer].get_items().empty() &&
-	min_version > peer_missing[peer].get_rmissing().begin()->first) {
-      min_version = peer_missing[peer].get_rmissing().begin()->first;
-      soid = peer_missing[peer].get_rmissing().begin()->second;
+	!peer_missing[peer].get_items().empty()) {
+      const auto& min_obj = peer_missing[peer].get_rmissing().begin();
+      dout(20) << __func__ << " peer " << peer << " min_version " << min_obj->first
+               << " oid " << min_obj->second << dendl;
+      if (min_version > min_obj->first) {
+        min_version = min_obj->first;
+        soid = min_obj->second;
+      }
     }
   }
 

From 96a3cb698a1ece76ac908e352db09c80e87da024 Mon Sep 17 00:00:00 2001
From: Xinze Chi <xinze@xsky.com>
Date: Fri, 15 Sep 2017 16:03:09 +0800
Subject: [PATCH 2/2] osd: using get_rmissing instread of missing as the
 judgement

the below code using peer_missing iterator

Signed-off-by: Xinze Chi <xinze@xsky.com>
---
 src/osd/PrimaryLogPG.cc | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc
index 25ff18696ba..c5a35cbd0f1 100644
--- a/src/osd/PrimaryLogPG.cc
+++ b/src/osd/PrimaryLogPG.cc
@@ -728,7 +728,7 @@ void PrimaryLogPG::maybe_force_recovery()
   // find the oldest missing object
   version_t min_version = pg_log.get_log().head.version;
   hobject_t soid;
-  if (!pg_log.get_missing().get_items().empty()) {
+  if (!pg_log.get_missing().get_rmissing().empty()) {
     min_version = pg_log.get_missing().get_rmissing().begin()->first;
     soid = pg_log.get_missing().get_rmissing().begin()->second;
   }
@@ -739,7 +739,7 @@ void PrimaryLogPG::maybe_force_recovery()
     if (*it == get_primary()) continue;
     pg_shard_t peer = *it;
     if (peer_missing.count(peer) &&
-	!peer_missing[peer].get_items().empty()) {
+	!peer_missing[peer].get_rmissing().empty()) {
       const auto& min_obj = peer_missing[peer].get_rmissing().begin();
       dout(20) << __func__ << " peer " << peer << " min_version " << min_obj->first
                << " oid " << min_obj->second << dendl;