From 62c409ed493a7e91bfeb1133967277d26f4998e8 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 21 May 2009 10:41:31 -0700 Subject: [PATCH] class: osd specifies class version when fetching class --- src/common/ClassHandler.cc | 6 +++--- src/common/ClassHandler.h | 6 +++--- src/common/ClassVersion.h | 1 + src/osd/OSD.cc | 10 ++++++---- src/osd/OSD.h | 4 ++-- src/osd/ReplicatedPG.cc | 3 ++- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/common/ClassHandler.cc b/src/common/ClassHandler.cc index 0b6d443cf656f..354ccd721deae 100644 --- a/src/common/ClassHandler.cc +++ b/src/common/ClassHandler.cc @@ -40,7 +40,7 @@ void ClassHandler::load_class(const nstring& cname) } -ClassHandler::ClassData *ClassHandler::get_class(const nstring& cname) +ClassHandler::ClassData *ClassHandler::get_class(const nstring& cname, ClassVersion& version) { ClassData *class_data = &classes[cname]; @@ -60,7 +60,7 @@ ClassHandler::ClassData *ClassHandler::get_class(const nstring& cname) assert(0); } - osd->send_class_request(cname.c_str()); + osd->send_class_request(cname.c_str(), version); return NULL; } @@ -96,7 +96,7 @@ void ClassHandler::handle_class(MClass *m) void ClassHandler::resend_class_requests() { for (map::iterator p = classes.begin(); p != classes.end(); p++) - osd->send_class_request(p->first.c_str()); + osd->send_class_request(p->first.c_str(), p->second.version); } ClassHandler::ClassData *ClassHandler::register_class(const char *cname) diff --git a/src/common/ClassHandler.h b/src/common/ClassHandler.h index 1289ab93780ae..7f04052292462 100644 --- a/src/common/ClassHandler.h +++ b/src/common/ClassHandler.h @@ -37,13 +37,13 @@ public: CLASS_REQUESTED, //CLASS_ERROR } status; - version_t version; + ClassVersion version; ClassImpl impl; void *handle; bool registered; map methods_map; - ClassData() : status(CLASS_UNKNOWN), version(-1), handle(NULL), registered(false) {} + ClassData() : status(CLASS_UNKNOWN), version(), handle(NULL), registered(false) {} ~ClassData() { } ClassMethod *register_method(const char *mname, @@ -57,7 +57,7 @@ public: ClassHandler(OSD *_osd) : osd(_osd) {} - ClassData *get_class(const nstring& cname); + ClassData *get_class(const nstring& cname, ClassVersion& version); void resend_class_requests(); void handle_class(MClass *m); diff --git a/src/common/ClassVersion.h b/src/common/ClassVersion.h index 2734693c048b2..43fa89418ffa5 100644 --- a/src/common/ClassVersion.h +++ b/src/common/ClassVersion.h @@ -28,6 +28,7 @@ public: } const char *str() { return ver.c_str(); }; + bool is_default() { return (ver.length() == 0); } }; WRITE_CLASS_ENCODER(ClassVersion) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 1607e292bddcc..cf33a9e0847b0 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3753,12 +3753,13 @@ void OSD::wait_for_no_ops() // -------------------------------- -int OSD::get_class(const nstring& cname, pg_t pgid, Message *m, ClassHandler::ClassData **cls) +int OSD::get_class(const nstring& cname, ClassVersion& version, pg_t pgid, Message *m, ClassHandler::ClassData **cls) { Mutex::Locker l(class_lock); dout(10) << "wait_for_missing_class '" << cname << "' by " << pgid << dendl; - *cls = class_handler->get_class(cname); + + *cls = class_handler->get_class(cname, version); if (*cls) return 0; @@ -3795,12 +3796,13 @@ void OSD::handle_class(MClass *m) delete m; } -void OSD::send_class_request(const char *cname) +void OSD::send_class_request(const char *cname, ClassVersion& version) { - dout(10) << "send_class_request '" << cname << "'" << dendl; + dout(10) << "send_class_request class=" << cname << " version=" << version << dendl; MClass *m = new MClass(monmap->get_fsid(), 0); ClassInfo info; info.name = cname; + info.version = version; m->info.push_back(info); m->action = CLASS_GET; int mon = monmap->pick_mon(); diff --git a/src/osd/OSD.h b/src/osd/OSD.h index a5f809b9b4a23..52558cdc89947 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -407,11 +407,11 @@ protected: Mutex class_lock; map > > waiting_for_missing_class; - int get_class(const nstring& cname, pg_t pgid, Message *m, ClassHandler::ClassData **cls); + int get_class(const nstring& cname, ClassVersion& version, pg_t pgid, Message *m, ClassHandler::ClassData **cls); void handle_class(MClass *m); public: void got_class(const nstring& cname); - void send_class_request(const char *n); + void send_class_request(const char *n, ClassVersion& version); protected: // -- placement groups -- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index c2c564755b43a..c025b54885595 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -683,7 +683,8 @@ int ReplicatedPG::do_read_ops(ReadOpContext *ctx, //dout(20) << "rdcall param=" << indata.c_str() << dendl; ClassHandler::ClassData *cls; - result = osd->get_class(cname, info.pgid, ctx->op, &cls); + ClassVersion version; + result = osd->get_class(cname, version, info.pgid, ctx->op, &cls); if (result) { dout(10) << "rdcall class " << cname << " does not exist" << dendl; if (result == -EAGAIN) -- 2.39.5