diff options
author | Xuehan Xu <xxhdx1985126@163.com> | 2020-03-04 16:45:51 +0800 |
---|---|---|
committer | Xuehan Xu <xxhdx1985126@163.com> | 2020-03-27 11:08:35 +0800 |
commit | 551e663a98eb82435b73e14a7404ab584f39b1b9 (patch) | |
tree | 18fc5e7b0b07521ca01d4fe6ee3a508b46f264f7 /src/crimson/os/cyanstore | |
parent | adbdd753f1d16942b279e5ae0cea01c2efd633f6 (diff) | |
download | ceph-551e663a98eb82435b73e14a7404ab584f39b1b9.tar.gz |
crimson: add necessary FuturizedStore APIs for data recovery
Signed-off-by: Xuehan Xu <xxhdx1985126@163.com>
Diffstat (limited to 'src/crimson/os/cyanstore')
-rw-r--r-- | src/crimson/os/cyanstore/cyan_object.h | 3 | ||||
-rw-r--r-- | src/crimson/os/cyanstore/cyan_store.cc | 89 | ||||
-rw-r--r-- | src/crimson/os/cyanstore/cyan_store.h | 45 |
3 files changed, 137 insertions, 0 deletions
diff --git a/src/crimson/os/cyanstore/cyan_object.h b/src/crimson/os/cyanstore/cyan_object.h index 912629de067..f19b8721280 100644 --- a/src/crimson/os/cyanstore/cyan_object.h +++ b/src/crimson/os/cyanstore/cyan_object.h @@ -1,10 +1,13 @@ // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab +#pragma once + #include <cstddef> #include <map> #include <string> #include <boost/intrusive_ptr.hpp> #include <boost/smart_ptr/intrusive_ref_counter.hpp> + #include "include/buffer.h" namespace crimson::os { diff --git a/src/crimson/os/cyanstore/cyan_store.cc b/src/crimson/os/cyanstore/cyan_store.cc index b08859a4319..efcd6e7a1f2 100644 --- a/src/crimson/os/cyanstore/cyan_store.cc +++ b/src/crimson/os/cyanstore/cyan_store.cc @@ -276,6 +276,20 @@ CyanStore::omap_get_values( true, values); } +seastar::future<ceph::bufferlist> +CyanStore::omap_get_header( + CollectionRef ch, + const ghobject_t& oid + ) { + auto c = static_cast<Collection*>(ch.get()); + auto o = c->get_object(oid); + if (!o) { + throw std::runtime_error(fmt::format("object does not exist: {}", oid)); + } + + return seastar::make_ready_future<ceph::bufferlist>(o->omap_header); +} + seastar::future<> CyanStore::do_transaction(CollectionRef ch, ceph::os::Transaction&& t) { @@ -647,4 +661,79 @@ unsigned CyanStore::get_max_attr_name_length() const // arbitrary limitation exactly like in the case of MemStore. return 256; } + +seastar::future<FuturizedStore::OmapIteratorRef> CyanStore::get_omap_iterator( + CollectionRef ch, + const ghobject_t& oid) +{ + auto c = static_cast<Collection*>(ch.get()); + auto o = c->get_object(oid); + if (!o) { + throw std::runtime_error(fmt::format("object does not exist: {}", oid)); + } + return seastar::make_ready_future<FuturizedStore::OmapIteratorRef>( + new CyanStore::CyanOmapIterator(o)); +} + +seastar::future<std::map<uint64_t, uint64_t>> +CyanStore::fiemap( + CollectionRef ch, + const ghobject_t& oid, + uint64_t off, + uint64_t len) +{ + auto c = static_cast<Collection*>(ch.get()); + + ObjectRef o = c->get_object(oid); + if (!o) { + throw std::runtime_error(fmt::format("object does not exist: {}", oid)); + } + std::map<uint64_t, uint64_t> m{{0, o->get_size()}}; + return seastar::make_ready_future<std::map<uint64_t, uint64_t>>(std::move(m)); +} + +seastar::future<struct stat> +CyanStore::stat( + CollectionRef ch, + const ghobject_t& oid) +{ + auto c = static_cast<Collection*>(ch.get()); + auto o = c->get_object(oid); + if (!o) { + throw std::runtime_error(fmt::format("object does not exist: {}", oid)); + } + struct stat st; + st.st_size = o->get_size(); + return seastar::make_ready_future<struct stat>(std::move(st)); +} + +seastar::future<int> CyanStore::CyanOmapIterator::seek_to_first() +{ + iter = obj->omap.begin(); + return seastar::make_ready_future<int>(0); +} + +seastar::future<int> CyanStore::CyanOmapIterator::upper_bound(const std::string& after) +{ + iter = obj->omap.upper_bound(after); + return seastar::make_ready_future<int>(0); +} + +seastar::future<int> CyanStore::CyanOmapIterator::lower_bound(const std::string &to) +{ + iter = obj->omap.lower_bound(to); + return seastar::make_ready_future<int>(0); +} + +bool CyanStore::CyanOmapIterator::valid() const +{ + return iter != obj->omap.end(); +} + +seastar::future<int> CyanStore::CyanOmapIterator::next() +{ + ++iter; + return seastar::make_ready_future<int>(0); +} + } diff --git a/src/crimson/os/cyanstore/cyan_store.h b/src/crimson/os/cyanstore/cyan_store.h index d1172c679cf..9af1cd640c8 100644 --- a/src/crimson/os/cyanstore/cyan_store.h +++ b/src/crimson/os/cyanstore/cyan_store.h @@ -16,6 +16,7 @@ #include "osd/osd_types.h" #include "include/uuid.h" +#include "crimson/os/cyanstore/cyan_object.h" #include "crimson/os/futurized_store.h" namespace ceph::os { @@ -35,6 +36,34 @@ class CyanStore final : public FuturizedStore { uuid_d osd_fsid; public: + class CyanOmapIterator final : public OmapIterator { + public: + CyanOmapIterator() {} + CyanOmapIterator(ObjectRef obj) : obj(obj) { + iter = obj->omap.begin(); + } + virtual seastar::future<int> seek_to_first(); + virtual seastar::future<int> upper_bound(const std::string &after); + virtual seastar::future<int> lower_bound(const std::string &to); + virtual bool valid() const; + virtual seastar::future<int> next(); + virtual std::string key() { + return iter->first; + } + virtual seastar::future<std::string> tail_key() { + return seastar::make_ready_future<std::string>((++obj->omap.end())->first); + } + virtual ceph::buffer::list value() { + return iter->second; + } + virtual int status() const { + return iter != obj->omap.end() ? 0 : -1; + } + virtual ~CyanOmapIterator() {} + private: + std::map<std::string, bufferlist>::const_iterator iter; + ObjectRef obj; + }; CyanStore(const std::string& path); ~CyanStore() final; @@ -45,6 +74,9 @@ public: seastar::future<> mkfs(uuid_d new_osd_fsid) final; seastar::future<store_statfs_t> stat() const final; + seastar::future<struct stat> stat( + CollectionRef c, + const ghobject_t& oid) final; read_errorator::future<ceph::bufferlist> read( CollectionRef c, @@ -78,6 +110,10 @@ public: const std::optional<std::string> &start ///< [in] start, empty for begin ) final; ///< @return <done, values> values.empty() iff done + seastar::future<ceph::bufferlist> omap_get_header( + CollectionRef c, + const ghobject_t& oid) final; + seastar::future<CollectionRef> create_new_collection(const coll_t& cid) final; seastar::future<CollectionRef> open_collection(const coll_t& cid) final; seastar::future<std::vector<coll_t>> list_collections() final; @@ -91,6 +127,15 @@ public: uuid_d get_fsid() const final; unsigned get_max_attr_name_length() const final; + seastar::future<OmapIteratorRef> get_omap_iterator( + CollectionRef c, + const ghobject_t& oid); + + seastar::future<std::map<uint64_t, uint64_t>> fiemap(CollectionRef c, + const ghobject_t& oid, + uint64_t off, + uint64_t len); + private: int _remove(const coll_t& cid, const ghobject_t& oid); int _touch(const coll_t& cid, const ghobject_t& oid); |