]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
journaler: fix replay
authorSage Weil <sage@newdream.net>
Mon, 11 May 2009 18:51:21 +0000 (11:51 -0700)
committerSage Weil <sage@newdream.net>
Mon, 11 May 2009 20:09:22 +0000 (13:09 -0700)
Broken by commit 497ade3b90.

Use objecter to write header (not just to read it).

Also reset the prefetch values each time the layout is set.

src/osdc/Journaler.cc
src/osdc/Journaler.h

index d1877ea8c8c921b1b258dd2b113da48929c860a4..52726f2a337b1d11964c0552e9c9ed4f20c3b04f 100644 (file)
@@ -31,14 +31,25 @@ void Journaler::create(ceph_file_layout *l)
   dout(1) << "create blank journal" << dendl;
   state = STATE_ACTIVE;
 
+  set_layout(l);
+
+  write_pos = flush_pos = ack_pos = safe_pos =
+    read_pos = requested_pos = received_pos =
+    expire_pos = trimming_pos = trimmed_pos = ceph_file_layout_period(layout);
+}
+
+void Journaler::set_layout(ceph_file_layout *l)
+{
   layout = *l;
+
   assert(layout.fl_pg_pool == pg_pool);
   last_written.layout = layout;
   last_committed.layout = layout;
 
-  write_pos = flush_pos = ack_pos = safe_pos =
-    read_pos = requested_pos = received_pos =
-    expire_pos = trimming_pos = trimmed_pos = ceph_file_layout_period(layout);
+  // prefetch intelligently.
+  // (watch out, this is big if you use big objects or weird striping)
+  fetch_len = ceph_file_layout_period(layout) * g_conf.journaler_prefetch_periods;
+  prefetch_from = fetch_len / 2;
 }
 
 
@@ -122,7 +133,8 @@ void Journaler::_finish_read_head(int r, bufferlist& bl)
     return;
   }
 
-  layout = h.layout;
+  set_layout(&h.layout);
+
   write_pos = flush_pos = ack_pos = safe_pos = h.write_pos;
   read_pos = requested_pos = received_pos = h.read_pos;
   expire_pos = h.expire_pos;
@@ -191,10 +203,12 @@ void Journaler::write_head(Context *oncommit)
   bufferlist bl;
   ::encode(last_written, bl);
   SnapContext snapc;
-  filer.write(ino, &layout, snapc,
-             0, bl.length(), bl, g_clock.now(), CEPH_OSD_FLAG_INCLOCK_FAIL,
-             NULL, 
-             new C_WriteHead(this, last_written, oncommit));
+  
+  object_t oid(ino, 0);
+  ceph_object_layout ol = objecter->osdmap->make_object_layout(oid, pg_pool);
+  objecter->write_full(oid, ol, snapc, bl, g_clock.now(), 0, 
+                      NULL, 
+                      new C_WriteHead(this, last_written, oncommit));
 }
 
 void Journaler::_finish_write_head(Header &wrote, Context *oncommit)
index 413f5bc1999a37339063a81449c9dba751ca4304..55ec312233c3f480d0f3d4387943b8b7cfdefc66 100644 (file)
@@ -201,7 +201,7 @@ public:
   friend class C_Trim;
 
 public:
-  Journaler(inodeno_t ino_, int pool, const char *mag, Objecter *obj, Logger *l, int lkey, Mutex *lk, __s64 fl=0, __s64 pff=0) : 
+  Journaler(inodeno_t ino_, int pool, const char *mag, Objecter *obj, Logger *l, int lkey, Mutex *lk) : 
     last_written(mag), last_committed(mag),
     ino(ino_), pg_pool(pool), magic(mag),
     objecter(obj), filer(objecter), logger(l), logger_key_lat(lkey),
@@ -209,16 +209,10 @@ public:
     state(STATE_UNDEF), error(0),
     write_pos(0), flush_pos(0), ack_pos(0), safe_pos(0),
     read_pos(0), requested_pos(0), received_pos(0),
-    fetch_len(fl), prefetch_from(pff),
+    fetch_len(0), prefetch_from(0),
     read_bl(0), on_read_finish(0), on_readable(0),
     expire_pos(0), trimming_pos(0), trimmed_pos(0) 
   {
-    // prefetch intelligently.
-    // (watch out, this is big if you use big objects or weird striping)
-    if (!fetch_len)
-      fetch_len = ceph_file_layout_period(layout) * g_conf.journaler_prefetch_periods;
-    if (!prefetch_from)
-      prefetch_from = fetch_len / 2;
   }
 
   // me
@@ -234,6 +228,8 @@ public:
   void recover(Context *onfinish);
   void write_head(Context *onsave=0);
 
+  void set_layout(ceph_file_layout *l);
+
   bool is_active() { return state == STATE_ACTIVE; }
   int get_error() { return error; }