]> git.proxmox.com Git - ceph.git/blob - ceph/src/tools/rbd_mirror/ImageSyncThrottler.h
import 14.2.4 nautilus point release
[ceph.git] / ceph / src / tools / rbd_mirror / ImageSyncThrottler.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #ifndef RBD_MIRROR_IMAGE_SYNC_THROTTLER_H
5 #define RBD_MIRROR_IMAGE_SYNC_THROTTLER_H
6
7 #include <list>
8 #include <map>
9 #include <set>
10 #include <sstream>
11 #include <string>
12 #include <utility>
13
14 #include "common/Mutex.h"
15 #include "common/config_obs.h"
16
17 class CephContext;
18 class Context;
19
20 namespace ceph { class Formatter; }
21 namespace librbd { class ImageCtx; }
22
23 namespace rbd {
24 namespace mirror {
25
26 template <typename ImageCtxT = librbd::ImageCtx>
27 class ImageSyncThrottler : public md_config_obs_t {
28 public:
29 static ImageSyncThrottler *create(CephContext *cct) {
30 return new ImageSyncThrottler(cct);
31 }
32 void destroy() {
33 delete this;
34 }
35
36 ImageSyncThrottler(CephContext *cct);
37 ~ImageSyncThrottler() override;
38
39 void set_max_concurrent_syncs(uint32_t max);
40 void start_op(const std::string &id, Context *on_start);
41 bool cancel_op(const std::string &id);
42 void finish_op(const std::string &id);
43 void drain(int r);
44
45 void print_status(Formatter *f, std::stringstream *ss);
46
47 private:
48 CephContext *m_cct;
49 Mutex m_lock;
50 uint32_t m_max_concurrent_syncs;
51 std::list<std::string> m_queue;
52 std::map<std::string, Context *> m_queued_ops;
53 std::set<std::string> m_inflight_ops;
54
55 const char **get_tracked_conf_keys() const override;
56 void handle_conf_change(const ConfigProxy& conf,
57 const std::set<std::string> &changed) override;
58 };
59
60 } // namespace mirror
61 } // namespace rbd
62
63 extern template class rbd::mirror::ImageSyncThrottler<librbd::ImageCtx>;
64
65 #endif // RBD_MIRROR_IMAGE_SYNC_THROTTLER_H