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;
}
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;
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)
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),
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
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; }