Note: * no actual users are added yet.
* load_inc_map returns erroartor since we should handle
inc maps reading errors (not-fatal).
Signed-off-by: Matan Breizman <mbreizma@redhat.com>
#include "osd/OSDMap.h"
using std::string;
-using read_errorator = crimson::os::FuturizedStore::Shard::read_errorator;
void OSDMeta::create(ceph::os::Transaction& t)
{
t.write(coll->get_cid(), osdmap_oid(e), 0, m.length(), m);
}
+void OSDMeta::store_inc_map(ceph::os::Transaction& t,
+ epoch_t e, const bufferlist& m)
+{
+ t.write(coll->get_cid(), inc_osdmap_oid(e), 0, m.length(), m);
+}
+
void OSDMeta::remove_map(ceph::os::Transaction& t, epoch_t e)
{
t.remove(coll->get_cid(), osdmap_oid(e));
}
+void OSDMeta::remove_inc_map(ceph::os::Transaction& t, epoch_t e)
+{
+ t.remove(coll->get_cid(), inc_osdmap_oid(e));
+}
+
seastar::future<bufferlist> OSDMeta::load_map(epoch_t e)
{
return store.read(coll,
}));
}
+read_errorator::future<ceph::bufferlist> OSDMeta::load_inc_map(epoch_t e)
+{
+ return store.read(coll,
+ osdmap_oid(e), 0, 0,
+ CEPH_OSD_OP_FLAG_FADVISE_WILLNEED);
+}
+
void OSDMeta::store_superblock(ceph::os::Transaction& t,
const OSDSuperblock& superblock)
{
return ghobject_t(hobject_t(sobject_t(object_t(name), 0)));
}
+ghobject_t OSDMeta::inc_osdmap_oid(epoch_t epoch)
+{
+ string name = fmt::format("inc_osdmap.{}", epoch);
+ return ghobject_t(hobject_t(sobject_t(object_t(name), 0)));
+}
+
ghobject_t OSDMeta::final_pool_info_oid(int64_t pool)
{
string name = fmt::format("final_pool_{}", pool);
class FuturizedStore;
}
+using read_errorator = crimson::os::FuturizedStore::Shard::read_errorator;
+
/// metadata shared across PGs, or put in another way,
/// metadata not specific to certain PGs.
class OSDMeta {
void store_map(ceph::os::Transaction& t,
epoch_t e, const bufferlist& m);
+ void store_inc_map(ceph::os::Transaction& t,
+ epoch_t e, const bufferlist& m);
void remove_map(ceph::os::Transaction& t, epoch_t e);
+ void remove_inc_map(ceph::os::Transaction& t, epoch_t e);
+
seastar::future<bufferlist> load_map(epoch_t e);
+ read_errorator::future<ceph::bufferlist> load_inc_map(epoch_t e);
void store_superblock(ceph::os::Transaction& t,
const OSDSuperblock& sb);
std::map<epoch_t, OSDMap*>&);
private:
static ghobject_t osdmap_oid(epoch_t epoch);
+ static ghobject_t inc_osdmap_oid(epoch_t epoch);
static ghobject_t final_pool_info_oid(int64_t pool);
static ghobject_t superblock_oid();
};
map_bl_cache.insert(e, std::move(bl));
}
+void OSDSingletonState::store_inc_map_bl(
+ ceph::os::Transaction& t,
+ epoch_t e, bufferlist&& bl)
+{
+ meta_coll->store_inc_map(t, e, bl);
+ inc_map_bl_cache.insert(e, std::move(bl));
+}
+
seastar::future<bufferlist> OSDSingletonState::load_map_bl(
epoch_t e)
{
}
}
+read_errorator::future<ceph::bufferlist> OSDSingletonState::load_inc_map_bl(
+ epoch_t e)
+{
+ if (std::optional<bufferlist> found = inc_map_bl_cache.find(e); found) {
+ logger().debug("{} inc map.{} found in cache", __func__, e);
+ return read_errorator::make_ready_future<bufferlist>(*found);
+ } else {
+ logger().debug("{} loading inc map.{} from disk", __func__, e);
+ return meta_coll->load_inc_map(e).safe_then([this, e](auto&& bl) {
+ inc_map_bl_cache.insert(e, bl);
+ return seastar::make_ready_future<bufferlist>(std::move(bl));
+ }, read_errorator::pass_further{});
+ }
+}
+
seastar::future<std::map<epoch_t, bufferlist>> OSDSingletonState::load_map_bls(
epoch_t first,
epoch_t last)
friend class OSD;
using cached_map_t = OSDMapService::cached_map_t;
using local_cached_map_t = OSDMapService::local_cached_map_t;
+ using read_errorator = crimson::os::FuturizedStore::Shard::read_errorator;
public:
OSDSingletonState(
SharedLRU<epoch_t, OSDMap> osdmaps;
SimpleLRU<epoch_t, bufferlist, false> map_bl_cache;
+ SimpleLRU<epoch_t, bufferlist, false> inc_map_bl_cache;
cached_map_t osdmap;
cached_map_t &get_osdmap() { return osdmap; }
seastar::future<std::unique_ptr<OSDMap>> load_map(epoch_t e);
seastar::future<bufferlist> load_map_bl(epoch_t e);
seastar::future<std::map<epoch_t, bufferlist>>
+ read_errorator::future<ceph::bufferlist> load_inc_map_bl(epoch_t e);
load_map_bls(epoch_t first, epoch_t last);
void store_map_bl(ceph::os::Transaction& t,
epoch_t e, bufferlist&& bl);
+ void store_inc_map_bl(ceph::os::Transaction& t,
+ epoch_t e, bufferlist&& bl);
seastar::future<> store_maps(ceph::os::Transaction& t,
epoch_t start, Ref<MOSDMap> m);
void trim_maps(ceph::os::Transaction& t, OSDSuperblock& superblock);