]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: Add ENoOp for padding journals
authorJohn Spray <john.spray@inktank.com>
Tue, 25 Mar 2014 13:30:59 +0000 (13:30 +0000)
committerJohn Spray <john.spray@inktank.com>
Sun, 18 May 2014 10:21:29 +0000 (11:21 +0100)
This allows us to implement journal splicing
without moving blocks around, and without modifying
the outer journal syntax.

Signed-off-by: John Spray <john.spray@inktank.com>
src/mds/LogEvent.cc
src/mds/LogEvent.h
src/mds/Makefile.am
src/mds/events/ENoOp.h [new file with mode: 0644]
src/mds/journal.cc

index 93e290a2220dec61ff67bde524588e1a97f16188..c6c9ce725d189529974b273e5964f954aa23248d 100644 (file)
@@ -36,6 +36,8 @@
 #include "events/ETableClient.h"
 #include "events/ETableServer.h"
 
+#include "events/ENoOp.h"
+
 
 LogEvent *LogEvent::decode(bufferlist& bl)
 {
@@ -82,6 +84,7 @@ std::string LogEvent::get_type_str() const
   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;
@@ -90,7 +93,37 @@ std::string LogEvent::get_type_str() const
 }
 
 
-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;
@@ -122,6 +155,8 @@ LogEvent *LogEvent::decode_event(bufferlist& bl, bufferlist::iterator& p, __u32
   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;
index 0c390efd18be6c6339c219a7e2b24e959f3307d5..97a4233da6d24b60ba87169656de9965596b1e9e 100644 (file)
@@ -39,6 +39,7 @@
 #define EVENT_TABLESERVER  43
 
 #define EVENT_SUBTREEMAP_TEST   50
+#define EVENT_NOOP        51
 
 
 #include "include/buffer.h"
index 39f6c4a93c8a7862e450f98f3685257db38bb907..be30eb2c4b8f96e8a456fc16488afcdae2ad3412 100644 (file)
@@ -76,6 +76,7 @@ noinst_HEADERS += \
        mds/events/EImportFinish.h \
        mds/events/EImportStart.h \
        mds/events/EMetaBlob.h \
+       mds/events/ENoOp.h \
        mds/events/EOpen.h \
        mds/events/EResetJournal.h \
        mds/events/ESession.h \
diff --git a/src/mds/events/ENoOp.h b/src/mds/events/ENoOp.h
new file mode 100644 (file)
index 0000000..dfba5c4
--- /dev/null
@@ -0,0 +1,34 @@
+// -*- 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
index 54115090445b11bb1bcfa507eac06d04ee0ea55a..5a160d73d15b93ea9554a1a7cb79d851acf46289 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "events/EMetaBlob.h"
 #include "events/EResetJournal.h"
+#include "events/ENoOp.h"
 
 #include "events/EUpdate.h"
 #include "events/ESlaveUpdate.h"
@@ -2921,3 +2922,30 @@ void EResetJournal::replay(MDS *mds)
   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;
+}