]>
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 | #ifndef CEPH_LIBRBD_OPERATION_TRIM_REQUEST_H | |
4 | #define CEPH_LIBRBD_OPERATION_TRIM_REQUEST_H | |
5 | ||
6 | #include "librbd/AsyncRequest.h" | |
7 | ||
8 | namespace librbd | |
9 | { | |
10 | ||
11 | class ImageCtx; | |
12 | class ProgressContext; | |
13 | ||
14 | namespace operation { | |
15 | ||
16 | template <typename ImageCtxT = ImageCtx> | |
17 | class TrimRequest : public AsyncRequest<ImageCtxT> | |
18 | { | |
19 | public: | |
20 | static TrimRequest *create(ImageCtxT &image_ctx, Context *on_finish, | |
21 | uint64_t original_size, uint64_t new_size, | |
22 | ProgressContext &prog_ctx) { | |
23 | return new TrimRequest(image_ctx, on_finish, original_size, new_size, | |
24 | prog_ctx); | |
25 | } | |
26 | ||
3efd9988 FG |
27 | TrimRequest(ImageCtxT &image_ctx, Context *on_finish, |
28 | uint64_t original_size, uint64_t new_size, | |
29 | ProgressContext &prog_ctx); | |
30 | ||
7c673cae FG |
31 | void send() override; |
32 | ||
33 | protected: | |
34 | /** | |
35 | * Trim goes through the following state machine to remove whole objects, | |
36 | * clean partially trimmed objects, and update the object map: | |
37 | * | |
38 | * @verbatim | |
39 | * | |
3efd9988 FG |
40 | * <start> . . . . . . . . . . . . . . . . . |
41 | * | . | |
42 | * v (skip if not needed) . | |
43 | * STATE_PRE_TRIM . | |
44 | * | . | |
45 | * v (skip if not needed) . | |
46 | * STATE_COPYUP_OBJECTS . | |
47 | * | . | |
48 | * v (skip if not needed) . | |
49 | * STATE_REMOVE_OBJECTS . | |
50 | * | . | |
51 | * v (skip if not needed) . | |
52 | * STATE_POST_TRIM . | |
53 | * | . | |
54 | * v (skip if not needed) . | |
55 | * STATE_CLEAN_BOUNDARY . | |
56 | * | . | |
57 | * v . | |
58 | * STATE_FINISHED < . . . . . . . . . . . . . . . | |
59 | * | | |
60 | * v | |
61 | * <finish> | |
7c673cae FG |
62 | * |
63 | * The _COPYUP_OBJECTS state is skipped if there is no parent overlap | |
64 | * within the new image size and the image does not have any snapshots. | |
3efd9988 | 65 | * The _PRE_TRIM/_POST_TRIM states are skipped if the object map |
7c673cae FG |
66 | * isn't enabled. The _REMOVE_OBJECTS state is skipped if no whole objects |
67 | * are removed. The _CLEAN_BOUNDARY state is skipped if no boundary | |
68 | * objects are cleaned. The state machine will immediately transition | |
69 | * to _FINISHED state if there are no bytes to trim. | |
3efd9988 | 70 | */ |
7c673cae FG |
71 | |
72 | enum State { | |
3efd9988 | 73 | STATE_PRE_TRIM, |
7c673cae | 74 | STATE_COPYUP_OBJECTS, |
7c673cae | 75 | STATE_REMOVE_OBJECTS, |
3efd9988 | 76 | STATE_POST_TRIM, |
7c673cae FG |
77 | STATE_CLEAN_BOUNDARY, |
78 | STATE_FINISHED | |
79 | }; | |
80 | ||
81 | bool should_complete(int r) override; | |
82 | ||
3efd9988 | 83 | State m_state = STATE_PRE_TRIM; |
7c673cae FG |
84 | |
85 | private: | |
86 | uint64_t m_delete_start; | |
3efd9988 | 87 | uint64_t m_delete_start_min = 0; |
7c673cae FG |
88 | uint64_t m_num_objects; |
89 | uint64_t m_delete_off; | |
90 | uint64_t m_new_size; | |
91 | ProgressContext &m_prog_ctx; | |
92 | ||
3efd9988 | 93 | void send_pre_trim(); |
7c673cae | 94 | void send_copyup_objects(); |
7c673cae | 95 | void send_remove_objects(); |
3efd9988 | 96 | void send_post_trim(); |
7c673cae FG |
97 | |
98 | void send_clean_boundary(); | |
99 | void send_finish(int r); | |
100 | }; | |
101 | ||
102 | } // namespace operation | |
103 | } // namespace librbd | |
104 | ||
105 | extern template class librbd::operation::TrimRequest<librbd::ImageCtx>; | |
106 | ||
107 | #endif // CEPH_LIBRBD_OPERATION_TRIM_REQUEST_H |