]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/seastar/src/core/smp.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / seastar / src / core / smp.cc
index 4b80d8814bb89ce5f2eeee316366728eeefdf7c5..38a7f419921677f17e9c44eff3f7b7a7f8ce5636 100644 (file)
 #include <seastar/core/loop.hh>
 #include <seastar/core/semaphore.hh>
 #include <seastar/core/print.hh>
+#include <seastar/core/on_internal_error.hh>
 #include <boost/range/algorithm/find_if.hpp>
 #include <vector>
 
 namespace seastar {
 
+extern logger seastar_logger;
+
 void smp_message_queue::work_item::process() {
     schedule(this);
 }
 
 struct smp_service_group_impl {
     std::vector<smp_service_group_semaphore> clients;   // one client per server shard
+#ifdef SEASTAR_DEBUG
+    unsigned version = 0;
+#endif
 };
 
 static smp_service_group_semaphore smp_service_group_management_sem{1, named_semaphore_exception_factory{"smp_service_group_management_sem"}};
@@ -82,7 +88,11 @@ future<smp_service_group> create_smp_service_group(smp_service_group_config ssgc
                     std::rethrow_exception(std::move(e));
                 });
             }).then([id] {
-                return smp_service_group(id);
+                auto ret = smp_service_group(id);
+#ifdef SEASTAR_DEBUG
+                ret._version = smp_service_groups[id].version;
+#endif
+                return ret;
             });
         });
     });
@@ -92,8 +102,19 @@ future<> destroy_smp_service_group(smp_service_group ssg) noexcept {
     return smp::submit_to(0, [ssg] {
         return with_semaphore(smp_service_group_management_sem, 1, [ssg] {
             auto id = internal::smp_service_group_id(ssg);
+            if (id >= smp_service_groups.size()) {
+                on_fatal_internal_error(seastar_logger, format("destroy_smp_service_group id={}: out of range", id));
+            }
+#ifdef SEASTAR_DEBUG
+            if (ssg._version != smp_service_groups[id].version) {
+                on_fatal_internal_error(seastar_logger, format("destroy_smp_service_group id={}: stale version={}: current_version={}", id, ssg._version, smp_service_groups[id].version));
+            }
+#endif
             return smp::invoke_on_all([id] {
                 smp_service_groups[id].clients.clear();
+#ifdef SEASTAR_DEBUG
+                ++smp_service_groups[id].version;
+#endif
             });
         });
     });