sseq = mds->sessionmap.set_state(session, Session::STATE_OPENING);
mds->sessionmap.touch_session(session);
pv = ++mds->sessionmap.projected;
- mdlog->start_submit_entry(new ESession(m->get_source_inst(), true, pv),
+ mdlog->start_submit_entry(new ESession(m->get_source_inst(), true, pv, m->client_meta),
new C_MDS_session_finish(mds, session, sseq, true, pv));
mdlog->flush();
break;
interval_set<inodeno_t> inos;
version_t inotablev;
+ // Client metadata stored during open
+ std::map<std::string, std::string> client_metadata;
+
public:
ESession() : LogEvent(EVENT_SESSION), open(false) { }
- ESession(const entity_inst_t& inst, bool o, version_t v) :
+ ESession(const entity_inst_t& inst, bool o, version_t v,
+ const std::map<std::string, std::string> &cm) :
LogEvent(EVENT_SESSION),
client_inst(inst),
open(o),
cmapv(v),
- inotablev(0) {
+ inotablev(0),
+ client_metadata(cm) {
}
ESession(const entity_inst_t& inst, bool o, version_t v,
const interval_set<inodeno_t>& i, version_t iv) :
if (open) {
session = mds->sessionmap.get_or_add_session(client_inst);
mds->sessionmap.set_state(session, Session::STATE_OPEN);
+ session->set_client_metadata(client_metadata);
dout(10) << " opened session " << session->info.inst << dendl;
} else {
session = mds->sessionmap.get_session(client_inst.name);
void ESession::encode(bufferlist &bl) const
{
- ENCODE_START(3, 3, bl);
+ ENCODE_START(4, 3, bl);
::encode(stamp, bl);
::encode(client_inst, bl);
::encode(open, bl);
::encode(cmapv, bl);
::encode(inos, bl);
::encode(inotablev, bl);
+ ::encode(client_metadata, bl);
ENCODE_FINISH(bl);
}
void ESession::decode(bufferlist::iterator &bl)
{
- DECODE_START_LEGACY_COMPAT_LEN(3, 3, 3, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(4, 3, 3, bl);
if (struct_v >= 2)
::decode(stamp, bl);
::decode(client_inst, bl);
::decode(cmapv, bl);
::decode(inos, bl);
::decode(inotablev, bl);
+ if (struct_v >= 4) {
+ ::decode(client_metadata, bl);
+ }
DECODE_FINISH(bl);
}
f->dump_int("client map version", cmapv);
f->dump_stream("inos") << inos;
f->dump_int("inotable version", inotablev);
+ f->open_object_section("client_metadata");
+ for (map<string, string>::const_iterator i = client_metadata.begin();
+ i != client_metadata.end(); ++i) {
+ f->dump_string(i->first.c_str(), i->second);
+ }
+ f->close_section(); // client_metadata
}
void ESession::generate_test_instances(list<ESession*>& ls)