#include "events/ETableClient.h"
#include "events/ETableServer.h"
+#include "events/ENoOp.h"
+
LogEvent *LogEvent::decode(bufferlist& bl)
{
case EVENT_COMMITTED: return "COMMITTED";
case EVENT_TABLECLIENT: return "TABLECLIENT";
case EVENT_TABLESERVER: return "TABLESERVER";
+ case EVENT_NOOP: return "NOOP";
default:
generic_dout(0) << "get_type_str: unknown type " << _type << dendl;
}
-LogEvent *LogEvent::decode_event(bufferlist& bl, bufferlist::iterator& p, __u32 type)
+/*
+ * Resolve type string to type enum
+ *
+ * Return -1 if not found
+ */
+LogEvent::EventType LogEvent::str_to_type(std::string const &str)
+{
+ std::map<std::string, EventType> types;
+ types["SUBTREEMAP"] = EVENT_SUBTREEMAP;
+ types["SUBTREEMAP_TEST"] = EVENT_SUBTREEMAP_TEST;
+ types["EXPORT"] = EVENT_EXPORT;
+ types["IMPORTSTART"] = EVENT_IMPORTSTART;
+ types["IMPORTFINISH"] = EVENT_IMPORTFINISH;
+ types["FRAGMENT"] = EVENT_FRAGMENT;
+ types["RESETJOURNAL"] = EVENT_RESETJOURNAL;
+ types["SESSION"] = EVENT_SESSION;
+ types["SESSIONS_OLD"] = EVENT_SESSIONS_OLD;
+ types["SESSIONS"] = EVENT_SESSIONS;
+ types["UPDATE"] = EVENT_UPDATE;
+ types["SLAVEUPDATE"] = EVENT_SLAVEUPDATE;
+ types["OPEN"] = EVENT_OPEN;
+ types["COMMITTED"] = EVENT_COMMITTED;
+ types["TABLECLIENT"] = EVENT_TABLECLIENT;
+ types["TABLESERVER"] = EVENT_TABLESERVER;
+ types["NOOP"] = EVENT_NOOP;
+
+ return types[str];
+}
+
+
+LogEvent *LogEvent::decode_event(bufferlist& bl, bufferlist::iterator& p, LogEvent::EventType type)
{
int length = bl.length() - p.get_off();
generic_dout(15) << "decode_log_event type " << type << ", size " << length << dendl;
case EVENT_TABLECLIENT: le = new ETableClient; break;
case EVENT_TABLESERVER: le = new ETableServer; break;
+ case EVENT_NOOP: le = new ENoOp; break;
+
default:
generic_dout(0) << "uh oh, unknown log event type " << type << " length " << length << dendl;
return NULL;
--- /dev/null
+// -*- 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 <sage@newdream.net>
+ *
+ * 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_ENOOP_H
+#define CEPH_MDS_ENOOP_H
+
+#include "../LogEvent.h"
+
+class ENoOp : public LogEvent {
+ uint32_t size;
+
+public:
+ ENoOp() : LogEvent(EVENT_NOOP), size(0) { }
+ ENoOp(uint32_t size_) : LogEvent(EVENT_NOOP), size(size){ }
+
+ void encode(bufferlist& bl) const;
+ void decode(bufferlist::iterator& bl);
+ void dump(Formatter *f) const {}
+
+ void replay(MDS *mds);
+};
+
+#endif
#include "events/EMetaBlob.h"
#include "events/EResetJournal.h"
+#include "events/ENoOp.h"
#include "events/EUpdate.h"
#include "events/ESlaveUpdate.h"
mds->mdcache->show_subtrees();
}
+
+void ENoOp::encode(bufferlist &bl) const
+{
+ ::encode(size, bl);
+ uint32_t const pad_bytes = size - sizeof(size);
+ uint32_t const pad = 0xdeadbeef;
+ for (unsigned int i = 0; i < pad_bytes / sizeof(uint32_t); ++i) {
+ ::encode(pad, bl);
+ }
+}
+
+
+void ENoOp::decode(bufferlist::iterator &bl)
+{
+ ::decode(size, bl);
+ if (bl.get_remaining() != (size - sizeof(size))) {
+ // This is spiritually an assertion, but expressing in a way that will let
+ // journal debug tools catch it and recognise a malformed entry.
+ throw buffer::end_of_buffer();
+ }
+}
+
+
+void ENoOp::replay(MDS *mds)
+{
+ dout(4) << "ENoOp::replay, " << size << " bytes skipped in journal" << dendl;
+}