]> git.proxmox.com Git - ceph.git/blame - ceph/src/librbd/LibrbdAdminSocketHook.cc
update sources to v12.2.1
[ceph.git] / ceph / src / librbd / LibrbdAdminSocketHook.cc
CommitLineData
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#include "common/errno.h"
5
6#include "librbd/ImageCtx.h"
7#include "librbd/LibrbdAdminSocketHook.h"
8#include "librbd/internal.h"
9
10#define dout_subsys ceph_subsys_rbd
11#undef dout_prefix
12#define dout_prefix *_dout << "librbdadminsocket: "
13
14namespace librbd {
15
16class LibrbdAdminSocketCommand {
17public:
18 virtual ~LibrbdAdminSocketCommand() {}
19 virtual bool call(stringstream *ss) = 0;
20};
21
22class FlushCacheCommand : public LibrbdAdminSocketCommand {
23public:
24 explicit FlushCacheCommand(ImageCtx *ictx) : ictx(ictx) {}
25
26 bool call(stringstream *ss) override {
27 int r = flush(ictx);
28 if (r < 0) {
29 *ss << "flush: " << cpp_strerror(r);
30 return false;
31 }
32 return true;
33 }
34
35private:
36 ImageCtx *ictx;
37};
38
39struct InvalidateCacheCommand : public LibrbdAdminSocketCommand {
40public:
41 explicit InvalidateCacheCommand(ImageCtx *ictx) : ictx(ictx) {}
42
43 bool call(stringstream *ss) override {
44 int r = invalidate_cache(ictx);
45 if (r < 0) {
46 *ss << "invalidate_cache: " << cpp_strerror(r);
47 return false;
48 }
49 return true;
50 }
51
52private:
53 ImageCtx *ictx;
54};
55
56LibrbdAdminSocketHook::LibrbdAdminSocketHook(ImageCtx *ictx) :
57 admin_socket(ictx->cct->get_admin_socket()) {
58
59 std::string command;
60 std::string imagename;
61 int r;
62
63 imagename = ictx->md_ctx.get_pool_name() + "/" + ictx->name;
64 command = "rbd cache flush " + imagename;
65
66 r = admin_socket->register_command(command, command, this,
67 "flush rbd image " + imagename +
68 " cache");
69 if (r == 0) {
70 commands[command] = new FlushCacheCommand(ictx);
71 }
72
73 command = "rbd cache invalidate " + imagename;
74 r = admin_socket->register_command(command, command, this,
75 "invalidate rbd image " + imagename +
76 " cache");
77 if (r == 0) {
78 commands[command] = new InvalidateCacheCommand(ictx);
79 }
80}
81
82LibrbdAdminSocketHook::~LibrbdAdminSocketHook() {
83 for (Commands::const_iterator i = commands.begin(); i != commands.end();
84 ++i) {
85 (void)admin_socket->unregister_command(i->first);
86 delete i->second;
87 }
88}
89
90bool LibrbdAdminSocketHook::call(std::string command, cmdmap_t& cmdmap,
91 std::string format, bufferlist& out) {
92 Commands::const_iterator i = commands.find(command);
93 assert(i != commands.end());
94 stringstream ss;
95 bool r = i->second->call(&ss);
96 out.append(ss);
97 return r;
98}
99
100} // namespace librbd