Skip to content

Commit 9ddcf45

Browse files
authored
Merge pull request ceph#51034 from rzarzynski/wip-bug-59429
crimson/osd: fix ENOENT on accessing RadosGW user's index of buckets Reviewed-by: Samuel Just <[email protected]>
2 parents fe6ae27 + cfb7a9c commit 9ddcf45

File tree

3 files changed

+43
-11
lines changed

3 files changed

+43
-11
lines changed

src/crimson/osd/osd_operations/client_request.cc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "crimson/osd/osd_operation_external_tracking.h"
1212
#include "crimson/osd/osd_operations/client_request.h"
1313
#include "crimson/osd/osd_connection_priv.h"
14+
#include "osd/object_state_fmt.h"
1415

1516
namespace {
1617
seastar::logger& logger() {
@@ -226,11 +227,13 @@ ClientRequest::process_op(instance_handle_t &ihref, Ref<PG> &pg)
226227
return pg->with_locked_obc(
227228
m->get_hobj(), op_info,
228229
[this, pg, &ihref](auto obc) mutable {
229-
return ihref.enter_stage<interruptor>(pp(*pg).process, *this
230-
).then_interruptible([this, pg, obc, &ihref]() mutable {
231-
return do_process(ihref, pg, obc);
230+
logger().debug("{}: got obc {}", *this, obc->obs);
231+
return ihref.enter_stage<interruptor>(
232+
pp(*pg).process, *this
233+
).then_interruptible([this, pg, obc, &ihref]() mutable {
234+
return do_process(ihref, pg, obc);
235+
});
232236
});
233-
});
234237
});
235238
}
236239
});

src/crimson/osd/pg_backend.cc

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,13 +1338,19 @@ PGBackend::omap_get_header(
13381338
OSDOp& osd_op,
13391339
object_stat_sum_t& delta_stats) const
13401340
{
1341-
return omap_get_header(coll, ghobject_t{os.oi.soid}).safe_then_interruptible(
1342-
[&delta_stats, &osd_op] (ceph::bufferlist&& header) {
1343-
osd_op.outdata = std::move(header);
1344-
delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
1345-
delta_stats.num_rd++;
1346-
return seastar::now();
1347-
});
1341+
if (os.oi.is_omap()) {
1342+
return omap_get_header(coll, ghobject_t{os.oi.soid}).safe_then_interruptible(
1343+
[&delta_stats, &osd_op] (ceph::bufferlist&& header) {
1344+
osd_op.outdata = std::move(header);
1345+
delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
1346+
delta_stats.num_rd++;
1347+
return seastar::now();
1348+
});
1349+
} else {
1350+
// no omap? return empty data but not ENOENT. This is imporant for
1351+
// the case when the object is being creating due to to may_write().
1352+
return seastar::now();
1353+
}
13481354
}
13491355

13501356
PGBackend::ll_read_ierrorator::future<>

src/osd/object_state_fmt.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2+
// vim: ts=8 sw=2 smarttab
3+
#pragma once
4+
/**
5+
* \file fmtlib formatters for some types.h classes
6+
*/
7+
8+
#include "osd/object_state.h"
9+
#include "osd/osd_types_fmt.h"
10+
#if FMT_VERSION >= 90000
11+
#include <fmt/ostream.h>
12+
#endif
13+
14+
template <>
15+
struct fmt::formatter<ObjectState> {
16+
constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }
17+
18+
template <typename FormatContext>
19+
auto format(const ObjectState& os, FormatContext& ctx) const
20+
{
21+
return fmt::format_to(ctx.out(), "exists {} oi {}", os.exists, os.oi);
22+
}
23+
};

0 commit comments

Comments
 (0)