From 5070999169b5733983fb74d955cb764a9066c3d8 Mon Sep 17 00:00:00 2001
From: xie xingguo <xie.xingguo@zte.com.cn>
Date: Thu, 22 Jun 2017 09:18:40 +0800
Subject: [PATCH] os/bluestore: pass strict flag to
 bluestore_blob_use_tracker_t::equal()

And if that flag is true, we'll do a strict equivalence comparison instead.

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
---
 src/os/bluestore/bluestore_types.cc          |  7 +++-
 src/os/bluestore/bluestore_types.h           |  3 +-
 src/test/objectstore/test_bluestore_types.cc | 38 +++++++++++++++++++-
 3 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/src/os/bluestore/bluestore_types.cc b/src/os/bluestore/bluestore_types.cc
index fdb14ebd86c..cceefa83333 100644
--- a/src/os/bluestore/bluestore_types.cc
+++ b/src/os/bluestore/bluestore_types.cc
@@ -488,7 +488,8 @@ void bluestore_blob_use_tracker_t::split(
 }
 
 bool bluestore_blob_use_tracker_t::equal(
-  const bluestore_blob_use_tracker_t& other) const
+  const bluestore_blob_use_tracker_t& other,
+  bool strict) const
 {
   if (!num_au && !other.num_au) {
     return total_bytes == other.total_bytes && au_size == other.au_size;
@@ -504,6 +505,10 @@ bool bluestore_blob_use_tracker_t::equal(
     return true;
   }
 
+  if (strict) {
+    return false;
+  }
+
   uint32_t n = num_au ? num_au : other.num_au;
   uint32_t referenced = 
     num_au ? other.get_referenced_bytes() : get_referenced_bytes();
diff --git a/src/os/bluestore/bluestore_types.h b/src/os/bluestore/bluestore_types.h
index 654246fa6b9..1ba3467b6a9 100644
--- a/src/os/bluestore/bluestore_types.h
+++ b/src/os/bluestore/bluestore_types.h
@@ -421,7 +421,8 @@ struct bluestore_blob_use_tracker_t {
     bluestore_blob_use_tracker_t* r);
 
   bool equal(
-    const bluestore_blob_use_tracker_t& other) const;
+    const bluestore_blob_use_tracker_t& other,
+    bool strict = true) const;
     
   void bound_encode(size_t& p) const {
     denc_varint(au_size, p);
diff --git a/src/test/objectstore/test_bluestore_types.cc b/src/test/objectstore/test_bluestore_types.cc
index 39c3918043a..0db8c258562 100644
--- a/src/test/objectstore/test_bluestore_types.cc
+++ b/src/test/objectstore/test_bluestore_types.cc
@@ -1489,7 +1489,43 @@ TEST(GarbageCollector, BasicTest)
     em.clear();
     old_extents.clear();
   }
- }
+}
+
+TEST(bluestore_blob_use_tracker_t, equal)
+{
+  bluestore_blob_use_tracker_t t1, t2, t3;
+
+  ASSERT_TRUE(t1.equal(t2));
+  ASSERT_TRUE(t1.equal(t2, false));
+
+  t1.init(0x8000, 0x1000);
+  t2.init(0x8000, 0x1000);
+  ASSERT_TRUE(t1.equal(t2));
+  ASSERT_TRUE(t1.equal(t2, false));
+
+  t1.get(0, 0x1000);
+  ASSERT_TRUE(!t1.equal(t2));
+  ASSERT_TRUE(!t1.equal(t2, false));
+  t2.get(0, 0x1000);
+  ASSERT_TRUE(t1.equal(t2));
+  ASSERT_TRUE(t1.equal(t2, false));
+
+  t1.get(0x1000, 0x1000);
+  t2.get(0x2000, 0x1000);
+  ASSERT_TRUE(!t1.equal(t2));
+  ASSERT_TRUE(!t1.equal(t2, false));
+
+  t3.init(0x8000, 0x8000);
+  t3.get(0x4000, 0x2000);
+  ASSERT_TRUE(!t3.equal(t1));
+  ASSERT_TRUE(t3.equal(t1, false));
+  ASSERT_TRUE(!t3.equal(t2));
+  ASSERT_TRUE(t3.equal(t2, false));
+
+  t1.clear();
+  t2.clear();
+  t3.clear();
+}
 
 int main(int argc, char **argv) {
   vector<const char*> args;