Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / test / librados_test_stub / TestIoCtxImpl.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 CEPH_TEST_IO_CTX_IMPL_H
5 #define CEPH_TEST_IO_CTX_IMPL_H
6
7 #include <list>
8 #include <atomic>
9
10 #include <boost/function.hpp>
11
12 #include "include/rados/librados.hpp"
13 #include "include/Context.h"
14 #include "common/snap_types.h"
15
16 namespace librados {
17
18 class TestClassHandler;
19 class TestIoCtxImpl;
20 class TestRadosClient;
21
22 typedef boost::function<int(TestIoCtxImpl*,
23                             const std::string&,
24                             bufferlist *,
25                             const SnapContext &)> ObjectOperationTestImpl;
26 typedef std::list<ObjectOperationTestImpl> ObjectOperations;
27
28 struct TestObjectOperationImpl {
29 public:
30   void get();
31   void put();
32
33   ObjectOperations ops;
34 private:
35   std::atomic<uint64_t> m_refcount = { 0 };
36 };
37
38 class TestIoCtxImpl {
39 public:
40   typedef boost::function<int(TestIoCtxImpl *, const std::string &)> Operation;
41
42
43   TestIoCtxImpl();
44   explicit TestIoCtxImpl(TestRadosClient *client, int64_t m_pool_id,
45                          const std::string& pool_name);
46
47   TestRadosClient *get_rados_client() {
48     return m_client;
49   }
50
51   void get();
52   void put();
53
54   inline int64_t get_pool_id() const {
55     return m_pool_id;
56   }
57
58   virtual TestIoCtxImpl *clone() = 0;
59
60   virtual uint64_t get_instance_id() const;
61   virtual int64_t get_id();
62   virtual uint64_t get_last_version();
63   virtual std::string get_pool_name();
64   snap_t get_snap_read() const {
65     return m_snap_seq;
66   }
67
68   inline void set_snap_context(const SnapContext& snapc) {
69     m_snapc = snapc;
70   }
71   const SnapContext &get_snap_context() const {
72     return m_snapc;
73   }
74
75   virtual int aio_flush();
76   virtual void aio_flush_async(AioCompletionImpl *c);
77   virtual void aio_notify(const std::string& oid, AioCompletionImpl *c,
78                           bufferlist& bl, uint64_t timeout_ms, bufferlist *pbl);
79   virtual int aio_operate(const std::string& oid, TestObjectOperationImpl &ops,
80                           AioCompletionImpl *c, SnapContext *snap_context,
81                           int flags);
82   virtual int aio_operate_read(const std::string& oid, TestObjectOperationImpl &ops,
83                                AioCompletionImpl *c, int flags,
84                                bufferlist *pbl);
85   virtual int aio_remove(const std::string& oid, AioCompletionImpl *c) = 0;
86   virtual int aio_watch(const std::string& o, AioCompletionImpl *c,
87                         uint64_t *handle, librados::WatchCtx2 *ctx);
88   virtual int aio_unwatch(uint64_t handle, AioCompletionImpl *c);
89   virtual int append(const std::string& oid, const bufferlist &bl,
90                      const SnapContext &snapc) = 0;
91   virtual int assert_exists(const std::string &oid) = 0;
92
93   virtual int create(const std::string& oid, bool exclusive) = 0;
94   virtual int exec(const std::string& oid, TestClassHandler *handler,
95                    const char *cls, const char *method,
96                    bufferlist& inbl, bufferlist* outbl,
97                    const SnapContext &snapc);
98   virtual int list_snaps(const std::string& o, snap_set_t *out_snaps) = 0;
99   virtual int list_watchers(const std::string& o,
100                             std::list<obj_watch_t> *out_watchers);
101   virtual int notify(const std::string& o, bufferlist& bl,
102                      uint64_t timeout_ms, bufferlist *pbl);
103   virtual void notify_ack(const std::string& o, uint64_t notify_id,
104                           uint64_t handle, bufferlist& bl);
105   virtual int omap_get_vals(const std::string& oid,
106                             const std::string& start_after,
107                             const std::string &filter_prefix,
108                             uint64_t max_return,
109                             std::map<std::string, bufferlist> *out_vals) = 0;
110   virtual int omap_get_vals2(const std::string& oid,
111                             const std::string& start_after,
112                             const std::string &filter_prefix,
113                             uint64_t max_return,
114                             std::map<std::string, bufferlist> *out_vals,
115                             bool *pmore) = 0;
116   virtual int omap_rm_keys(const std::string& oid,
117                            const std::set<std::string>& keys) = 0;
118   virtual int omap_set(const std::string& oid,
119                        const std::map<std::string, bufferlist> &map) = 0;
120   virtual int operate(const std::string& oid, TestObjectOperationImpl &ops);
121   virtual int operate_read(const std::string& oid, TestObjectOperationImpl &ops,
122                            bufferlist *pbl);
123   virtual int read(const std::string& oid, size_t len, uint64_t off,
124                    bufferlist *bl) = 0;
125   virtual int remove(const std::string& oid, const SnapContext &snapc) = 0;
126   virtual int selfmanaged_snap_create(uint64_t *snapid) = 0;
127   virtual void aio_selfmanaged_snap_create(uint64_t *snapid,
128                                            AioCompletionImpl *c);
129   virtual int selfmanaged_snap_remove(uint64_t snapid) = 0;
130   virtual void aio_selfmanaged_snap_remove(uint64_t snapid,
131                                            AioCompletionImpl *c);
132   virtual int selfmanaged_snap_rollback(const std::string& oid,
133                                         uint64_t snapid) = 0;
134   virtual int selfmanaged_snap_set_write_ctx(snap_t seq,
135                                              std::vector<snap_t>& snaps);
136   virtual int set_alloc_hint(const std::string& oid,
137                              uint64_t expected_object_size,
138                              uint64_t expected_write_size);
139   virtual void set_snap_read(snap_t seq);
140   virtual int sparse_read(const std::string& oid, uint64_t off, uint64_t len,
141                           std::map<uint64_t,uint64_t> *m,
142                           bufferlist *data_bl) = 0;
143   virtual int stat(const std::string& oid, uint64_t *psize, time_t *pmtime) = 0;
144   virtual int truncate(const std::string& oid, uint64_t size,
145                        const SnapContext &snapc) = 0;
146   virtual int tmap_update(const std::string& oid, bufferlist& cmdbl);
147   virtual int unwatch(uint64_t handle);
148   virtual int watch(const std::string& o, uint64_t *handle,
149                     librados::WatchCtx *ctx, librados::WatchCtx2 *ctx2);
150   virtual int write(const std::string& oid, bufferlist& bl, size_t len,
151                     uint64_t off, const SnapContext &snapc) = 0;
152   virtual int write_full(const std::string& oid, bufferlist& bl,
153                          const SnapContext &snapc) = 0;
154   virtual int writesame(const std::string& oid, bufferlist& bl, size_t len,
155                         uint64_t off, const SnapContext &snapc) = 0;
156   virtual int cmpext(const std::string& oid, uint64_t off, bufferlist& cmp_bl) = 0;
157   virtual int xattr_get(const std::string& oid,
158                         std::map<std::string, bufferlist>* attrset) = 0;
159   virtual int xattr_set(const std::string& oid, const std::string &name,
160                         bufferlist& bl) = 0;
161   virtual int zero(const std::string& oid, uint64_t off, uint64_t len) = 0;
162
163   int execute_operation(const std::string& oid,
164                         const Operation &operation);
165
166 protected:
167   TestIoCtxImpl(const TestIoCtxImpl& rhs);
168   virtual ~TestIoCtxImpl();
169
170   int execute_aio_operations(const std::string& oid,
171                              TestObjectOperationImpl *ops,
172                              bufferlist *pbl, const SnapContext &snapc);
173
174 private:
175   struct C_AioNotify : public Context {
176     TestIoCtxImpl *io_ctx;
177     AioCompletionImpl *aio_comp;
178     C_AioNotify(TestIoCtxImpl *_io_ctx, AioCompletionImpl *_aio_comp)
179       : io_ctx(_io_ctx), aio_comp(_aio_comp) {
180     }
181     void finish(int r) override {
182       io_ctx->handle_aio_notify_complete(aio_comp, r);
183     }
184   };
185
186   TestRadosClient *m_client;
187   int64_t m_pool_id;
188   std::string m_pool_name;
189   snap_t m_snap_seq;
190   SnapContext m_snapc;
191   std::atomic<uint64_t> m_refcount = { 0 };
192   std::atomic<uint64_t> m_pending_ops = { 0 };
193
194   void handle_aio_notify_complete(AioCompletionImpl *aio_comp, int r);
195 };
196
197 } // namespace librados
198
199 #endif // CEPH_TEST_IO_CTX_IMPL_H