summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Farnum <greg@inktank.com>2013-09-03 14:34:46 -0700
committerGreg Farnum <greg@inktank.com>2013-09-10 15:33:48 -0700
commitaeec0c6476986e23b8647d92be689869f2df8d33 (patch)
tree20e63087edff43965c13a921700af98072b0a0ab
parent397b4c209f8cfee6423aeb37e87a4ae5938e3159 (diff)
downloadceph-aeec0c6476986e23b8647d92be689869f2df8d33.tar.gz
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 <greg@inktank.com>
-rw-r--r--src/osd/osd_types.cc35
-rw-r--r--src/osd/osd_types.h41
-rw-r--r--src/test/encoding/types.h1
3 files changed, 77 insertions, 0 deletions
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<object_locator_t*>& 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<request_redirect_t*>& 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<request_redirect_t*>& 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)