Skip to content

Commit ae012cc

Browse files
bill-scalesaainscow
authored andcommitted
test: ceph_test_rados_io_sequence - add truncate
Add support for truncate I/O in interactive mode Signed-off-by: Bill Scales <[email protected]>
1 parent fff72a0 commit ae012cc

File tree

6 files changed

+48
-0
lines changed

6 files changed

+48
-0
lines changed

src/common/io_exerciser/IoOp.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ using SingleFailedWriteOp = ceph::io_exerciser::SingleFailedWriteOp;
2020
using DoubleFailedWriteOp = ceph::io_exerciser::DoubleFailedWriteOp;
2121
using TripleFailedWriteOp = ceph::io_exerciser::TripleFailedWriteOp;
2222
using SingleAppendOp = ceph::io_exerciser::SingleAppendOp;
23+
using TruncateOp = ceph::io_exerciser::TruncateOp;
2324

2425
namespace {
2526
std::string value_to_string(uint64_t v) {
@@ -215,6 +216,17 @@ std::unique_ptr<SingleAppendOp> SingleAppendOp::generate(uint64_t length) {
215216
return std::make_unique<SingleAppendOp>(length);
216217
}
217218

219+
TruncateOp::TruncateOp(uint64_t size)
220+
: TestOp<OpType::Truncate>(), size(size) {}
221+
222+
std::unique_ptr<TruncateOp> TruncateOp::generate(uint64_t size) {
223+
return std::make_unique<TruncateOp>(size);
224+
}
225+
226+
std::string TruncateOp::to_string(uint64_t block_size) const {
227+
return "Truncate (size=" + value_to_string(size * block_size) + ")";
228+
}
229+
218230
SingleFailedWriteOp::SingleFailedWriteOp(uint64_t offset, uint64_t length)
219231
: ReadWriteOp<OpType::FailedWrite, 1>({offset}, {length}) {}
220232

src/common/io_exerciser/IoOp.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,14 @@ class SingleAppendOp : public ReadWriteOp<OpType::Append, 1> {
131131
static std::unique_ptr<SingleAppendOp> generate(uint64_t length);
132132
};
133133

134+
class TruncateOp : public TestOp<OpType::Truncate> {
135+
public:
136+
TruncateOp(uint64_t size);
137+
static std::unique_ptr<TruncateOp> generate(uint64_t size);
138+
std::string to_string(uint64_t block_size) const override;
139+
uint64_t size;
140+
};
141+
134142
class SingleFailedWriteOp : public ReadWriteOp<OpType::FailedWrite, 1> {
135143
public:
136144
SingleFailedWriteOp(uint64_t offset, uint64_t length);

src/common/io_exerciser/ObjectModel.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ void ObjectModel::applyIoOp(IoOp& op) {
118118
generate_random);
119119
break;
120120

121+
case OpType::Truncate:
122+
ceph_assert(created);
123+
ceph_assert(reads.empty());
124+
ceph_assert(writes.empty());
125+
contents.resize(static_cast<TruncateOp&>(op).size);
126+
break;
127+
121128
case OpType::Remove:
122129
ceph_assert(created);
123130
ceph_assert(reads.empty());

src/common/io_exerciser/OpType.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ enum class OpType {
2424
Write2, // Two writes in a single op
2525
Write3, // Three writes in a single op
2626
Append, // Append
27+
Truncate, // Truncate
2728
FailedWrite, // A write which should fail
2829
FailedWrite2, // Two writes in one op which should fail
2930
FailedWrite3, // Three writes in one op which should fail
@@ -72,6 +73,8 @@ struct fmt::formatter<ceph::io_exerciser::OpType> {
7273
return fmt::format_to(ctx.out(), "Write3");
7374
case ceph::io_exerciser::OpType::Append:
7475
return fmt::format_to(ctx.out(), "Append");
76+
case ceph::io_exerciser::OpType::Truncate:
77+
return fmt::format_to(ctx.out(), "Truncate");
7578
case ceph::io_exerciser::OpType::FailedWrite:
7679
return fmt::format_to(ctx.out(), "FailedWrite");
7780
case ceph::io_exerciser::OpType::FailedWrite2:

src/common/io_exerciser/RadosIo.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,21 @@ void RadosIo::applyIoOp(IoOp& op) {
146146
break;
147147
}
148148

149+
case OpType::Truncate: {
150+
start_io();
151+
uint64_t opSize = static_cast<TruncateOp&>(op).size;
152+
auto op_info = std::make_shared<AsyncOpInfo<0>>();
153+
librados::ObjectWriteOperation wop;
154+
wop.truncate(opSize * block_size);
155+
auto truncate_cb = [this](boost::system::error_code ec, version_t ver) {
156+
ceph_assert(ec == boost::system::errc::success);
157+
finish_io();
158+
};
159+
librados::async_operate(asio.get_executor(), io, oid, std::move(wop), 0,
160+
nullptr, truncate_cb);
161+
break;
162+
}
163+
149164
case OpType::Remove: {
150165
start_io();
151166
auto op_info = std::make_shared<AsyncOpInfo<0>>();

src/test/osd/ceph_test_rados_io_sequence.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ using SingleWriteOp = ceph::io_exerciser::SingleWriteOp;
4949
using DoubleWriteOp = ceph::io_exerciser::DoubleWriteOp;
5050
using TripleWriteOp = ceph::io_exerciser::TripleWriteOp;
5151
using SingleAppendOp = ceph::io_exerciser::SingleAppendOp;
52+
using TruncateOp = ceph::io_exerciser::TruncateOp;
5253
using SingleFailedWriteOp = ceph::io_exerciser::SingleFailedWriteOp;
5354
using DoubleFailedWriteOp = ceph::io_exerciser::DoubleFailedWriteOp;
5455
using TripleFailedWriteOp = ceph::io_exerciser::TripleFailedWriteOp;
@@ -811,6 +812,8 @@ bool ceph::io_sequence::tester::TestRunner::run_interactive_test() {
811812
} else if (op == "append") {
812813
uint64_t length = get_numeric_token();
813814
ioop = SingleAppendOp::generate(length);
815+
} else if (op == "truncate") {
816+
ioop = TruncateOp::generate(get_numeric_token());
814817
} else if (op == "failedwrite") {
815818
uint64_t offset = get_numeric_token();
816819
uint64_t length = get_numeric_token();

0 commit comments

Comments
 (0)