]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/os/bluestore/bluestore_types.cc
update sources to v12.1.0
[ceph.git] / ceph / src / os / bluestore / bluestore_types.cc
index dcc937a9f9bc9fb6cd4208acee6ce0ad146d8c77..659f3e5bcc06823b35fa866b40c435988867829e 100644 (file)
@@ -196,10 +196,11 @@ void bluestore_extent_ref_map_t::get(uint64_t offset, uint32_t length)
 
 void bluestore_extent_ref_map_t::put(
   uint64_t offset, uint32_t length,
-  PExtentVector *release)
+  PExtentVector *release,
+  bool *maybe_unshared)
 {
   //NB: existing entries in 'release' container must be preserved!
-
+  bool unshared = true;
   auto p = ref_map.lower_bound(offset);
   if (p == ref_map.end() || p->first > offset) {
     if (p == ref_map.begin()) {
@@ -213,30 +214,42 @@ void bluestore_extent_ref_map_t::put(
   if (p->first < offset) {
     uint64_t left = p->first + p->second.length - offset;
     p->second.length = offset - p->first;
+    if (p->second.refs != 1) {
+      unshared = false;
+    }
     p = ref_map.insert(map<uint64_t,record_t>::value_type(
                         offset, record_t(left, p->second.refs))).first;
   }
   while (length > 0) {
     assert(p->first == offset);
     if (length < p->second.length) {
+      if (p->second.refs != 1) {
+       unshared = false;
+      }
       ref_map.insert(make_pair(offset + length,
                               record_t(p->second.length - length,
                                        p->second.refs)));
       if (p->second.refs > 1) {
        p->second.length = length;
        --p->second.refs;
+       if (p->second.refs != 1) {
+         unshared = false;
+       }
        _maybe_merge_left(p);
       } else {
        if (release)
          release->push_back(bluestore_pextent_t(p->first, length));
        ref_map.erase(p);
       }
-      return;
+      goto out;
     }
     offset += p->second.length;
     length -= p->second.length;
     if (p->second.refs > 1) {
       --p->second.refs;
+      if (p->second.refs != 1) {
+       unshared = false;
+      }
       _maybe_merge_left(p);
       ++p;
     } else {
@@ -248,6 +261,19 @@ void bluestore_extent_ref_map_t::put(
   if (p != ref_map.end())
     _maybe_merge_left(p);
   //_check();
+out:
+  if (maybe_unshared) {
+    if (unshared) {
+      // we haven't seen a ref != 1 yet; check the whole map.
+      for (auto& p : ref_map) {
+       if (p.second.refs != 1) {
+         unshared = false;
+         break;
+       }
+      }
+    }
+    *maybe_unshared = unshared;
+  }
 }
 
 bool bluestore_extent_ref_map_t::contains(uint64_t offset, uint32_t length) const
@@ -569,9 +595,6 @@ void bluestore_pextent_t::generate_test_instances(list<bluestore_pextent_t*>& ls
 string bluestore_blob_t::get_flags_string(unsigned flags)
 {
   string s;
-  if (flags & FLAG_MUTABLE) {
-    s = "mutable";
-  }
   if (flags & FLAG_COMPRESSED) {
     if (s.length())
       s += '+';
@@ -758,6 +781,7 @@ void bluestore_blob_t::allocated(uint32_t b_off, uint32_t length, const AllocExt
     auto start_it = extents.begin();
     size_t pos = 0;
     while(true) {
+      assert(start_it != extents.end());
       if (cur_offs + start_it->length > b_off) {
        break;
       }
@@ -770,6 +794,7 @@ void bluestore_blob_t::allocated(uint32_t b_off, uint32_t length, const AllocExt
     auto end_it = start_it;
 
     while (true) {
+      assert(end_it != extents.end());
       assert(!end_it->is_valid());
       if (cur_offs + end_it->length >= end_off) {
        break;
@@ -995,8 +1020,8 @@ void bluestore_shared_blob_t::generate_test_instances(
 
 ostream& operator<<(ostream& out, const bluestore_shared_blob_t& sb)
 {
-  out << " sbid 0x" << std::hex << sb.sbid << std::dec;
-  out << " ref_map(" << sb.ref_map << ")";
+  out << "(sbid 0x" << std::hex << sb.sbid << std::dec;
+  out << " " << sb.ref_map << ")";
   return out;
 }