From aeec0c6476986e23b8647d92be689869f2df8d33 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Tue, 3 Sep 2013 14:34:46 -0700 Subject: osd: create a new request_redirect_t We'll use this so that the OSD can tell the Objecter to redirect a request to a different object somewhere else. Signed-off-by: Greg Farnum --- src/osd/osd_types.cc | 35 +++++++++++++++++++++++++++++++++++ src/osd/osd_types.h | 41 +++++++++++++++++++++++++++++++++++++++++ src/test/encoding/types.h | 1 + 3 files changed, 77 insertions(+) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 3451d520ff2..e68c6a14313 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -101,6 +101,41 @@ void object_locator_t::generate_test_instances(list& o) o.push_back(new object_locator_t(12, "n1", "key2")); } +// -- request_redirect_t -- +void request_redirect_t::encode(bufferlist& bl) const +{ + ENCODE_START(1, 1, bl); + ::encode(redirect_locator, bl); + ::encode(redirect_object, bl); + ::encode(osd_instructions, bl); + ENCODE_FINISH(bl); +} + +void request_redirect_t::decode(bufferlist::iterator& bl) +{ + DECODE_START(1, bl); + ::decode(redirect_locator, bl); + ::decode(redirect_object, bl); + ::decode(osd_instructions, bl); + DECODE_FINISH(bl); +} + +void request_redirect_t::dump(Formatter *f) const +{ + f->dump_string("object", redirect_object); + f->open_object_section("locator"); + redirect_locator.dump(f); + f->close_section(); // locator +} + +void request_redirect_t::generate_test_instances(list& o) +{ + object_locator_t loc(1, "redir_obj"); + o.push_back(new request_redirect_t()); + o.push_back(new request_redirect_t(loc, 0)); + o.push_back(new request_redirect_t(loc, "redir_obj")); + o.push_back(new request_redirect_t(loc)); +} // -- pow2_hist_t -- void pow2_hist_t::dump(Formatter *f) const diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 1bdc1e7e28e..b1f7983e586 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -157,6 +157,47 @@ inline ostream& operator<<(ostream& out, const object_locator_t& loc) return out; } +struct request_redirect_t { +private: + object_locator_t redirect_locator; ///< this is authoritative + string redirect_object; ///< If non-empty, the request goes to this object name + bufferlist osd_instructions; ///< a bufferlist for the OSDs, passed but not interpreted by clients + + friend ostream& operator<<(ostream& out, const request_redirect_t& redir); +public: + + request_redirect_t() {} + explicit request_redirect_t(const object_locator_t& orig, int64_t rpool) : + redirect_locator(orig) { redirect_locator.pool = rpool; } + explicit request_redirect_t(const object_locator_t& rloc) : + redirect_locator(rloc) {} + explicit request_redirect_t(const object_locator_t& orig, + const string& robj) : + redirect_locator(orig), redirect_object(robj) {} + + void set_instructions(const bufferlist& bl) { osd_instructions = bl; } + const bufferlist& get_instructions() { return osd_instructions; } + + bool empty() const { return redirect_locator.empty() && + redirect_object.empty(); } + + void combine_with_locator(object_locator_t& orig, string& obj) const { + orig = redirect_locator; + if (!redirect_object.empty()) + obj = redirect_object; + } + + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator& bl); + void dump(Formatter *f) const; + static void generate_test_instances(list& o); +}; +WRITE_CLASS_ENCODER(request_redirect_t) + +inline ostream& operator<<(ostream& out, const request_redirect_t& redir) { + out << "object " << redir.redirect_object << ", locator{" << redir.redirect_locator << "}"; + return out; +} // Internal OSD op flags - set by the OSD based on the op types enum { diff --git a/src/test/encoding/types.h b/src/test/encoding/types.h index a6f7cfb7883..44409ddbc52 100644 --- a/src/test/encoding/types.h +++ b/src/test/encoding/types.h @@ -32,6 +32,7 @@ TYPE(CrushWrapper) #include "osd/osd_types.h" TYPE(osd_reqid_t) TYPE(object_locator_t) +TYPE(request_redirect_t) TYPE(pg_t) TYPE(coll_t) TYPE(pow2_hist_t) -- cgit v1.2.1