]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 | ||
31f18b77 FG |
7 | #include <list> |
8 | #include <atomic> | |
9 | ||
10 | #include <boost/function.hpp> | |
11 | ||
7c673cae | 12 | #include "include/rados/librados.hpp" |
7c673cae FG |
13 | #include "include/Context.h" |
14 | #include "common/snap_types.h" | |
7c673cae FG |
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: | |
31f18b77 | 35 | std::atomic<uint64_t> m_refcount = { 0 }; |
7c673cae FG |
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; | |
c07f9fc5 FG |
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; | |
7c673cae FG |
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; | |
c07f9fc5 | 156 | virtual int cmpext(const std::string& oid, uint64_t off, bufferlist& cmp_bl) = 0; |
7c673cae FG |
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; | |
31f18b77 FG |
191 | std::atomic<uint64_t> m_refcount = { 0 }; |
192 | std::atomic<uint64_t> m_pending_ops = { 0 }; | |
7c673cae FG |
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 |