]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/librados/test_common.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "common/Formatter.h"
5 #include "include/stringify.h"
6 #include "json_spirit/json_spirit.h"
7 #include "test_common.h"
13 int wait_for_healthy(rados_t
*cluster
)
16 // This timeout is very long because the tests are sometimes
17 // run on a thrashing cluster
23 cmd_f
.open_object_section("command");
24 cmd_f
.dump_string("prefix", "status");
25 cmd_f
.dump_string("format", "json");
26 cmd_f
.close_section();
27 std::ostringstream cmd_stream
;
28 cmd_f
.flush(cmd_stream
);
29 const std::string serialized_cmd
= cmd_stream
.str();
33 cmd
[0] = serialized_cmd
.c_str();
37 int ret
= rados_mon_command(*cluster
, (const char **)cmd
, 1, "", 0,
38 &outbuf
, &outlen
, NULL
, NULL
);
43 std::string
out(outbuf
, outlen
);
44 rados_buffer_free(outbuf
);
46 json_spirit::mValue root
;
47 assert(json_spirit::read(out
, root
));
48 json_spirit::mObject root_obj
= root
.get_obj();
49 json_spirit::mObject pgmap
= root_obj
["pgmap"].get_obj();
50 json_spirit::mArray pgs_by_state
= pgmap
["pgs_by_state"].get_array();
52 if (pgs_by_state
.size() == 1) {
53 json_spirit::mObject state
= pgs_by_state
[0].get_obj();
54 std::string state_name
= state
["state_name"].get_str();
55 if (state_name
!= std::string("active+clean")) {
64 if (slept
>= timeout
) {
79 const std::string
&pool_name
,
80 const std::string
&var
,
81 const std::string
&val
)
84 cmd_f
.open_object_section("command");
85 cmd_f
.dump_string("prefix", "osd pool set");
86 cmd_f
.dump_string("pool", pool_name
);
87 cmd_f
.dump_string("var", var
);
88 cmd_f
.dump_string("val", val
);
89 cmd_f
.close_section();
91 std::ostringstream cmd_stream
;
92 cmd_f
.flush(cmd_stream
);
94 const std::string serialized_cmd
= cmd_stream
.str();
98 cmd
[0] = serialized_cmd
.c_str();
99 int ret
= rados_mon_command(*cluster
, (const char **)cmd
, 1, "", 0, NULL
,
104 struct pool_op_error
: std::exception
{
106 pool_op_error(const std::string
& pool_name
,
107 const std::string
& func_name
,
109 std::ostringstream oss
;
110 oss
<< func_name
<< "(" << pool_name
<< ") failed with error " << err
;
113 const char* what() const noexcept override
{
118 template<typename Func
>
119 std::string
with_healthy_cluster(rados_t
* cluster
,
120 const std::string
& pool_name
,
124 // Wait for 'creating/backfilling' to clear
125 int r
= wait_for_healthy(cluster
);
127 throw pool_op_error
{pool_name
, "wait_for_healthy", r
};
130 // Wait for 'creating/backfilling' to clear
131 r
= wait_for_healthy(cluster
);
133 throw pool_op_error
{pool_name
, "wait_for_healthy", r
};
135 } catch (const pool_op_error
& e
) {
136 rados_shutdown(*cluster
);
143 std::string
set_pg_num(
144 rados_t
*cluster
, const std::string
&pool_name
, uint32_t pg_num
)
146 return with_healthy_cluster(cluster
, pool_name
, [&] {
148 int r
= rados_pool_set(cluster
, pool_name
, "pg_num",
151 throw pool_op_error
{pool_name
, "set_pg_num", r
};
156 std::string
set_pgp_num(
157 rados_t
*cluster
, const std::string
&pool_name
, uint32_t pgp_num
)
159 return with_healthy_cluster(cluster
, pool_name
, [&] {
161 int r
= rados_pool_set(cluster
, pool_name
, "pgp_num",
164 throw pool_op_error
{pool_name
, "set_pgp_num", r
};