From: Sage Weil Date: Wed, 2 Jul 2008 18:06:44 +0000 (-0700) Subject: mds: ESnap, SnapInfo X-Git-Tag: v0.4~496 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=33c2ae066e0fb9317e1a2a983f32932d422cbd1e;p=ceph.git mds: ESnap, SnapInfo --- diff --git a/src/mds/LogEvent.cc b/src/mds/LogEvent.cc index 24920369d77..de9c3ede1be 100644 --- a/src/mds/LogEvent.cc +++ b/src/mds/LogEvent.cc @@ -38,6 +38,7 @@ #include "events/EAnchor.h" #include "events/EAnchorClient.h" +#include "events/ESnap.h" LogEvent *LogEvent::decode(bufferlist& bl) @@ -75,6 +76,9 @@ LogEvent *LogEvent::decode(bufferlist& bl) case EVENT_ANCHOR: le = new EAnchor; break; case EVENT_ANCHORCLIENT: le = new EAnchorClient; break; + + case EVENT_SNAP: le = new ESnap; break; + default: generic_dout(1) << "uh oh, unknown log event type " << type << dendl; assert(0); diff --git a/src/mds/LogEvent.h b/src/mds/LogEvent.h index 1b04d805d85..b812493a4d2 100644 --- a/src/mds/LogEvent.h +++ b/src/mds/LogEvent.h @@ -36,6 +36,7 @@ #define EVENT_ANCHOR 40 #define EVENT_ANCHORCLIENT 41 +#define EVENT_SNAP 50 diff --git a/src/mds/LogSegment.h b/src/mds/LogSegment.h index b2774c8d317..652b24ae2ee 100644 --- a/src/mds/LogSegment.h +++ b/src/mds/LogSegment.h @@ -60,13 +60,14 @@ class LogSegment { version_t allocv; version_t sessionmapv; version_t anchortablev; + version_t snaptablev; // try to expire C_Gather *try_to_expire(MDS *mds); // cons LogSegment(loff_t off) : offset(off), end(off), num_events(0), trimmable_at(0), - allocv(0), sessionmapv(0), anchortablev(0) + allocv(0), sessionmapv(0), anchortablev(0), snaptablev(0) { } }; diff --git a/src/mds/SnapTable.cc b/src/mds/SnapTable.cc index fdb840956d4..5481ca8efbe 100644 --- a/src/mds/SnapTable.cc +++ b/src/mds/SnapTable.cc @@ -39,6 +39,7 @@ snapid_t SnapTable::create(inodeno_t base, const string& name, utime_t stamp) assert(is_active()); snapid_t sn = ++last_snap; + snaps[sn].snapid = sn; snaps[sn].base = base; snaps[sn].name = name; snaps[sn].stamp = stamp; diff --git a/src/mds/SnapTable.h b/src/mds/SnapTable.h index 6cbbe0c7e74..bd7cf78302c 100644 --- a/src/mds/SnapTable.h +++ b/src/mds/SnapTable.h @@ -18,32 +18,16 @@ #include "MDSTable.h" #include "include/interval_set.h" +#include "snap.h" class MDS; class SnapTable : public MDSTable { public: - struct snapinfo { - inodeno_t base; - utime_t stamp; - string name; - - void encode(bufferlist& bl) const { - ::encode(base, bl); - ::encode(stamp, bl); - ::encode(name, bl); - } - void decode(bufferlist::iterator& bl) { - ::decode(base, bl); - ::decode(stamp, bl); - ::decode(name, bl); - } - }; - WRITE_CLASS_ENCODER(snapinfo) protected: snapid_t last_snap; - map snaps; + map snaps; set pending_removal; public: @@ -66,6 +50,5 @@ public: ::decode(pending_removal, bl); } }; -WRITE_CLASS_ENCODER(SnapTable::snapinfo) #endif diff --git a/src/mds/events/ESnap.h b/src/mds/events/ESnap.h new file mode 100644 index 00000000000..5115a7252b4 --- /dev/null +++ b/src/mds/events/ESnap.h @@ -0,0 +1,58 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2004-2006 Sage Weil + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#ifndef __MDS_ESNAP_H +#define __MDS_ESNAP_H + +#include +#include "config.h" +#include "include/types.h" + +#include "../LogEvent.h" +#include "../snap.h" + +class ESnap : public LogEvent { +protected: + bool create; + SnapInfo snap; + version_t version; // table version + + public: + ESnap() : LogEvent(EVENT_SNAP) { } + ESnap(bool c, SnapInfo &sn, version_t v) : + LogEvent(EVENT_SNAP), + create(c), snap(sn), version(v) { } + + void encode(bufferlist& bl) const { + ::encode(create, bl); + ::encode(snap, bl); + ::encode(version, bl); + } + void decode(bufferlist::iterator &bl) { + ::decode(create, bl); + ::decode(snap, bl); + ::decode(version, bl); + } + + void print(ostream& out) { + out << "ESnap " << (create ? "create":"remove") + << " " << snap + << " v " << version; + } + + void update_segment(); + void replay(MDS *mds); +}; + +#endif diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 06e7432f6da..62c0ce037ac 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -34,6 +34,8 @@ #include "events/EAnchor.h" #include "events/EAnchorClient.h" +#include "events/ESnap.h" + #include "LogSegment.h" #include "MDS.h" @@ -44,6 +46,8 @@ #include "AnchorTable.h" #include "AnchorClient.h" #include "IdAllocator.h" +#include "SnapTable.h" + #include "Locker.h" @@ -203,6 +207,13 @@ C_Gather *LogSegment::try_to_expire(MDS *mds) mds->anchortable->save(gather->new_sub()); } + // snaptable + if (snaptablev > mds->snaptable->get_committed_version()) { + dout(10) << "try_to_expire waiting for snap table to save, need " << snaptablev << dendl; + if (!gather) gather = new C_Gather; + mds->snaptable->save(gather->new_sub()); + } + // FIXME client requests...? // audit handling of anchor transactions? @@ -559,32 +570,33 @@ void EAnchor::replay(MDS *mds) if (mds->anchortable->get_version() >= version) { dout(10) << "EAnchor.replay event " << version << " <= table " << mds->anchortable->get_version() << dendl; - } else { - dout(10) << " EAnchor.replay event " << version - << " - 1 == table " << mds->anchortable->get_version() << dendl; - assert(version-1 == mds->anchortable->get_version()); - - switch (op) { - // anchortable - case ANCHOR_OP_CREATE_PREPARE: - mds->anchortable->create_prepare(ino, trace, reqmds); - break; - case ANCHOR_OP_DESTROY_PREPARE: - mds->anchortable->destroy_prepare(ino, reqmds); - break; - case ANCHOR_OP_UPDATE_PREPARE: - mds->anchortable->update_prepare(ino, trace, reqmds); - break; - case ANCHOR_OP_COMMIT: - mds->anchortable->commit(atid); - break; - - default: - assert(0); - } + return; + } + + dout(10) << " EAnchor.replay event " << version + << " - 1 == table " << mds->anchortable->get_version() << dendl; + assert(version-1 == mds->anchortable->get_version()); + + switch (op) { + // anchortable + case ANCHOR_OP_CREATE_PREPARE: + mds->anchortable->create_prepare(ino, trace, reqmds); + break; + case ANCHOR_OP_DESTROY_PREPARE: + mds->anchortable->destroy_prepare(ino, reqmds); + break; + case ANCHOR_OP_UPDATE_PREPARE: + mds->anchortable->update_prepare(ino, trace, reqmds); + break; + case ANCHOR_OP_COMMIT: + mds->anchortable->commit(atid); + break; - assert(version == mds->anchortable->get_version()); + default: + assert(0); } + + assert(version == mds->anchortable->get_version()); } @@ -606,6 +618,38 @@ void EAnchorClient::replay(MDS *mds) } +// ----------------------- +// ESnap + +void ESnap::update_segment() +{ + _segment->snaptablev = version; +} + +void ESnap::replay(MDS *mds) +{ + if (mds->snaptable->get_version() >= version) { + dout(10) << "ESnap.replay event " << version + << " <= table " << mds->snaptable->get_version() << dendl; + return; + } + + dout(10) << " ESnap.replay event " << version + << " - 1 == table " << mds->snaptable->get_version() << dendl; + assert(version-1 == mds->snaptable->get_version()); + + if (create) { + snapid_t s = mds->snaptable->create(snap.base, snap.name, snap.stamp); + assert(s == snap.snapid); + } else { + mds->snaptable->remove(snap.snapid); + } + + assert(version == mds->snaptable->get_version()); +} + + + // ----------------------- // EUpdate diff --git a/src/mds/snap.h b/src/mds/snap.h new file mode 100644 index 00000000000..cf446d14bc3 --- /dev/null +++ b/src/mds/snap.h @@ -0,0 +1,43 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2004-2006 Sage Weil + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#ifndef __CEPH_MDS_SNAP_H +#define __CEPH_MDS_SNAP_H + +struct SnapInfo { + snapid_t snapid; + inodeno_t base; + utime_t stamp; + string name; + + void encode(bufferlist& bl) const { + ::encode(snapid, bl); + ::encode(base, bl); + ::encode(stamp, bl); + ::encode(name, bl); + } + void decode(bufferlist::iterator& bl) { + ::decode(snapid, bl); + ::decode(base, bl); + ::decode(stamp, bl); + ::decode(name, bl); + } +}; +WRITE_CLASS_ENCODER(SnapInfo) + +inline ostream& operator<<(ostream& out, const SnapInfo &sn) { + return out << "snap(" << sn.snapid << " " << sn.base << " '" << sn.name << "' " << sn.stamp << ")"; +} + +#endif