});
}
+ObjectContextLoader::load_obc_iertr::future<>
+ObjectContextLoader::load_obc(
+ ObjectContextRef obc,
+ PGBackend::loaded_object_md_t::ref md)
+{
+ const hobject_t& oid = md->os.oi.soid;
+ LOG_PREFIX(ObjectContextLoader::load_obc);
+ DEBUGDPP("loaded obs {} for {}", dpp, md->os.oi, oid);
+ if (oid.is_head()) {
+ if (!md->ssc) {
+ ERRORDPP("oid {} missing snapsetcontext", dpp, oid);
+ return crimson::ct_error::object_corrupted::make();
+ }
+ obc->set_head_state(std::move(md->os),
+ std::move(md->ssc));
+ } else {
+ // we load and set the ssc only for head obc.
+ // For clones, the head's ssc will be referenced later.
+ // See set_clone_ssc
+ obc->set_clone_state(std::move(md->os));
+ }
+ obc->attr_cache = std::move(md->attr_cache);
+ DEBUGDPP("loaded obc {} for {}", dpp, obc->obs.oi, obc->obs.oi.soid);
+ return seastar::now();
+}
+
void ObjectContextLoader::notify_on_change(bool is_primary)
{
LOG_PREFIX(ObjectContextLoader::notify_on_change);
#include "crimson/common/coroutine.h"
#include "crimson/common/exception.h"
+#include "crimson/common/errorator-utils.h"
#include "crimson/common/tmap_helpers.h"
#include "crimson/os/futurized_collection.h"
#include "crimson/os/futurized_store.h"
logger().info("initialized PGBackend::store with {}", (void*)this->store);
}
-PGBackend::load_metadata_iertr::future
- <PGBackend::loaded_object_md_t::ref>
-PGBackend::decode_metadata(
+tl::expected<PGBackend::loaded_object_md_t::ref, std::error_code>
+PGBackend::decode_metadata2(
const hobject_t& oid,
crimson::os::FuturizedStore::Shard::attrs_t attrs)
{
logger().error(
"load_metadata: object {} present but missing object info",
oid);
- return crimson::ct_error::object_corrupted::make();
+ return tl::unexpected(
+ ErrorHelper<load_metadata_ertr>::to_error(
+ crimson::ct_error::object_corrupted::make()));
}
if (oid.is_head()) {
logger().error(
"load_metadata: object {} present but missing snapset",
oid);
- return crimson::ct_error::object_corrupted::make();
+ return tl::unexpected(
+ ErrorHelper<load_metadata_ertr>::to_error(
+ crimson::ct_error::object_corrupted::make()));
}
}
ret->attr_cache = std::move(attrs);
- return load_metadata_ertr::make_ready_future<loaded_object_md_t::ref>(
- std::move(ret));
+ return loaded_object_md_t::ref(std::move(ret));
}
PGBackend::load_metadata_iertr::future
return interruptor::make_interruptible(store->get_attrs(
coll,
ghobject_t{oid, ghobject_t::NO_GEN, get_shard()})).safe_then_interruptible(
- [oid, this](auto &&attrs) {
- return decode_metadata(oid, std::move(attrs));
+ [oid, this](auto &&attrs) -> load_metadata_iertr::future<PGBackend::loaded_object_md_t::ref> {
+ if (auto maybe_decoded = decode_metadata2(oid, std::move(attrs));
+ maybe_decoded.has_value()) {
+ return load_metadata_ertr::make_ready_future<loaded_object_md_t::ref>(
+ std::move(*maybe_decoded));
+ } else {
+ return ErrorHelper<load_metadata_ertr>\
+ ::from_error<PGBackend::loaded_object_md_t::ref>(maybe_decoded.error());
+ }
}, crimson::ct_error::enoent::handle([oid] {
logger().debug(
"load_metadata: object {} doesn't exist, returning empty metadata",
#include <string>
#include <boost/container/flat_set.hpp>
+#include "include/expected.hpp"
#include "include/rados.h"
#include "crimson/os/futurized_store.h"
crimson::os::FuturizedStore::Shard::attrs_t attr_cache;
using ref = std::unique_ptr<loaded_object_md_t>;
};
- load_metadata_iertr::future<loaded_object_md_t::ref>
- decode_metadata(
+
+ tl::expected<typename loaded_object_md_t::ref, std::error_code>
+ decode_metadata2(
const hobject_t& oid,
crimson::os::FuturizedStore::Shard::attrs_t attrs);