summaryrefslogtreecommitdiffstats
path: root/src/tools/rbd_mirror/image_deleter/TrashMoveRequest.h
blob: 5b3f025194be88465af513ab2d25699d5c76bfdd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab

#ifndef CEPH_RBD_MIRROR_IMAGE_DELETE_TRASH_MOVE_REQUEST_H
#define CEPH_RBD_MIRROR_IMAGE_DELETE_TRASH_MOVE_REQUEST_H

#include "include/buffer.h"
#include "include/rados/librados.hpp"
#include "cls/rbd/cls_rbd_types.h"
#include "librbd/mirror/Types.h"
#include <string>

struct Context;
namespace librbd {
struct ImageCtx;
namespace asio { struct ContextWQ; }
} // namespace librbd

namespace rbd {
namespace mirror {
namespace image_deleter {

template <typename ImageCtxT = librbd::ImageCtx>
class TrashMoveRequest {
public:
  static TrashMoveRequest* create(librados::IoCtx& io_ctx,
                                  const std::string& global_image_id,
                                  bool resync,
                                  librbd::asio::ContextWQ* op_work_queue,
                                  Context* on_finish) {
    return new TrashMoveRequest(io_ctx, global_image_id, resync, op_work_queue,
                                on_finish);
  }

  TrashMoveRequest(librados::IoCtx& io_ctx, const std::string& global_image_id,
                   bool resync, librbd::asio::ContextWQ* op_work_queue,
                   Context* on_finish)
    : m_io_ctx(io_ctx), m_global_image_id(global_image_id), m_resync(resync),
      m_op_work_queue(op_work_queue), m_on_finish(on_finish) {
  }

  void send();

private:
  /*
   * @verbatim
   *
   * <start>
   *    |
   *    v
   * GET_MIRROR_IMAGE_ID
   *    |
   *    v
   * GET_MIRROR_INFO
   *    |
   *    v
   * DISABLE_MIRROR_IMAGE
   *    |
   *    v
   * OPEN_IMAGE
   *    |
   *    v (skip if not needed)
   * RESET_JOURNAL
   *    |
   *    v (skip if not needed)
   * ACQUIRE_LOCK
   *    |
   *    v
   * TRASH_MOVE
   *    |
   *    v
   * REMOVE_MIRROR_IMAGE
   *    |
   *    v
   * CLOSE_IMAGE
   *    |
   *    v
   * NOTIFY_TRASH_ADD
   *    |
   *    v
   * <finish>
   *
   * @endverbatim
   */

  librados::IoCtx &m_io_ctx;
  std::string m_global_image_id;
  bool m_resync;
  librbd::asio::ContextWQ *m_op_work_queue;
  Context *m_on_finish;

  ceph::bufferlist m_out_bl;
  std::string m_image_id;
  cls::rbd::MirrorImage m_mirror_image;
  librbd::mirror::PromotionState m_promotion_state;
  std::string m_primary_mirror_uuid;
  cls::rbd::TrashImageSpec m_trash_image_spec;
  ImageCtxT *m_image_ctx = nullptr;;
  int m_ret_val = 0;
  bool m_moved_to_trash = false;

  void get_mirror_image_id();
  void handle_get_mirror_image_id(int r);

  void get_mirror_info();
  void handle_get_mirror_info(int r);

  void disable_mirror_image();
  void handle_disable_mirror_image(int r);

  void open_image();
  void handle_open_image(int r);

  void reset_journal();
  void handle_reset_journal(int r);

  void acquire_lock();
  void handle_acquire_lock(int r);

  void trash_move();
  void handle_trash_move(int r);

  void remove_mirror_image();
  void handle_remove_mirror_image(int r);

  void close_image();
  void handle_close_image(int r);

  void notify_trash_add();
  void handle_notify_trash_add(int r);

  void finish(int r);

};

} // namespace image_deleter
} // namespace mirror
} // namespace rbd

extern template class rbd::mirror::image_deleter::TrashMoveRequest<librbd::ImageCtx>;

#endif // CEPH_RBD_MIRROR_IMAGE_DELETE_TRASH_WATCHER_H