initial code repo
[stor4nfv.git] / src / ceph / src / rgw / rgw_realm_reloader.h
diff --git a/src/ceph/src/rgw/rgw_realm_reloader.h b/src/ceph/src/rgw/rgw_realm_reloader.h
new file mode 100644 (file)
index 0000000..ab9f4e5
--- /dev/null
@@ -0,0 +1,63 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef RGW_REALM_RELOADER_H
+#define RGW_REALM_RELOADER_H
+
+#include "rgw_realm_watcher.h"
+#include "common/Cond.h"
+
+class RGWRados;
+
+/**
+ * RGWRealmReloader responds to new period notifications by recreating RGWRados
+ * with the updated realm configuration.
+ */
+class RGWRealmReloader : public RGWRealmWatcher::Watcher {
+ public:
+  /**
+   * Pauser is an interface to pause/resume frontends. Frontend cooperation
+   * is required to ensure that they stop issuing requests on the old
+   * RGWRados instance, and restart with the updated configuration.
+   *
+   * This abstraction avoids a depency on class RGWFrontend.
+   */
+  class Pauser {
+   public:
+    virtual ~Pauser() = default;
+
+    /// pause all frontends while realm reconfiguration is in progress
+    virtual void pause() = 0;
+    /// resume all frontends with the given RGWRados instance
+    virtual void resume(RGWRados* store) = 0;
+  };
+
+  RGWRealmReloader(RGWRados*& store, std::map<std::string, std::string>& service_map_meta,
+                   Pauser* frontends);
+  ~RGWRealmReloader() override;
+
+  /// respond to realm notifications by scheduling a reload()
+  void handle_notify(RGWRealmNotify type, bufferlist::iterator& p) override;
+
+ private:
+  /// pause frontends and replace the RGWRados instance
+  void reload();
+
+  class C_Reload; //< Context that calls reload()
+
+  /// main()'s RGWRados pointer as a reference, modified by reload()
+  RGWRados*& store;
+  std::map<std::string, std::string>& service_map_meta;
+  Pauser *const frontends;
+
+  /// reload() takes a significant amount of time, so we don't want to run
+  /// it in the handle_notify() thread. we choose a timer thread instead of a
+  /// Finisher because it allows us to cancel events that were scheduled while
+  /// reload() is still running
+  SafeTimer timer;
+  Mutex mutex; //< protects access to timer and reload_scheduled
+  Cond cond; //< to signal reload() after an invalid realm config
+  C_Reload* reload_scheduled; //< reload() context if scheduled
+};
+
+#endif // RGW_REALM_RELOADER_H